第十二章 Linux二进制兼容性

第十二章 Linux二进制兼容性12.1. 简介12.2. 配置Linux二进制兼容性12.3. Linux用户区12.3.1. FreeBSD包中的Rocky Linux基础系统12.3.2. FreeBSD包中的CentOS基础系统12.3.3. 带有debootstrap的Debian/Ubuntu基础系统12.4. 高级主题12.4.1. 手动安装其他库12.4.2. Linux ELF二进制文件品牌化12.4.3. 安装基于Linux RPM的应用程序12.4.4. 配置主机名解析程序12.4.5. 杂项

12.1. 简介

FreeBSD提供与Linux®(通常称为Linuxulator)的可选二进制兼容性,允许用户安装和运行未经修改的Linux二进制文件。它适用于x86(32位和64位)和AArch64架构。一些Linux特定的操作系统功能尚未得到支持;这主要发生在特定于硬件或与系统管理相关的功能上,如cgroups或命名空间。

在阅读本章之前,您应该:

阅读本章后,你会知道:

12.2. 配置Linux二进制兼容性

默认情况下,未启用 linux(4) 二进制兼容性。

要在启动时启用Linux ABI,请执行以下命令:

启用后,可以通过执行以下命令在不重新启动的情况下启动它:

这足以使静态链接的Linux二进制文件工作。

Linux服务将加载必要的内核模块,并在 /compat/Linux 下挂载Linux应用程序所需的文件系统。它们可以以与原生FreeBSD二进制文件相同的方式启动;它们的行为几乎与本机进程完全相同,可以用通常的方式进行跟踪和调试。

可以通过执行以下命令检查 /compat/linux 的当前内容:

12.3. Linux用户区

Linux软件需要的不仅仅是ABI。为了运行Linux软件,必须首先安装Linux用户区。

12.3.1. FreeBSD包中的Rocky Linux基础系统

要安装Rocky Linux 9用户区,请执行以下命令:

emulators/linux_base-rl9 将把从Rocky linux 9派生的基础系统放置到 /compat/linux 中。

安装软件包后,可以通过运行以下命令来验证 /compat/linux 的内容,以检查Rocky Linux用户区是否已安装:

12.3.2. FreeBSD包中的CentOS基础系统

要安装CentOS用户区,请执行以下命令:

emulators/linux_base-c7 将把CentOS 7的基础系统放入 /compat/linux

安装软件包后,可以通过运行以下命令来验证 /compat/linux 的内容,以检查是否已安装CentOS用户区:

12.3.3. 带有debootstrap的Debian/Ubuntu基础系统

提供Linux共享库的另一种方法是使用 sysutils/debootstrap。这具有提供完整Debian或Ubuntu发行版的优点。

要安装debootstrap,请执行以下命令:

debootstrap(8) 需要启用 linux(4) ABI。启用后,执行以下命令在 /compat/ubuntu 中安装Ubuntu或Debian:

输出应类似于以下内容:

然后在 /etc/fstab 中设置挂载。

要使用 chroot(8) 访问系统,请执行以下命令:

然后可以执行 uname(1) 来检查Linux环境:

一旦进入chroot,系统的行为就像正常的Ubuntu安装一样。虽然systemd不起作用,但 service(8) 命令照常工作。

12.4. 高级主题

linux(4) 中可以找到所有与Linux相关的 sysctl(8) 旋钮的列表。

某些应用程序需要挂载特定的文件系统。

这通常由 /etc/rc.d/linux 脚本处理,但可以在启动时执行以下命令禁用:

rc脚本挂载的文件系统不适用于chroot或jail中的Linux进程;如果需要,请在 /etc/fstab 中配置它们:

由于Linux二进制兼容层已经获得了运行32位和64位Linux二进制文件的支持,因此不再可能将仿真功能静态链接到自定义内核中。

12.4.1. 手动安装其他库

如果Linux应用程序在配置Linux二进制兼容性后抱怨缺少共享库,请确定Linux二进制需要哪些共享库并手动安装。

在使用相同CPU架构的Linux系统中, ldd 可用于确定应用程序需要哪些共享库。

例如,要检查 linuxdoom 需要哪些共享库,请在安装了Doom的Linux系统上运行以下命令:

然后,将Linux系统输出的最后一列中的所有文件复制到FreeBSD系统上的 /compat/linux 中。复制后,创建指向第一列中名称的符号链接。

此示例将在FreeBSD系统上生成以下文件:

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

例如,这些库已经存在于FreeBSD系统中:

ldd 表示二进制文件需要更高版本:

由于现有库的最后一位数字只有一两个版本过期,因此程序仍应使用稍旧的版本。但是,用新版本替换现有的 libc.so 是安全的:

通常,在FreeBSD上安装Linux程序的前几次,人们需要寻找Linux二进制文件所依赖的共享库。一段时间后,系统上将有一组足够的Linux共享库,能够运行新安装的Linux二进制文件,而无需任何额外的工作。

12.4.2. Linux ELF二进制文件品牌化

FreeBSD内核使用多种方法来确定要执行的二进制文件是否是Linux的:它检查ELF文件头中的品牌,查找已知的ELF解释器路径并检查ELF注释;最后,默认情况下,无品牌的ELF可执行文件无论如何都被假定为Linux。

如果所有这些方法都失败,尝试执行二进制文件可能会导致错误消息:

为了帮助FreeBSD内核区分FreeBSD ELF二进制文件和Linux二进制文件,请使用 brandelf(1)

12.4.3. 安装基于Linux RPM的应用程序

要安装基于Linux RPM的应用程序,请先安装 archivers/rpm4 软件包或端口。安装后,root可以使用此命令安装 a.rpm

如有必要,标记(brandelf)已安装的ELF二进制文件。请注意,这将阻止彻底卸载。

12.4.4. 配置主机名解析程序

如果DNS不起作用或出现此错误:

按如下方式配置 /compat/linux/etc/host.conf

这指定首先搜索 /etc/hosts ,然后搜索DNS。当 /compat/linux/etc/host.conf 不存在时,linux应用程序会在主机系统中使用 /etc/host.conf ,但由于FreeBSD中不存在该文件,它们会发出抱怨。如果未使用 /etc/resolv.conf 配置名称服务器,请删除绑定。

12.4.5. 杂项

有关二进制兼容性如何与Linux®兼容的更多信息,请参阅 FreeBSD中的Linux仿真 文章。