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

如果已经存在具有与 ldd 输出的第一列相匹配的主要修订号的 Linux 共享库,则不需要将其复制到最后一列中的文件中,因为现有库应该可以正常工作。但是,如果它是一个更新版本,则建议复制共享库。只要符号链接指向新版本,就可以删除旧版本。

例如,这些库已经存在于 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

由于现有库在最后一个数字中只过时了一到两个版本,因此该程序应该仍然可以使用略旧的版本。但是,如果是新版本,建议复制共享库。只要符号链接指向新版本,就可以删除旧版本。

例如,这将在 FreeBSD 系统上产生以下文件:

/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 二进制文件

FreeBSD 内核使用多种方法来确定要执行的二进制文件是否是 Linux 二进制文件:它检查 ELF 文件头中的品牌,查找已知的 ELF 解释器路径并检查 ELF 注释;最后,默认情况下,未标记化的 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. 安装基于 Linux RPM 的应用程序

要安装基于 Linux RPM 的应用程序,首先安装软件包或 Port archivers/rpm4 。安装后,root 可以使用以下命令安装 .rpm

# cd /compat/linux
# rpm2cpio < /path/to/linux.archive.rpm | cpio -id

如果需要,对安装的 ELF 二进制文件进行 brandelf。请注意,这将阻止彻底卸载。

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 仿真

最后更新于

FreeBSD 中文社区