12.4.高级主题¶
可以在 linux(4) 中找到所有与 Linux 有关的 sysctl(8) 变量的清单。
一些应用程序要求挂载特定的文件系统。
这通常由 /etc/rc.d/linux 脚本处理,但可以通过执行以下命令在开机时禁用这个脚本:
sysrc linux_mounts_enable="NO"
由 rc 脚本挂载的文件系统对 chroot 或 jail 内的 Linux 进程不起作用;如果需要,在 /etc/fstab 中配置它们:
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 系统上运行这个命令:
% ldd linuxdoom
输出应该和下面类似:
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 系统上出现以下文件:
/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 系统中:
/compat/linux/lib/libc.so.4.6.27
/compat/linux/lib/libc.so.4 -> libc.so.4.6.27
ldd
表示一个二进制文件需要一个更高的版本:
libc.so.4 (DLL Jump 4.5pl26) -> libc.so.4.6.29
由于现有库的最后一位数字只差了一两个版本,所以程序应该仍然可以使用稍旧的版本。然而,用较新的版本替换现有的 libc.so 是稳妥的。
/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。
如果所有这些方法都失败了,试图执行该二进制文件可能会导致错误信息:
% ./my-linux-elf-binary
输出结果应类似于下面的内容:
ELF binary type not known
Abort
为了帮助 FreeBSD 内核区分 FreeBSD ELF 二进制文件和 Linux 二进制文件,可以使用 brandelf(1):
% brandelf -t Linux my-linux-elf-binary
12.4.3.安装基于 RPM 的 Linux 应用程序¶
要安装基于 RPM 的 Linux 应用程序,首先要安装软件包或 port archivers/rpm4。安装完毕后,root
用户可以执行这个命令来安装 .rpm:
# cd /compat/linux
# rpm2cpio < /path/to/linux.archive.rpm | cpio -id
如果有必要,使用 brandelf
处理已安装的 ELF 二进制文件。请注意,这将妨碍卸载的彻底性。
12.4.4.配置主机名解析器¶
如果 DNS 不工作或出现这个错误:
resolv+: "bind" is an invalid keyword resolv+:
"hosts" is an invalid keyword
配置 /compat/linux/etc/host.conf 如下:
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 仿真这篇文章中找到。