11.2. 配置 Linux® 二进制兼容模式
上一页 | 第 11 章 Linux® 二进制兼容模式 | 下一页

## 11.2. 配置 Linux® 二进制兼容模式

默认情况下， Linux® 库并没有被安装而且 Linux® 二进制兼容模式也没有被启动。 Linux® 库可以通过手动安装或者使用 FreeBSD 的 Ports Collection。

安装 emulators/linux-base-f10 包或者 port 是最容易在 FreeBSD 系统上获得一套基本的 Linux® 库的方法。 使用如下方法安装 port：

    # cd /usr/ports/emulators/linux_base-f10
    # make install distclean

安装完成以后， 加载 `linux` 模块启用 Linux® 二进制兼容模式：

    # kldload linuxuserinput>

查看模块是否已经被加载：

    % kldstat
    Id Refs Address    Size     Name
     1    2 0xc0100000 16bdb8   kernel
     7    1 0xc24db000 d000     linux.ko

在 `/etc/rc.conf` 中加入以下这行后 Linux® 兼容模式便会在系统启动时自动开启：

    linux_enable="YES"

想要在自制内核中静态链接 Linux® 二进制兼容支持的用户可以在自定义的内核配置文件中加入 `options COMPAT_LINUX`literal>。 然后按照 第 9 章 配置FreeBSD的内核 中所描述的方法编译并安装新内核。

### 11.2.1. 手动安装额外的库

在配置了 Linux® 兼容模式之后， 如果某个 Linux® 应用程序依然提示找不到共享库， 需先找出此 Linux® 二进制程序需要的共享库再手动安装。

在 Linux® 系统上使用 `ldd` 找出应用程序所需的共享库文件。 比如， 在安装有 Doom 的 Linux® 系统上运行如下的命令列出 `linuxdoom` 所需用到的共享库文件：

    % 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

既然现有文件最后的版本号只相差一到两个版本， 程序应该可以正常使用稍旧些的版本。 不管怎样， 使用新版本替换现有 `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® 二进制程序而无需额外操作。

### 11.2.2. 安装 Linux® ELF 二进制程序

ELF 二进制程序有时需要额外的步骤。 当未被标记的 ELF 二进制程序被执行的时候， 会生成如下的错误信息：

    % ./my-linux-elf-binary
    ELF binary type not known
    Abort

为了帮助 FreeBSD 内核分辨 FreeBSD ELF 二进制程序和 Linux® 二进制程序， 请使用 brandelf(1)：

    % brandelf -t Linux my-linux-elf-binary

由于现在的 GNU 工具链能自动把适当的标记信息写入 ELF 二进制程序中，这个步骤通常不是必须做的。

### 11.2.3. 安装基于 Linux® RPM 的应用程序

安装基于 Linux® RPM 的应用程序， 首先需要安装 archivers/rpm 包或者 port。 安装好之后 `root` 用户就能使用此命令安装 `.rpm` 了：

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

如有必要的话使用 `brandelf` 标记安装好的 ELF 二进制程序。 注意此项安装将无法干净卸载。

### 11.2.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`。

上一页 | 上一级 | 下一页
第 11 章 Linux® 二进制兼容模式 | 起始页 | 11.3. 高级主题

本文档和其它文档可从这里下载： ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/.

如果对于FreeBSD有问题，请先阅读 文档，如不能解决再联系 <questions@FreeBSD.org>.
关于本文档的问题请发信联系 <doc@FreeBSD.org>.