39、如何在 FreeBSD 上模拟 Linux 的环境?
最新最完整的资料在官方的 Handbook 上。
简单来说,FreeBSD 核心必须支援,且必须安装 Linux Runtime Libraries,最後做一些设定。
如果要执行 Linux ELF Binaries,可以先查询目前 FreeBSD 是否已经支援 Linux ELF。
代码:
brandelf -l
看是否有 Linux 的字样,如果没的话,请回头检查是否哪一步骤没有做到。
然後检查执行档是否为 Linux ELF Binaries。
代码:
brandelf execution-binary-filename
如果是 Linux ELF Binaries,则正常执行即可。
如果显示结果不是 Linux ELF Binaries,但是自己确定是 Linux ELF Binaries的话,则只要更改一下 ELF 的格式即可。
brandelf -t Linux execution-binary-filename
然後再检查一次是否已经修正为正确的格式。
40、如何在 FreeBSD 上安装 Linux rpm?
请确定已经成功在 FreeBSD 上模拟 Linux 的环境,请叁考 FAQ 39。
安装 rpm 的方式如下:
代码:
rpm --ignoreos --root /compat/linux --dbpath /var/lib/rpm/ -Uvh xxx.rpm
41、安装 ports 时,原本应该出现的清单选项不见了
这是由於系统会纪录曾安装过 ports 的当时所选择的清单选项,因此有时会因为安装时出了问题,或是再一次安装时,就不会出现清单可以选择。如何让清单选项重新出现呢?
代码:
make clean
make showconfig # 显示设定的内容
make rmconfig # 清除设定的内容
make config
之前设定 ports 的选项预设会纪录在 /var/db/ports/{ports_name}/options 内
容中。如要查看之前 Python 有选择的清单选项:
代码:
cat /var/db/ports/python/options
42、如何检查是否有安装重覆的 ports/packages?
随着时间的演进,不同时间安装的软体会有不同版本的释出,而且不同软体相依的版本号也不同,所以往往会造成同一个软体安装过多版本的情形发生。
这里我必须声明的是,虽然套件名称相同,可是可能没办法上下相容,因此造成有些软体必须依赖比较旧的版本,而有些软体必须依赖比较新的版本,如果有这种情形发生的话,那麽二个版本的存在是正常的。
否则的话,我们会建议移除旧版的套件,将所有相依於此套件改为相依於新版的。也就是说,移除旧版的套件,然後将原本相依於旧版的套件,改为相依於新版的套件。注意,我强调的是新旧版套件是相容的。因为这种做法有点危险,因此不提供做法,请使用更高阶的套件管理工具,如 portupgrade 来完成。
检查是否有安装重覆的 ports/packages 的方法如下:
代码:
pkg_info | sort | sed -e 's/-[0-9].*$//' | uniq -c | grep -v '^[[:space:]]*1'
如果有一行是显示" 3 libtool",则表示目前系统有安装三种不同版本的libtool套件。
接下来可以检查这三种版本是否可以相容:
代码:
cd /usr/ports/
make search name=libtool
如果发现分别有三种 ports 来代表这三种不同版本的 libtool,就表示他们彼此不相容,必须保留三者,否则可能会发生相依问题。假设如下:
代码:
/usr/ports/devel/libtool13
/usr/ports/devel/libtool14
/usr/ports/devel/libtool15
反之,如果发现只有一种 ports 来代表这种不同版本的套件,则表示目前系统安装的三种版本是相容的,只要修改原本相容於其它二种版本所有的套件,并指向欲保留的那个版本,然後移除其它二种即可。如发现系统目前有安装三种不同版
本的 gettext:
代码:
cd /usr/ports/
make search name=gettext
然後检查的结果如下:
代码:
/usr/ports/devel/gettext
则将所有相依於 gettext 旧版本的其它套件都改为相依於新版的 gettext,然後再移除系统中旧版的 gettext 即可。
43、`make deinstall' 与 `pkg_delete' 有什麽不同?
简单来说,`make deinstall' 会移除该 port,并且不会叁照其相依/相关的 ports。
`pkg_delete' 在移除该 port 前,会叁照其相依/相关的 ports,并且 `pkg_delete'
有支援 wild card,如要移除所有 p 开头的 ports,则:
代码:
cd /var/db/pkg/
pkg_delete p*
要注意的是,如果使用 `make deinstall',则最好确定系统目前所安装的版本,与 ports collection 中显示的版本符合,否则有可能会出现非预期性错误;而 `pkg_delete' 是因为直接删除系统中所安装的版本,所以没有此问题。
因此,换句话说,当系统所安装的版本符合 ports collections 中的版本,则可以使用 `make deinstall' 或`pkg_delete',否则的话最好用 `pkg_delete'。
与 `make deinstall' 相关的资讯:FAQ 11、FAQ 12及FAQ 13。
与 `pkg_delete' 相关的资讯:FAQ 11、FAQ 12及FAQ 15。
44、安装 ports 出现 local modification time does not match remote 的错误讯息
这通常表示你已经下载了这个档案在 /usr/ports/distfiles 的对应目录中,但是它并不是 port collections 所期望下载的。通常的解决方法是在 /usr/ports/distfiles 的对应目录中移除此档案,再重新抓取。
例如是安装 joe 时出现如下的错误讯息:
fetch: joe2.8.tar.Z: local modification time does not match remote
则将 joe2.8.tar.Z 於 /usr/ports/distfiles 中移除:
代码:
cd /usr/ports/editors/joe/
make distclean
最後再重新安装即可