12.4.高级主题 ============= 可以在 `linux(4) `__ 中找到所有与 Linux 有关的 `sysctl(8) `__ 变量的清单。 一些应用程序要求挂载特定的文件系统。 这通常由 **/etc/rc.d/linux** 脚本处理,但可以通过执行以下命令在开机时禁用这个脚本: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session sysrc linux_mounts_enable="NO" 由 rc 脚本挂载的文件系统对 chroot 或 jail 内的 Linux 进程不起作用;如果需要,在 **/etc/fstab** 中配置它们: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session devfs /compat/linux/dev devfs rw,late 0 0 tmpfs /compat/linux/dev/shm tmpfs rw,late,size=1g,mode=1777 0 0 fdescfs /compat/linux/dev/fd fdescfs rw,late,linrdlnk 0 0 linprocfs /compat/linux/proc linprocfs rw,late 0 0 linsysfs /compat/linux/sys linsysfs rw,late 0 0 由于 Linux 二进制兼容层已经获得了对运行 32 位和 64 位 Linux 二进制文件的支持,因此不再可能将仿真功能静态地链接到一个定制内核中。 12.4.1.手动安装附加库 --------------------- **注意** 对于用 `debootstrap(8) `__ 创建的基本系统子目录,参考上述说明。 如果一个 Linux 应用程序在配置了 Linux 二进制兼容层后抱怨缺少共享库,请确定 Linux 二进制需要哪些共享库,并手动安装它们。 在使用相同 CPU 架构的 Linux 系统中,可以用 ``ldd`` 来确定应用程序需要哪些共享库。 例如,要检查 ``linuxdoom`` 需要哪些共享库,可以从安装了 Doom 的 Linux 系统上运行这个命令: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session % ldd linuxdoom 输出应该和下面类似: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session libXt.so.3 (DLL Jump 3.1) => /usr/X11/lib/libXt.so.3.1.0 libX11.so.3 (DLL Jump 3.1) => /usr/X11/lib/libX11.so.3.1.0 libc.so.4 (DLL Jump 4.5pl26) => /lib/libc.so.4.6.29 然后,将 Linux 系统输出的最后一列中的所有文件复制到 FreeBSD 系统的 **/compat/linux** 中。复制完毕后,为第一列中的名字创建符号链接。 这个例子将使得在 FreeBSD 系统上出现以下文件: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session /compat/linux/usr/X11/lib/libXt.so.3.1.0 /compat/linux/usr/X11/lib/libXt.so.3 -> libXt.so.3.1.0 /compat/linux/usr/X11/lib/libX11.so.3.1.0 /compat/linux/usr/X11/lib/libX11.so.3 -> libX11.so.3.1.0 /compat/linux/lib/libc.so.4.6.29 /compat/linux/lib/libc.so.4 -> libc.so.4.6.29 如果 Linux 共享库已经存在,其主要修订号与 ``ldd`` 输出的第一列相匹配,则不需要将其复制到最后一列命名的文件中,因为现有的库应该可以工作。建议复制新版本的共享库。旧的可以删除——只要符号链接指向新的共享库。 例如,这些库已经存在于 FreeBSD 系统中: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session /compat/linux/lib/libc.so.4.6.27 /compat/linux/lib/libc.so.4 -> libc.so.4.6.27 ``ldd`` 表示一个二进制文件需要一个更高的版本: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session libc.so.4 (DLL Jump 4.5pl26) -> libc.so.4.6.29 由于现有库的最后一位数字只差了一两个版本,所以程序应该仍然可以使用稍旧的版本。然而,用较新的版本替换现有的 **libc.so** 是稳妥的。 .. raw:: latex \diilbookstyleinputcell .. code:: shell-session /compat/linux/lib/libc.so.4.6.29 /compat/linux/lib/libc.so.4 -> libc.so.4.6.29 一般来说,只有在 FreeBSD 上安装 Linux 程序的前几次,才需要寻找 Linux 二进制文件所依赖的共享库。一段时间后,系统中就会有足够的 Linux 共享库,从而能够运行新安装的 Linux 二进制文件,而不需要任何额外的工作。 12.4.2.Linux ELF 二进制文件的 brand ----------------------------------- FreeBSD 内核使用几种方法来确定要执行的二进制文件是否是 Linux 的:它检查 ELF 文件头中的 brand,寻找已知的 ELF 解释器路径,并检查 ELF 注释;最后,默认情况下,无 brand 的 ELF 可执行文件被假定为 Linux。 如果所有这些方法都失败了,试图执行该二进制文件可能会导致错误信息: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session % ./my-linux-elf-binary 输出结果应类似于下面的内容: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session ELF binary type not known Abort 为了帮助 FreeBSD 内核区分 FreeBSD ELF 二进制文件和 Linux 二进制文件,可以使用 `brandelf(1) `__\ : .. raw:: latex \diilbookstyleinputcell .. code:: shell-session % brandelf -t Linux my-linux-elf-binary 12.4.3.安装基于 RPM 的 Linux 应用程序 ------------------------------------- 要安装基于 RPM 的 Linux 应用程序,首先要安装软件包或 port `archivers/rpm4 `__\ 。安装完毕后,\ ``root`` 用户可以执行这个命令来安装 **.rpm**\ : .. raw:: latex \diilbookstyleinputcell .. code:: shell-session # cd /compat/linux # rpm2cpio < /path/to/linux.archive.rpm | cpio -id 如果有必要,使用 ``brandelf`` 处理已安装的 ELF 二进制文件。请注意,这将妨碍卸载的彻底性。 12.4.4.配置主机名解析器 ----------------------- 如果 DNS 不工作或出现这个错误: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session resolv+: "bind" is an invalid keyword resolv+: "hosts" is an invalid keyword 配置 **/compat/linux/etc/host.conf** 如下: .. raw:: latex \diilbookstyleinputcell .. code:: shell-session order hosts, bind multi on 这规定了首先搜索 **/etc/hosts**\ ,再搜索 DNS。当 **/compat/linux/etc/host.conf** 不存在时,Linux 软件使用主机上的 **/etc/host.conf** 文件并抱怨 FreeBSD 缺少该文件。如果没有使用 **/etc/resolv.conf** 配置域名服务器,则卸载 ``bind``\ 。 12.4.5.补充说明 --------------- 关于如何与 Linux® 进行二进制兼容的更多信息,可以在 `FreeBSD 的 Linux 仿真 `__\ 这篇文章中找到。