默认情况下, 并不开启 Linux 二进制兼容支持。
启用这一功能最简单的方法是载入
linux
KLD 模块 (“Kernel LoaDable
object”)。 以 root
的身份, 键入下列命令即可:
#
kldload linux
如果希望 Linux 兼容支持在系统初始化过程中自动启用, 则应在
/etc/rc.conf
中增加:
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
,然后按照第 9 章 配置FreeBSD的内核重新编译内核。
有两种方法来安装Linux运行时库,要么使用linux_base port, 要么手动安装。
这是最容易的安装方法,只需要像安装其他port一样从 Ports Collection来安装:
#
cd /usr/ports/emulators/linux_base-f10
#
make install distclean
对于 FreeBSD 8.0 之前的版本的 FreeBSD 系统,
你需要使用 emulators/linux_base-fc4
port
而不是 emulators/linux_base-f10
。
您现在应当是工作在Linux兼容模式下了。一些程序可能会提示系统库的版本不正确。通常,这不是问题。
有多个版本的emulators/linux_base
port,针对不同的版本的Linux。
您应该选择最接近Linux应用程序需要的那个版本来安装。
如果您没有安装 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 二进制程序。
如果您安装了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系统上就有了这些文件:
注意:
如果您已经有了一个与
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 的运行时连接器会自己寻找匹配的主修订号,您不需要为此担心。
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程序中,您以后遇到这个问题的机会越来越少。
FreeBSD 使用自己的包数据库来跟踪所有的 ports (包括 Linux® ports)。 所以无法使用(不支持) Linux® RPM 数据库。
如果你需要安装任意的一个基于 RPM 的 Linux® 应用程序, 可以通过一下的步骤完成:
#
cd /compat/linux
#
rpm2cpio -q < /path/to/linux.archive.rpm | cpio -id
然后对已安装的 ELF 二进制程序(不包括库)运行 brandelf。 用此种方法安装的程序不能被完全卸载, 但是可能有助于做些测试。
如果DNS不能正常工作或是您得到下列信息:
您就需要配置/compat/linux/etc/host.conf
文件,此文件包含:
order这一行指出/etc/hosts
先被搜索再接着搜索DNS。
如果/compat/linux/etc/host.conf
没有被安装,Linux程序会读取FreeBSD的
/etc/host.conf
然后提示不兼容的FreeBSD语法。
如果您没有使用/etc/resolv.conf
文件设置DNS,应该删除bind
。
本文档和其它文档可从这里下载: ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/.
如果对于FreeBSD有问题,请先阅读
文档,如不能解决再联系
<questions@FreeBSD.org>.
关于本文档的问题请发信联系
<doc@FreeBSD.org>.