20Linux二进制兼容模式

20.1概要

FreeBSD提供了与其他几种UNIX类操作系统兼容的模式,包括Linux。正是这一点,你可能会问为什么FreeBSD要能够运行Linux二进制程序?问题的答案很简单。许多公司和开发人员只为Linux开发程序,因为它是目前计算机世界最热门的技术。这样就导致我们这些FreeBSD用户必须把他们这些公司和开发人员开发的应用程序移植到本地FreeBSD版本上来。问题是,这些公司中的绝大多数都无法知道有多少人会使用他们的FreeBSD版本的产品,所以许多公司仍然只开发Linux平台的产品。那么FreeBSD用户应该做些什么呢?这就是这儿使用Linux二进制兼容性的原因。

简单来讲,这种兼容性允许FreeBSD用户能够不做任何修改就可以运行大约90%Linux应用程序。这些包括Star OfficeLinux版的NetscapeAdobe AcrobatRealPlayer 57VMWareOracleWordPerfectDoomQuake等。据说在某些情况下,在FreeBSDLinux程序的性能比它们在Linux上运行得还要好。

然而,一些具有Linux本身操作系统特性的程序就无法在FreeBSD上运行。如果它们使用Linux/proc文件系统(它与FreeBSD/proc文件系统是不同的)或如启用虚拟8086模式这样特定的i386呼叫,那Linux的兼容模式就无法工作。

读完这章,你将了解到这些:

             如何在你的系统中启用Linux兼容模式。

             如何安装额外的Linux共享库。

             如何在FreeBSD上安装Linux应用程序。

             FreeBSD上,Linux兼容模式的执行细节。

阅读这章之前,你需要知道:

             如何安装第三方软件(第4章)。

20.2安装

默认的Linux兼容模式没有被打开。启用这个功能的最容易的方法是调用Linux KLD对象 (“Kernel LoaDable object”)。你可以在命令行通过键入Linux来调用这个模块:

如果你想让Linux二进制兼容性总是被启用,你可以在/etc/rc.conf中加入下面一行:

Linux_enable=“YES”

这将按顺序执行/etc/rc.i386中的动作:

   # Start the Linux binary compatibility if requested.

    #

    case ${Linux_enable} in

    [Yy][Ee][Ss])

        echo -n ' Linux';   Linux > /dev/null 2>&1

        ;;

    esac

如果你要确定KLD是否正常加载,你可以使用命令kldstat

% kldstat

Id Refs Address    Size     Name

 1    2 0xc0100000 16bdb8   kernel

 7    1 0xc24db000 d000     Linux.ko

如果你不想或者就是无法将Linux KLD加载,你就需要在内核中静态连接进Linux运行模式。你必须将:

options  LINUX

这一行加进你的内核状态文件,然后按照内核配置的说明编译安装新的内核。

20.2.1安装Linux运行时库

有两种方法,要么使用Linux_base port,要么手工安装它们

使用Linux_base port安装

这是最容易的方法。只需要像安装其他port一样来安装。简单如下:

       # cd /usr/ports/emulators/Linux_base

    # make install distclean

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

手工安装库

如果你没有安装ports collection,你需要手工安装库。你将需要Linux共享库。而且,你需要创建一个“shadow root”目录,/compat/Linux。任何通过Linux程序打开的共享库都首先会在这个目录中看到。所以,如果一个Linux程序加载了,例如,/lib/libc.soFreeBSD将首先打开/compat/Linux/lib/libc.so,如果它不存在,它将设法打开/lib/libc.so。共享库应当安装在/compat/Linux/lib下。

通常,你需要寻找共享库。一段时间后,你需要在系统上做一个高效的Linux共享库设置,以便能够运行最新的Linux程序。

如何安装额外的共享库

如果你安装Linux_baseport,你的应用程序仍会报告丢失共享库的信息?你如何知道Linux程序需要哪个共享库?基本上,有两种可能性:

如果你访问一个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的实时连接器会自己寻找匹配的主修订号,你不需要为此担心。

20.2.2安装 Linux ELF 程序

ELF格式的程序需要额外的标记 如果你要执行一个没有标记的ELF程序,你将会得到如下的信息:

    % ./my-Linux-elf-binary

    ELF binary type not known

    Abort

为了帮助FreeBSD内核分辨FreeBSD ELF程序和Linux程序,请使用brandelf工具:

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

GNU的工具现在会自动把适当的标记信息放到ELF程序中,你以后遇到这个问题的机会越来越少。

20.2.3设置主机名解析器

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

    resolv+: “bind” is an invalid keyword resolv+:

    “hosts” is an invalid keyword

你就需要配置/compat/Linux/etc/host.conf 这个文件,此文件包含:

    order hostsbind

    multi on

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

20.3 安装Mathematica

这节描述了在FreeBSD系统上安装Linux版的Mathematica 4.XMathematicaLinux版能在FreeBSD下很好地运行。然而,由Wolfram打包的二进制程序需要被打上标记,以便FreeBSD知道需要使用Linux ABI来执行它们。

Linux版的MathematicaMathematica for Students能够从Wolfram那里(http://www.wolfram.com/)直接订购。

20.3.1 标记Linux程序

Linux程序可以在Wolfram发布的CDROMMathematica UNIX目录中找到。你必须将这个目录树拷贝到本地硬盘上,以便你能在运行安装程序之前用brandelf来标记Linux程序。

    # mount /cdrom

    # cp -rp /cdrom/Unix/ /localdir/

    # brandelf -t Linux /localdir/Files/SystemFiles/Kernel/Binaries/Linux/*

    # brandelf -t Linux /localdir/Files/SystemFiles/FrontEnd/Binaries/Linux/*

    # brandelf -t Linux /localdir/Files/SystemFiles/Installation/Binaries/Linux/*

    # brandelf -t Linux /localdir/Files/SystemFiles/Graphics/Binaries/Linux/*

    # brandelf -t Linux /localdir/Files/SystemFiles/Converters/Binaries/Linux/*

    # brandelf -t Linux /localdir/Files/SystemFiles/LicenseManager/Binaries/Linux/mathlm

    # cd /localdir/Installers/Linux/

    # ./MathInstaller

另外,你也可以简单地用下面的命令将默认的ELF标记成Linux

    # sysctl -w kern.fallback_elf_brand=3

这将让FreeBSD知道没有标记的ELF程序使用Linux ABI,所以你将可以直接从CDROM来运行安装程序。

20.3.2取得你的Mathematica的口令

在你安装Mathematica之前,你必须要先取得一个对应到你机器编号(machine ID)的口令。

一旦你已经安装了Linux兼容实时运行库,而没有给Mathematica打补丁,你可能需要在安装目录时,通过运行mathinfo来获得机器编号(machine ID)。这个机器的ID以你的第一个网卡的MAC地址为基础。

    # cd /localdir/Files/SystemFiles/Installation/Binaries/Linux

    # mathinfo

    disco.example.com 7115-70839-20412

当你用电话,传真或是emailWolfram注册时,你就可以获得机器编号,他们会给你包含一组数字的口令。当你正要运行Mathematica时,你可能需要键入这个信息。

20.3.3通过一个网络来运行Mathematica

Mathematica使用一些特殊的字体来显示字符,与现在使用的标准字体不一样(integralssumsGreek letters)X协议要求将这些字体安装在本地。这意味着你必须从CDROM拷贝这些字体然后安装到本地机器。这些字体通常保存在CDROM/cdrom/Unix/Files/SystemFiles/Fonts或在硬盘的/usr/local/Mathematica/SystemFiles/Fonts目录下。实际的字体在目录Type1X中。有好几种方法可以使用它们。

第一种方法是把它们拷贝到一个已存在的字体目录/usr/X11R6/lib/X11/fonts中。这样会要求编辑fonts.dir文件,添加字体名字,然后改变第一行的字体的数字。另外,你也需要在拷贝字体的目录中运行mkfontdir程序。

第二种方法是拷贝目录到/usr/X11R6/lib/X11/fonts

    # cd /usr/X11R6/lib/X11/fonts

    # mkdir X

    # mkdir MathType1

    # cd /cdrom/Unix/Files/SystemFiles/Fonts

    # cp X/* /usr/X11R6/lib/X11/fonts/X

    # cp Type1/* /usr/X11R6/lib/X11/fonts/MathType1

    # cd /usr/X11R6/lib/X11/fonts/X

    # mkfontdir

    # cd ../MathType1

    # mkfontdir

现在,添加新的字体目录到你的字体目录:

    # xset fp+ /usr/X11R6/lib/X11/fonts/X

    # xset fp+ /usr/X11R6/lib/X11/fonts/MathType1

    # xset fp rehash

如果你正在使用XFree86服务器,你需要通过把它们添加到你的XF86Config文件来让这些字体目录自动加载。

如果你没有一个叫做/usr/X11R6/lib/X11/fonts/Type1的目录,你可以改变上例中的MathType1目录的名称。

20.4 安装Maple

Maple是一个类似于Mathematica的商业计算程序。你可以从这个网站(http://www.maplesoft.com)买到这个软件,然后在那儿注册得到一个许可。要在FreeBSD上安装这个软件,只要执行下面这些步骤:

1.       从软件的发行目录中执行INSTALL shell脚本命令。当进入安装程序的提示符时,选择“RedHat”选项。一个典型的安装目录是/usr/local/maple

2.       如果你不这样做,可以从Maple Waterloo Software (http://register.maplesoft.com)公司为maple订购一个许可,然后把它拷贝到/usr/local/maple/license/license.dat

3.       通过运行maple中的INSTALL_LIC shell脚本来安装FLEXlm许可管理器。然后,为你的机器指定许可服务器的主机名。

4.       然后,在usr/local/maple/bin/maple.system.type文件中加入下面这些脚本:

----- snip ------------------

*** maple.system.type.orig Sun Jul 8 16:35:33 2001

--- maple.system.type Sun Jul 8 16:35:51 2001

***************

*** 7277 ****

--- 7278 ----

# the IBM RS/6000 AIX case

MAPLE_BIN=“bin.IBM_RISC_UNIX”

;;

+ “FreeBSD”|\

“Linux”)

# the Linux/x86 case

# We have two Linux implementationsone for Red Hat and

----- snip end of patch -----

请注意,“FreeBSD”|\后面不应当出现空格。这个补丁主要是指示maple“FreeBSD”识别为一种Linux系统。/bin/maple shell脚本命令bin/maple.system.type shell脚本依次呼叫uname -a来寻找操作系统的名称。根据OS的名称,它就可以知道使用哪个程序。

5.       启动许可服务器。

下面的脚本安装在/usr/local/etc/rc.d/lmgrd.sh,是一个很方便的启动lmgrd的方法:

----- snip ------------

#! /bin/sh

PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/X11R6/bin

PATH=${PATH}:/usr/local/maple/bin:/usr/local/maple/FLEXlm/UNIX/LINUX

export PATH

LICENSE_FILE=/usr/local/maple/license/license.dat

LOG=/var/log/lmgrd.log

case “$1” in

start)

lmgrd -c ${LICENSE_FILE} 2>> ${LOG} 1>&2

echo -n “ lmgrd”

;;

stop)

lmgrd -c ${LICENSE_FILE} -x lmdown 2>> ${LOG} 1>&2

;;

*)

echo “Usage: ‘basename $0‘ {start|stop}” 1>&2

exit 64

;;

esac

exit 0

----- snip ------------

6.       开始测试maple:

% cd /usr/local/maple/bin

% ./xmaple

你现在已经成功启动了maple。记得写信告诉Maplesoft你想要一个本地FreeBSD版本!

20.4.1有些缺陷

             FLEXlm许可管理器可能是一个使用比较困难的工具。关于这个的其他介绍你可以看看这个网站(http://www.globetrotter.com)。

             lmgrd有时会出现错误,你可以清理一下存储器再做。一个正确的许可文件是这样的:

# =======================================================

# License File for UNIX Installations (“Pointer File”)

# =======================================================

SERVER chillig ANY

#USE_SERVER

VENDOR maplelmg

FEATURE Maple maplelmg 2000.0831 permanent 1 XXXXXXXXXXXX \

PLATFORMS=i86_r ISSUER=“Waterloo Maple Inc.” \

ISSUED=11-may-2000 NOTICE=“ Technische Universitat Wien” \

SN=XXXXXXXXX

注意:序列号被X代替了,“chillig”是一个主机名。

 

20.5 安装Oracle

20.5.1

这节主要描述了在FreeBSD系统上安装Linux版的Oracle 8.0.5Oracle 8.0.5.1企业版。

20.5.2安装Linux环境

确信你已经从ports collection安装了linux-baselinux_devtools。这些port将在FreeBSD 3.2版本以后添加到collection。如果你使用FreeBSD 3.2或更老的版本,请升级你的ports collection。你也可以考虑升级你的FreeBSD版本。如果你运行Linux_base-6.1Linux_devtools-6.1有点困难,你可能必须使用这些软件包的5.2版本。

如果你要运行智能代理,你将需要安装Red Hat Tcl包:tcl-8.0.3-20.i386.rpm。安装这些包的通常的命令是这样的:

    # rpm -i --ignoreos --root /compat/Linux --dbpath /var/lib/rpm package

包的安装通常不会出现错误。

20.5.3创建oracle环境

在你安装oracle之前,你必须设置一个正确的环境。这篇文章只描述了在FreeBSD上运行Oracle for Linux所要做的比较特殊的事情,不像在oracle安装指南中所描述的那样。

内核调整