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 仿真这篇文章中找到。