第20章Linux二进制兼容模式
20.1概要
FreeBSD提供了与其他几种UNIX类操作系统兼容的模式,包括Linux。正是这一点,你可能会问为什么FreeBSD要能够运行Linux二进制程序?问题的答案很简单。许多公司和开发人员只为Linux开发程序,因为它是目前计算机世界最热门的技术。这样就导致我们这些FreeBSD用户必须把他们这些公司和开发人员开发的应用程序移植到本地FreeBSD版本上来。问题是,这些公司中的绝大多数都无法知道有多少人会使用他们的FreeBSD版本的产品,所以许多公司仍然只开发Linux平台的产品。那么FreeBSD用户应该做些什么呢?这就是这儿使用Linux二进制兼容性的原因。
简单来讲,这种兼容性允许FreeBSD用户能够不做任何修改就可以运行大约90%的Linux应用程序。这些包括Star Office,Linux版的Netscape,Adobe Acrobat,RealPlayer 5和7,VMWare,Oracle,WordPerfect,Doom,Quake等。据说在某些情况下,在FreeBSD上Linux程序的性能比它们在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.so,FreeBSD将首先打开/compat/Linux/lib/libc.so,如果它不存在,它将设法打开/lib/libc.so。共享库应当安装在/compat/Linux/lib下。
通常,你需要寻找共享库。一段时间后,你需要在系统上做一个高效的Linux共享库设置,以便能够运行最新的Linux程序。
如何安装额外的共享库
如果你安装Linux_base的port,你的应用程序仍会报告丢失共享库的信息?你如何知道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 hosts,bind
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.X。Mathematica的Linux版能在FreeBSD下很好地运行。然而,由Wolfram打包的二进制程序需要被打上标记,以便FreeBSD知道需要使用Linux ABI来执行它们。
Linux版的Mathematica或Mathematica for
Students能够从Wolfram那里(http://www.wolfram.com/)直接订购。
20.3.1 标记Linux程序
Linux程序可以在Wolfram发布的CDROM的Mathematica 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
当你用电话,传真或是email向Wolfram注册时,你就可以获得机器编号,他们会给你包含一组数字的口令。当你正要运行Mathematica时,你可能需要键入这个信息。
20.3.3通过一个网络来运行Mathematica
Mathematica使用一些特殊的字体来显示字符,与现在使用的标准字体不一样(integrals,sums,Greek letters等)。X协议要求将这些字体安装在本地。这意味着你必须从CDROM拷贝这些字体然后安装到本地机器。这些字体通常保存在CDROM的/cdrom/Unix/Files/SystemFiles/Fonts或在硬盘的/usr/local/Mathematica/SystemFiles/Fonts目录下。实际的字体在目录Type1和X中。有好几种方法可以使用它们。
第一种方法是把它们拷贝到一个已存在的字体目录/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
***************
*** 72,77 ****
--- 72,78 ----
# the IBM RS/6000 AIX case
MAPLE_BIN=“bin.IBM_RISC_UNIX”
;;
+ “FreeBSD”|\
“Linux”)
# the Linux/x86 case
# We have two Linux implementations,one 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.5和Oracle 8.0.5.1企业版。
20.5.2安装Linux环境
确信你已经从ports collection安装了linux-base和linux_devtools。这些port将在FreeBSD
3.2版本以后添加到collection。如果你使用FreeBSD 3.2或更老的版本,请升级你的ports collection。你也可以考虑升级你的FreeBSD版本。如果你运行Linux_base-6.1或Linux_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安装指南中所描述的那样。
内核调整
正如oralce