FreeBSD 使用手册
上一页 | 第10章 　Linux二进制兼容模式 | 下一页

# 10.2 安装

默认情况下， 并不开启 Linux 二进制兼容支持。 启用这一功能最简单的方法是载入 `linux` KLD 模块 (“Kernel LoaDable object”)。 以 `root` 的身份， 键入下列命令即可：

    # kldload linux

如果希望 Linux 兼容支持在系统初始化过程中自动启用， 则应在 `/etc/rc.conf` 中增加：

    linux_enable="YES"

kldstat(8)可以用来检查KLD模块是否加载：

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

如果您不想或者无法将Linux KLD加载，您就需要在内核中静态链接进Linux二进制兼容模式。您必须在 您的内核配置文件里面加入`options COMPAT_LINUX`，然后按照第 8 章重新编译内核。

## 10.2.1 安装Linux运行时库

有两种方法来安装Linux运行时库，要么使用linux_base port， 要么手动安装。

### 10.2.1.1 通过使用 linux_base Port 来安装

这是最容易的安装方法，只需要像安装其他port一样从 Ports Collection来安装：

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

您现在应当是工作在Linux兼容模式下了。一些程序可能会提示系统库的版本不正确。通常，这不是问题。

> 注意: 有多个版本的`emulators/linux_base` port，针对不同的版本的Linux。 您应该选择最接近Linux应用程序需要的那个版本来安装。

### 10.2.1.2 手动安装

如果您没有安装 Ports Collection，您也可以通过手动来安装Linux运行时库。 您将需要这些程序依赖的Linux共享库，而且您需要创建一个“shadow root” 目录`/compat/linux`，任何要被Linux程序打开的共享库都首先在这个目录里面查找。 所以，如果一个Linux程序加载了，例如，`/lib/libc.so`，FreeBSD 会首先尝试打开 `/compat/linux/lib/libc.so`，如果不存在，它将尝试打开`/lib/libc.so`。 共享库应该安装在`/compat/linux/lib`而不是Linux `ld.so`报告的其他路径。

通常，您需要寻找Linux程序依赖的共享库。 此后， 你的系统上就会有一组 Linux 共享库， 这组共享库足以用来运行新安装的 Linux 二进制程序。

### 10.2.1.3 如何安装额外的共享库

如果您安装了`linux_base` port，但是您的 您的应用程序仍会报告丢失共享库的信息？您如何知道Linux程序需要哪个共享库？ 基本上，有两种可能性（接下来的指令需要`root`权限）：

如果您有可以访问的Linux系统， 看看应用程序需要什么共享库， 把它们复制到您的FreeBSD系统。看下面的例子：

我们假设您通过FTP得到Linux程序Doom， 并把它放在您能访问的Linux系统上。然后您可以通过`ldd 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

您需要得到上面输出的右列的所有文件，并把它们复制到 `/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共享库， 您就已经完成了工作， 而不需要把右列命名的文件复制到您的系统上了。 如果有一个新的版本， 那无论如何都要复制一个共享库。 您可以删掉旧的， 您只要做一个符号连接到新的版本。 所以，如果有这些库在您的系统上：

> >     /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

> > 如果结尾的数字只有一到两个版本过期，那也不要担心复制 `/lib/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

> > 注意: 符号链接机制 仅仅是 Linux 程序需要的。 FreeBSD 的运行时连接器会自己寻找匹配的主修订号，您不需要为此担心。

## 10.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程序中，您以后遇到这个问题的机会越来越少。

## 10.2.3 配置主机名解析器

如果DNS不能正常工作或是您得到下列信息：

    resolv+: "bind" is an invalid keyword resolv+:
    "hosts" is an invalid keyword

您就需要配置`/compat/linux/etc/host.conf`文件，此文件包含：

    order hosts, bind
    multi on

order这一行指出`/etc/hosts`先被搜索再接着搜索DNS。 如果`/compat/linux/etc/host.conf`没有被安装，Linux程序会读取FreeBSD的 `/etc/host.conf`然后提示不兼容的FreeBSD语法。 如果您没有使用`/etc/resolv.conf` 文件设置DNS，应该删除`bind`。

上一页 | 起始页 | 下一页
Linux二进制兼容模式 | 上一级 | 安装Mathematica®

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

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