From owner-svn-doc-head@FreeBSD.ORG Tue Jun 10 07:15:24 2014 Return-Path: Delivered-To: svn-doc-head@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTPS id C43AA221; Tue, 10 Jun 2014 07:15:24 +0000 (UTC) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:1900:2254:2068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id B138822AC; Tue, 10 Jun 2014 07:15:24 +0000 (UTC) Received: from svn.freebsd.org ([127.0.1.70]) by svn.freebsd.org (8.14.8/8.14.8) with ESMTP id s5A7FO6t020966; Tue, 10 Jun 2014 07:15:24 GMT (envelope-from loader@svn.freebsd.org) Received: (from loader@localhost) by svn.freebsd.org (8.14.8/8.14.8/Submit) id s5A7FOdT020964; Tue, 10 Jun 2014 07:15:24 GMT (envelope-from loader@svn.freebsd.org) Message-Id: <201406100715.s5A7FOdT020964@svn.freebsd.org> From: Fukang Chen Date: Tue, 10 Jun 2014 07:15:24 +0000 (UTC) To: doc-committers@freebsd.org, svn-doc-all@freebsd.org, svn-doc-head@freebsd.org Subject: svn commit: r45041 - head/zh_CN.UTF-8/books/handbook/linuxemu X-SVN-Group: doc-head MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-doc-head@freebsd.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: SVN commit messages for the doc tree for head List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 10 Jun 2014 07:15:24 -0000 Author: loader Date: Tue Jun 10 07:15:24 2014 New Revision: 45041 URL: http://svnweb.freebsd.org/changeset/doc/45041 Log: MFen: linuxemu/chapter.xml r36653 -> r44899 Modified: head/zh_CN.UTF-8/books/handbook/linuxemu/chapter.xml Modified: head/zh_CN.UTF-8/books/handbook/linuxemu/chapter.xml ============================================================================== --- head/zh_CN.UTF-8/books/handbook/linuxemu/chapter.xml Tue Jun 10 03:35:04 2014 (r45040) +++ head/zh_CN.UTF-8/books/handbook/linuxemu/chapter.xml Tue Jun 10 07:15:24 2014 (r45041) @@ -2,298 +2,281 @@ - - Linux二进制兼容模式 + + + &linux; 二进制兼容模式 + - JimMockRestructured and parts updated by + + + Jim + Mock + + Restructured and parts updated by + + - Brian N.HandyOriginally contributed by - RichMurphey + + + Brian N. + Handy + + Originally contributed by + + + + + Rich + Murphey + + - - 概述 - Linux二进制兼容模式 + + + Linux 二进制兼容模式 + 二进制兼容模式 Linux - FreeBSD 提供了与其他几种类 - &unix; 操作系统, 包括 Linux, 的兼容性。 现在您可能会问, 为什么 - FreeBSD 需要能够运行 Linux 的可执行文件? 答案很简单。 - 许多公司和开发人员只为 Linux 开发程序, - 因为这是目前计算机世界 最热门 的技术。 - 这使得我们 FreeBSD 用户不得不去劝说这些公司和开发人员提供他们应用程序可以直接在 - FreeBSD 上运行的版本。 问题是, 许多这样的公司并不真的知道到底提供了 - FreeBSD 版本之后能带来多少用户, 因此许多仍然只开发 Linux - 的版本。 这时 FreeBSD 用户能做什么呢? 答案就是使用 FreeBSD - 所提供的 Linux 二进制兼容性。 - - 简而言之, 这种兼容性能够让 FreeBSD 用户不加修改地直接运行大约 90% - 的 Linux 应用程序。 这包括类似 &staroffice;, - Linux 版本的 &netscape;, - &adobe; &acrobat;, - &realplayer;, - VMware, - &oracle;, - &wordperfect;, - Doom, - Quake, 等等。 此外, 也有人说, - 某些情况下, 在 FreeBSD 上面运行的 Linux 程序的性能, - 甚至好于直接在 Linux 上面运行。 - - 然而, 仍然有一些只有 Linux 才有的操作系统特性在 FreeBSD 上并不被支持。 - 如果 Linux 程序过分地使用只能在 &i386; 上使用的特性, - 例如启用虚拟 8086 模式, 则也有可能无法在 FreeBSD 上运行。 + &os; 提供了与 &linux; 32-bit 二进制兼容, + 允许用户在 &os; 系统上安装和运行大多数的 32-bit &linux; + 二进制程序而无需做任何修改。 据说在某些情况下, &os; 上运行的 + 32-bit &linux; 二进制程序能有更好的表现。 + + 然而, 仍然有一些 &linux; 操作系统特有的功能在 &os; + 上并不被支持。 例如, 要是 &linux; + 程序过度地使用了诸如启用虚拟 8086 模式 &i386; 特有的调用, + 则无法在 &os; 上运行。 另外, 目前还不支持 64-bit 的 &linux; + 二进制程序。 读完这章,您将了解到: + - 如何在您的系统中启用Linux兼容模式。 + 如何在 &os; 系统中启用 &linux; 二进制兼容模式。 - 如何安装额外的Linux共享库。 - + 如何安装额外的 &linux; 共享库。 + - 如何在FreeBSD上安装Linux应用程序。 + 如何在 &os; 上安装 &linux; 应用程序。 - 在FreeBSD上,Linux兼容模式的执行细节。 + &os; 上 &linux; 兼容模式的实现细节。 - 阅读这章之前,您应该知道: + 在阅读这章之前,您应该知道: - 如何安装第三方软件()。 + 知道如何安装 + 额外的第三方软件。 - 安装 + 配置 &linux; 二进制兼容模式 - KLD (kernel loadable object) + Ports Collection - 默认情况下, 并不开启 Linux 二进制兼容支持。 - 启用这一功能最简单的方法是载入 - linux KLD 模块 (Kernel LoaDable - object)。 以 root - 的身份, 键入下列命令即可: + 默认情况下, &linux; 库并没有被安装而且 &linux; + 二进制兼容模式也没有被启动。 &linux; + 库可以通过手动安装或者使用 &os; 的 Ports Collection。 - &prompt.root; kldload linux + 安装 emulators/linux-base-f10 包或者 + port 是最容易在 &os; 系统上获得一套基本的 &linux; 库的方法。 + 使用如下方法安装 port: - 如果希望 Linux 兼容支持在系统初始化过程中自动启用, 则应在 - /etc/rc.conf 中增加: + &prompt.root; cd /usr/ports/emulators/linux_base-f10 +&prompt.root; make install distclean - linux_enable="YES" + 安装完成以后, 加载 linux + 模块启用 &linux; 二进制兼容模式: - &man.kldstat.8;可以用来检查KLD模块是否加载: + &prompt.root; kldload linuxuserinput> + + 查看模块是否已经被加载: &prompt.user; kldstat Id Refs Address Size Name 1 2 0xc0100000 16bdb8 kernel 7 1 0xc24db000 d000 linux.ko + + /etc/rc.conf 中加入以下这行后 + &linux; 兼容模式便会在系统启动时自动开启: + + linux_enable="YES" + - kernel options (内核选项) + kernel options COMPAT_LINUX - 如果您不想或者无法将Linux KLD加载,您就需要在内核中静态链接进Linux二进制兼容模式。您必须在 - 您的内核配置文件里面加入options COMPAT_LINUX,然后按照重新编译内核。 - + 想要在自制内核中静态链接 &linux; + 二进制兼容支持的用户可以在自定义的内核配置文件中加入 + options COMPAT_LINUXliteral>。 + 然后按照 + 中所描述的方法编译并安装新内核。 + + + 手动安装额外的库 - - 安装Linux运行时库 - Linux - 安装Linux运行时库 + shared libraries - 有两种方法来安装Linux运行时库,要么使用linux_base port, - 要么手动安装。 - - - 通过使用 linux_base Port 来安装 - Ports Collection - - 这是最容易的安装方法,只需要像安装其他port一样从 - Ports Collection来安装: - - &prompt.root; cd /usr/ports/emulators/linux_base-f10 -&prompt.root; make install distclean - - - 对于 &os; 8.0 之前的版本的 &os; 系统, - 你需要使用 emulators/linux_base-fc4 port - 而不是 emulators/linux_base-f10 - + 在配置了 &linux; 兼容模式之后, + 如果某个 &linux; 应用程序依然提示找不到共享库, + 需先找出此 &linux; 二进制程序需要的共享库再手动安装。 + + 在 &linux; 系统上使用 ldd + 找出应用程序所需的共享库文件。 比如, + 在安装有 Doom 的 &linux; + 系统上运行如下的命令列出 linuxdoom + 所需用到的共享库文件: - - 您现在应当是工作在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来检查需要哪些共享库, - 就像这样: - - &prompt.user; ldd linuxdoom + &prompt.user; 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系统上就有了这些文件: + + symbolic links + + + 然后把上面输出中最后一列中的所有文件从 &linux; + 系统复制到 &os; 上的 /compat/linux。 + 复制完成之后, 建立指向第一栏中文件名的符号链接。 + 这样在 &os; 系统上将会有如下的文件: - /compat/linux/usr/X11/lib/libXt.so.3.1.0 + /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共享库, - 您就已经完成了工作, 而不需要把右列命名的文件复制到您的系统上了。 - 如果有一个新的版本, 那无论如何都要复制一个共享库。 - 您可以删掉旧的, 您只要做一个符号连接到新的版本。 - 所以,如果有这些库在您的系统上: - + 如果已经有了一个与 ldd + 输出中第一列的主修订号相同的 &linux; 共享库文件, + 则不再需要复制最后那列文件, 现有的共享库应该可以正常使用。 + 如果是更新版本的共享库通常建议复制。 + 只要有符号链接指向新的版本, 那么就可以删除旧版的了。 - /compat/linux/lib/libc.so.4.6.27 + 比如, &os; 系统中现有这些共享库文件: + + /compat/linux/lib/libc.so.4.6.27 /compat/linux/lib/libc.so.4 -> libc.so.4.6.27 - 如果您根据ldd输出的发现需要一个更新版本的库: + 并且 ldd 指出某个二进制程序需要之后版本: - libc.so.4 (DLL Jump 4.5pl26) -> libc.so.4.6.29 + libc.so.4 (DLL Jump 4.5pl26) -> libc.so.4.6.29 - 如果结尾的数字只有一到两个版本过期,那也不要担心复制 /lib/libc.so.4.6.29, - 因为程序在稍微旧一些的版本上也能很好地工作。 - 然而,如果喜欢的话,您可以替换libc.so,变成这样: + 既然现有文件最后的版本号只相差一到两个版本, + 程序应该可以正常使用稍旧些的版本。 不管怎样, + 使用新版本替换现有 libc.so 都是安全的。 - /compat/linux/lib/libc.so.4.6.29 + /compat/linux/lib/libc.so.4.6.29 /compat/linux/lib/libc.so.4 -> libc.so.4.6.29 - -
-
- - 符号链接机制 仅仅是 Linux 程序需要的。 - FreeBSD 的运行时连接器会自己寻找匹配的主修订号,您不需要为此担心。 - -
-
-
+ 通常最初几次在 &os; 上安装 &linux; 程序时需要寻找 &linux; + 二进制程序所依赖的共享库文件。 在此之后, 系统里便会有足够多的 &linux; + 共享库文件来运行新安装的 &linux; 二进制程序而无需额外操作。
- 安装Linux ELF程序 + 安装 &linux; <acronym>ELF</acronym> + 二进制程序 + - Linux - ELF程序 + Linux + ELF binaries - ELF格式的程序需要一步额外的步骤标记。如果您尝试运行没有标记的ELF程序, - 您会得到像下面这样的错误信息: + ELF 二进制程序有时需要额外的步骤。 + 当未被标记的 ELF 二进制程序被执行的时候, + 会生成如下的错误信息: &prompt.user; ./my-linux-elf-binary ELF binary type not known Abort - 为帮助 FreeBSD 内核分辨 FreeBSD ELF - 执行文件和 Linux 执行文件, 需要使用 &man.brandelf.1; - 工具。 + 为了帮助 &os; 内核分辨 &os; ELF + 二进制程序和 &linux; 二进制程序, 请使用 &man.brandelf.1;: &prompt.user; brandelf -t Linux my-linux-elf-binary - GNU工具 - GNU工具现在会自动把适当的标记信息放到ELF程序中,您以后遇到这个问题的机会越来越少。 + + GNU toolchain + + + 由于现在的 GNU 工具链能自动把适当的标记信息写入 ELF + 二进制程序中,这个步骤通常不是必须做的。 - 安装各种基于 RPM 的应用程序 + 安装基于 &linux; <acronym>RPM</acronym> 的应用程序 - FreeBSD 使用自己的包数据库来跟踪所有的 ports (包括 &linux; ports)。 - 所以无法使用(不支持) &linux; RPM 数据库。 - - 如果你需要安装任意的一个基于 RPM 的 &linux; 应用程序, - 可以通过一下的步骤完成: + 安装基于 &linux; RPM 的应用程序, + 首先需要安装 archivers/rpm 包或者 port。 + 安装好之后 root + 用户就能使用此命令安装 .rpm 了: &prompt.root; cd /compat/linux -&prompt.root; rpm2cpio -q < /path/to/linux.archive.rpm | cpio -id +&prompt.root; rpm2cpio < /path/to/linux.archive.rpm | cpio -id - 然后对已安装的 ELF 二进制程序(不包括库)运行 brandelf。 - 用此种方法安装的程序不能被完全卸载, 但是可能有助于做些测试。 + 如有必要的话使用 brandelf 标记安装好的 + ELF 二进制程序。 注意此项安装将无法干净卸载。 配置主机名解析器 - 如果DNS不能正常工作或是您得到下列信息: + 如果 DNS 不能正常工作或是出现以下的错误信息: resolv+: "bind" is an invalid keyword resolv+: "hosts" is an invalid keyword - 您就需要配置/compat/linux/etc/host.conf文件,此文件包含: + 请参照此方法配置 /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。 - + 这里指定了先查询 /etc/hosts + 再查询 DNS。 如果 + /compat/linux/etc/host.conf 不存在的话, + &linux; 程序便会读取 /etc/host.conf + 并提示与 &os; 的语法不兼容。 如果没有在 + /etc/resolv.conf 文件中配置域名服务器, + 可以删除 bind
+ 安装&mathematica; @@ -438,7 +421,13 @@ done 您可以把MathType1改成Type1。 + --> + + +