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安装指南中所描述的那样。

内核调整

正如oralce安装指南所描述的,你必须设置最大的共享内存。不要在FreeBSD下使用SHMMAXSHMMAX只不过用来计算SHMMAXPGSPGSIZE。因此要定义SHMMAXPGS。所有其他使用的选项可以参考指南。例如:

    options SHMMAXPGS=10000

    options SHMMNI=100

    options SHMSEG=10

    options SEMMNS=200

    options SEMMNI=70

    options SEMMSL=61

设置这些选项来适应oracle的使用。确信你的内核配置文件中有下面这些:

    options SYSVSHM #SysV shared memory

    options SYSVSEM #SysV semaphores

    options SYSVMSG #SysV interprocess communication

Oracle帐户

创建一个oracle帐户,正如你创建其他帐户一样。把/compat/Linux/bin/bash添加到/etc/shells中,然后为oracle帐户设置shell/compat/Linux/bin/bash

环境

除了普通的oracle变量外,还有如ORACLE_HOMEORACLE_SID,你必须设置下面的环境变量:

变量

LD_LIBRARY_PATH

$ORACLE_HOME/lib

CLASSPATH

$ORACLE_HOME/jdbc/lib/classes111.zip

PATH

/compat/Linux/bin /compat/Linux/sbin /compat/Linux/usr/bin /compat/Linux/usr/sbin /bin /sbin /usr/bin /usr/sbin /usr/local/bin $ORACLE_HOME/bin

 

.profile中仔细地设置所有的环境变量。一个完整的例子是:

ORACLE_BASE=/oracle; export ORACLE_BASE

ORACLE_HOME=/oracle; export ORACLE_HOME

LD_LIBRARY_PATH=$ORACLE_HOME/lib

export LD_LIBRARY_PATH

ORACLE_SID=ORCL; export ORACLE_SID

ORACLE_TERM=386x; export ORACLE_TERM

CLASSPATH=$ORACLE_HOME/jdbc/lib/classes111.zip

export CLASSPATH

PATH=/compat/linux/bin:/compat/linux/sbin:/compat/linux/usr/bin

PATH=$PATH:/compat/linux/usr/sbin:/bin:/sbin:/usr/bin:/usr/sbin

PATH=$PATH:/usr/local/bin:$ORACLE_HOME/bin

export PATH

20.5.4 安装Oracle

由于Linux的模拟器有一个小错误,所以你必须在启动安装程序之前在/var/tmp目录下创建一个名叫.oracle的目录。你可以把它设为可写的,也可以让它成为oracle用户的主人(ower)。你必须没有问题地安装oracle。如果你有问题,请检查一下oracle发行组件,或先配置它!你安装完oracle之后,完成下面两节介绍的修补工作。

一个经常出现的问题是TCP协议的适配器没有安装好。结果你不能启动任何TCP听众。下面的工作将帮助你解决这个问题:

    # cd $ORACLE_HOME/network/lib

    # make -f ins_network.mk ntcontab.o

    # cd $ORACLE_HOME/lib

    # ar r libnetwork.a ntcontab.o

    # cd $ORACLE_HOME/network/lib

    # make -f ins_network.mk install

不要忘记再运行root.sh

修补root.sh

当安装oracle时,一些工作,需要在root下执行,这会被记录在一个叫做root.shshell脚本中。root.sh被写在orainst目录中。完成对root.sh下面的补丁后,需要使用它来对chown做一个适当的定位,或在一个Linux 本地shell下运行脚本。

    *** orainst/root.sh.orig Tue Oct 6 21:57:33 1998

    --- orainst/root.sh Mon Dec 28 15:58:53 1998

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

    *** 3137 ****

    # This is the default value for CHOWN

    # It will redefined later in this script for those ports

    # which have it conditionally defined in ss_install.h

    ! CHOWN=/bin/chown

    #

    # Define variables to be used in this script

    --- 3137 ----

    # This is the default value for CHOWN

    # It will redefined later in this script for those ports

    # which have it conditionally defined in ss_install.h

    ! CHOWN=/usr/sbin/chown

    #

    # Define variables to be used in this script

当你不从CD安装Oracle时,你可以为root.sh在源代码上打补丁。它叫做rthd.sh,定位在源代码树的orainst目录中。

修补genclntsh

脚本genclntsh被用来创建一个简单的共享客户端库。它被用来建立demos。完成下面的补丁就注释掉PATH的定义:

    *** bin/genclntsh.orig Wed Sep 30 07:37:19 1998

    --- bin/genclntsh Tue Dec 22 15:36:49 1998

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

    *** 3238 ****

    #

    # Explicit path to ensure that we're using the correct commands

    #PATH=/usr/bin:/usr/ccs/bin export PATH

    ! PATH=/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin export PATH

    #

    # each product MUST provide a $PRODUCT/admin/shrept.lst

    --- 3238 ----

    #

    # Explicit path to ensure that we're using the correct commands

    #PATH=/usr/bin:/usr/ccs/bin export PATH

    ! #PATH=/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin export PATH

    #

    # each product MUST provide a $PRODUCT/admin/shrept.lst

20.5.5 运行Oracle

如果你已经按上面的指示去操作了,你就可以像在Linux下一样运行Oracle

20.6安装SAP R/3 (4.6B - IDES)

使用FreeBSDSAP系统安装不会被SAP支持团队所支持——他们只支持某些特定的平台。

20.6.1

这篇文章描述了将安装一个带有Oracle 8.0.5 for LinuxSAP R/3 4.6B IDES-SystemFreeBSD 4.3机器上,包括FreeBSD 4.3-STABLE Oracle 8.0.5的安装。

虽然这篇文章深入地描述了许多重要的安装步骤,但它也不可能取代OracleSAP R/3的安装指南。请参看Linux版附带的文档和特定的oracle问题。

20.6.2 软件

下面的CDROM被用作SAP的安装:

名称

号码

描述

KERNEL

51009113

SAP Kernel Oracle/Installation /AIXLinuxSolaris

RDBMS

51007558

Oracle /RDBMS 8.0.5.X /Linux

EXPORT1

51010208

IDES / DB-Export / Disc 1 of 6

EXPORT2

51010209

IDES / DB-Export / Disc 2 of 6

EXPORT3

51010210

IDES / DB-Export / Disc3 of 6

EXPORT4

51010211

IDES / DB-Export / Disc4 of 6

EXPORT5

51010212

IDES / DB-Export / Disc5 of 6

EXPORT6

51010213

IDES / DB-Export / Disc6 of 6

 

另外,我使用Oracle 8 ServerLinux版的8.0.5预发布版,Linux内核是2.0.33)和FreeBSD 4.3 stable

20.6.3 SAP-Notes

在安装或使用SAP R/3之前,请先看看下面的注释:

号码

主题

0171356

SAP Software auf Linux: grundlegenden Anmerkungen

0201147

INST: 4.6C R/3 Inst. on UNIX - Oracle

0373203

Update / Migration Oracle 8.0.5 --> 8.0.6/8.1.6 LINUX

0072984

Release of Digital UNIX 4.0B for Oracle

0130581

R3SETUP step DIPGNTAB terminates

0144978

Your system has not been installed correctly

0162266

Questions and tips for R3SETUP on Windows NT / W2K

 

20.6.4硬件要求

下面的设备配置对SAP R/3 System来说已经足够了:

组件

4.6B

4.6C

Processor

2 x 800MHz Pentium III

2 x 800MHz Pentium III

Memory

1GB ECC

2GB ECC

Hard Disc Space

50-60GB (IDES)

50-60GB (IDES)

 

如果用于实际的生产中,就需要使用Xeon处理器,更高速度和容量的存储器(SCSI RAID),和USVECC-RAM内存。在安装时将创建27GB的数据库文件,建议配置容量更大的磁盘。通常安装完之后,还需要扩展一些空间。

我使用带有2800MHz Pentium III处理器的主板,Adaptec 29160 Ultra160 SCSI适配器(能够访问一个40/80 GB DLT 磁带机和CDROM)Mylex AcelleRAID(2个通道,firmware 6.00-1-00 with 32MB RAM)。对于Mylex RAID控制器被挂上217G(mirrored)的硬盘,和436GB的硬盘(RAID level 5)

20.6.5 安装FreeBSD 4.3-STABLE

首先我要安装FreeBSD 4.3 stable。我通过FTP进行默认安装。

通过FTP安装

首先得到磁盘映像kern.flp mfsroot.flp,然后把它们放到软驱中。(我从ftp7.de.freebsd.org安装。请选择适当的镜象)

    # dd if=kern.flp of=/dev/fd0

    # dd if=mfsroot.flp of=/dev/fd0

不要忘记使用两个软盘,用kern.flp启动,然后根据指示。我使用下面的分区方案:

文件系统

大小(1k-blocks)

大小(GB)

挂载点

/dev/da0s1a

1.016.303

1

/

/dev/da0s1b

 

6

<swap>

/dev/da0s1e

2.032.623

2

/var

/dev/da0s1f

8.205.339

8

/usr

/dev/da1s1e

45.734.361

45

/compat/Linux/oracle

/dev/da1s1f

2.032.623

2

/compat/Linux/sapmnt

/dev/da1s1g

2.032.623

2

/compat/Linux/usr/sap

 

我必须预先用Mylex软件配置和调整两个逻辑驱动器,以便在系统启动的时候能够自动启动。

请注意这个磁盘分区与SAP推荐的是不一样的,SAP建议把oracle子目录分离出来。我决定只简单地创建几个子目录。

得到最新的STABLE源代码

对于FreeBSD 4.3 stable以前的版本,很容易得到最新的版本。对于更老的版本,我把自己的脚本放在/etc/cvsup中。设置FreeBSD 4.3CVSup是很容易的。就像这样:

    # cp /etc/defaults/make.conf /etc/make.conf

    # vi /etc/make.conf

/etc/make.conf文件要求激活下面这些记录:

    SUP_UPDATE=    yes

    SUP=           /usr/local/bin/cvsup

    SUPFLAGS=      -g -L 2

    SUPHOST=       cvsup8.FreeBSD.org

    SUPFILE=       /usr/share/examples/cvsup/stable-supfile

    PORTSSUPFILE=  /usr/share/ examples /cvsup/ports-supfile

    DOCSUPFILE=    /usr/share/ examples /cvsup/doc-supfile

适当地改变SUPHOST的值。在/usr/share/examples/cvsup中的supfiles是很好的。如果你不要加载所有的docfiles,可以把相应的DOCSUPFILE记录禁用。启动cvsup来得到最新的stable源代码是很容易的:

    # cd /usr/src

    # make update

重新编译一个新内核

要做的第一件事是安装源代码。进入root,执行下面的工作:

    # cd /usr/src

    # make world

如果这个完成,就可以继续创建和配置新的内核。通常这是定制内核配置文件的地方。就像计算机被命名成troubadix,配置文件的一般名称也是troubadix

    # cd /usr/src/sys/i386/conf

    # cp GENERIC TROUBADIX

    # vi TROUBADIX

在这一步,你就可以定义使用或不使用的驱动器等。看看相关的文档或LINT文件得到其他的帮助。

你也可以像下面描述的一样包含一些适当的参数来创建新的内核

    # cd /usr/src/sys/i386/conf

    # config TROUBADIX

    # cd /usr/src/sys/compile/TROUBADIX

    # make depend

    # make

    # make install

make install完成之后,你需要重新启动计算机执行新的内核。

20.6.6安装Linux环境

我在下载要求的RPM文件时遇到了一些问题,所以你可以试试下面的站点:

             ftp7.de.freebsd.org/pub/FreeBSD/distfiles/rpm

             ftp.redhat.com/pub/redhat/Linux/6.1/en/os/i386/RedHat/RPMS

安装Linux基本系统

首先需要安装Linux 基本系统(as root)

    # cd /usr/ports/emulators/Linux_base

    # make package

安装Linux开发

接下来,安装Linux开发:

    # cd /usr/ports/devel/Linux_devtools

    # make package

安装必须的RPM

这儿是一个要安装的软件包列表:

             cracklib-2.7-5.i386.rpm

             cracklib-dicts-2.7-5.i386.rpm

             pwdb-0.60-1.i386.rpm

             pam-0.68-7.i386.rpm

我用下面的命令来安装这些软件包:

    # rpm -i --ignoreos --root /compat/Linux --dbpath /var/lib/rpm <package_name>

除了pam包,还要:

    # rpm -i --ignoreos --nodeps --root /compat/Linux --dbpath /var/lib/rpm pam-0.68-7.i386.rpm

要让Oracle运行智能代理,也必须安装RedHat Tcl包:tcl-8.0.5-30.i386.rpm。可能会有其他的原因需要重新连接Oracle,但那是Oracle-Linux的问题,不是FreeBSD的问题。

20.6.7 创建SAP/R3环境

创建必须的文件系统和加载点

对于简单的安装,创建下面的文件系统就已经足够了:

加载点

大小

/compat/Linux/oracle

45 GB

/compat/Linux/sapmnt

2 GB

/compat/Linux/usr/sap

2 GB

 

我也创建了一些链接,所以FreeBSD也要寻找正确的路径:

    # ln -s /compat/Linux/oracle /oracle

    # ln -s /compat/Linux/sapmnt /sapmnt

    # ln -s /compat/Linux/usr/sap /usr/sap

创建用户和目录

SAP R/3需要两个用户和三个组。用户名依赖于SAP系统的包含三个字母的系统ID(SID)。这些SID可以被SAP保留。对于IDES安装,我使用IDS。我们就定义下面几个组(组ids可能不同,这些只是安装时我使用的值):

 

id

组名

描述

100

dba

Data Base Administrator

101

sapsys

SAP System

102

oper

Data Base Operator

 

对于默认的oracle安装,只有组dba被使用。和oper组一样,你也可以使用组dba

我们也需要下面的用户:

用户id

用户名

普通名称

附加组

描述

1000

idsadm

<sid>adm

sapsys

oper

SAP Administrator

1002

oraids

ora<sid>

dba

oper

DB Administrator

 

adduser添加用户,要求SAP管理员有下面的记录:

    Name: idsadm            <sid>adm

    Password: ******

    Fullname: SAP IDES Administrator

    Uid: 1000

    Gid: 101 (sapsys)

    Class:

    Groups: sapsys dba

    HOME: /home/idsadm      /home/<sid>adm

    Shell: /bin/sh

对于数据库管理员:

    Name: oraids          ora<sid>

    Password: ******

    Fullname: Oracle IDES Administrator

    Uid: 1002

    Gid: 100 (dba)

    Class:

    Groups: dba

    HOME: /oracle/IDS     /oracle/<sid>

    Shell: /bin/sh

这也包括组oper,这个例子中,你正使用组dbaoper

创建目录

这些目录通常被创建为分离的文件系统。这完全根据你的需求。我选择创建成简单的目录:我们先设置一些目录的所有者和权限(user root)

    # chmod 775 /oracle

    # chmod 777 /sapmnt

    # chown root:dba /oracle

    # chown idsadm:sapsys /compat/Linux/usr/sap

    # chmow 775 /compat/Linux/usr/sap

第二,我们将创建目录作为user ora<sid>。这些将成为/oracle/IDS的子目录:

    # su - oraids

    # mkdir mirrlogA mirrlogB origlogA origlogB

    # mkdir sapdata1 sapdata2 sapdata3 sapdata4 sapdata5 sapdata6

    # mkdir saparch sapreorg

    # exit

第三步,我们创建目录作为user idsadm (<sid>adm)

    # su - idsadm

    # cd /usr/sap

    # mkdir IDS

    # mkdir trans

    # exit

/etc/services中的记录

SAP R/3要求在/etc/services文件中有一些记录,在安装过程中,这些不会被设置正确。请添加下面的记录。

    sapdp00  3200/tcp # SAP Dispatcher.      3200 + Instance-Number

    sapgw00  3300/tcp # SAP Gateway.       3300 + Instance-Number

    sapsp00  3400/tcp #                    3400 + Instance-Number

    sapms00  3500/tcp #                   3500 + Instance-Number

    sapmsIDS 3600/tcp # SAP Message Server.  3600 + Instance-Number

必须的定位

SAP要求至少两个定位,不是默认的Redhat安装的部分。SAP提供从它们的FTP服务器下载的必需RPM。看看你需要的RPM注释的列表。

也可能只创建适当的连接(例如,从de_DE en_US),但我不推荐把这作为一个实际的生产系统。下面的定位是需要的:

    de_DE.ISO-8859-1

    en_US.ISO-8859-1

如果他们不出现,可能在安装时有问题。如果这些被忽略了,不费一番周折,你就别想登陆进SAP系统。

内核调整

SAP R/3系统需要许多资源。我因此添加了下面的参数在我的内核配置文件中:

    # Set these for memory pigs (SAP and Oracle):

    options MAXDSIZ=“(1024*1024*1024)”

    options DFLDSIZ=“(1024*1024*1024)” # System V options needed.

    options SYSVSHM #SYSV-style shared memory

    options SHMMAXPGS=262144 #max amount of shared mem. pages

    options SHMMNI=256 #max number of shared memory ident if.

    options SHMSEG=100 #max shared mem.segs per process

    options SYSVMSG #SYSV-style message queues

    options MSGSEG=32767 #max num. of mes.segments in system

    options MSGSSZ=32 #size of msg-seg. MUST be power of 2

    options MSGMNB=65535 #max char. per message queue

    options MSGTQL=2046 #max amount of msgs in system

    options SYSVSEM #SYSV-style semaphores

    options SEMMNU=256 #number of semaphore UNDO structures

    options SEMMNS=1024 #number of semaphores in system

    options SEMMNI=520 #number of semaphore indentifiers

    options SEMUME=100 #number of UNDO keys

这篇文档中指定的最小值是来自SAP。没有针对Linux的描述,看看HP-UX的相关介绍了解更多信息。

20.6.8 安装SAP R/3

准备SAP CDROM

在安装过程中,有许多CDROM要被挂上和卸下。建议你有多个CDROM驱动器,你可以把它们都挂上。我决定拷贝CDROM的内容到相应的目录:

    /oracle/IDS/sapreorg/<cd-name>

<cd-name>KERNELRDBMSEXPORT1EXPORT2EXPORT3EXPORT4 EXPORT5EXPORT6这些中的一个。所有的文件系统都是大写的,其他使用-g选项来挂上。所以使用下面的命令:

    # mount_cd9660 -g /dev/cd0a /mnt

    # cp -R /mnt/* /oracle/IDS/sapreorg/<cd-name>

    # umount /mnt

 

运行安装脚本

首先,我需要准备一个安装目录:

    # cd /oracle/IDS/sapreorg

    # mkdir install

    # cd install

然后,安装脚本被启动,需要拷贝所有相关的文件到安装目录:

/oracle/IDS/sapreorg/KERNEL/UNIX/INSTTOOL.SH

由于这是一个完全定制化的SAP R/3 Demo系统的IDES安装,我们有6个而不是仅仅3EXPORT-CD。基于这点,安装模板CENTRDB.R3S用来安装一个标准的中央环境(R/3Database),不是一个IDES中央环境,所以从EXPORT1目录拷贝相应的CENTRDB.R3S,另外R3SETUP将只要求3EXPORT-CD

启动R3SETUP

确信LD_LIBRARY_PATH被设置正确:

# export LD_LIBRARY_PATH=/oracle/IDS/lib:/sapmnt/IDS/exe:/oracle/805_32/lib

从安装目录以root启动R3SETUP

# cd /oracle/IDS/sapreorg/install

# ./R3SETUP -f CENTRDB.R3S

脚本然后就问一些问题:

Enter SAP System ID

[C11]

IDS<ret>

Enter SAP Instance Number

[00]

<ret>

Enter SAPMOUNT Directory

[/sapmnt]

<ret>

Enter name of SAP central host

[troubadix.domain.de]

<ret>

Enter name of SAP db host

[troubadix]

<ret>

Select character set

[1] (WE8DEC)

<ret>

Enter Oracle server version (1) Oracle 8.0.5 (2) Oracle 8.0.6 (3) Oracle 8.1.5 (4) Oracle 8.1.6

 

1<ret>

Extract Oracle Client archive

[1] (Yes extract)

<ret>

Enter path to KERNEL CD

[/sapcd]

/oracle/IDS/sapreorg/KERNEL

Enter path to RDBMS CD

[/sapcd]

/oracle/IDS/sapreorg/RDBMS

Enter path to EXPORT1 CD

[/sapcd]

/oracle/IDS/sapreorg/EXPORT1

Directory to copy EXPORT1 CD

[/oracle/IDS/sapreorg/CD4_DIR]

<ret>

Enter path to EXPORT2 CD

[/sapcd]

/oracle/IDS/sapreorg/EXPORT2

Directory to copy EXPORT2 CD

[/oracle/IDS/sapreorg/CD5_DIR]

<ret>

Enter path to EXPORT3 CD

[/sapcd]

/oracle/IDS/sapreorg/EXPORT3

Directory to copy EXPORT3 CD

[/oracle/IDS/sapreorg/CD6_DIR]

<ret>

Enter path to EXPORT4 CD

[/sapcd]

/oracle/IDS/sapreorg/EXPORT4

Directory to copy EXPORT4 CD

[/oracle/IDS/sapreorg/CD7_DIR]

<ret>

Enter path to EXPORT5 CD

[/sapcd]

/oracle/IDS/sapreorg/EXPORT5

Directory to copy EXPORT5 CD

[/oracle/IDS/sapreorg/CD8_DIR]

<ret>

Enter path to EXPORT6 CD

[/sapcd]

/oracle/IDS/sapreorg/EXPORT6

Directory to copy EXPORT6 CD

[/oracle/IDS/sapreorg/CD9_DIR]

<ret>

Enter amount of RAM for SAP + DB

 

850<ret> (in Megabytes)

Service Entry Message Server

[3600]

<ret>

Enter Group-ID of sapsys

[101]

<ret>

Enter Group-ID of oper

[102]

<ret>

Enter Group-ID of dba

[100]

<ret>

Enter User-ID of <sid>adm

[1000]

<ret>

Enter User-ID of ora<sid>

[1002]

<ret>

Number of parallel procs

[2]

<ret>

 

如果没有把CD拷贝到不同的位置,那SAP的安装程序就不能找到需要的CD,它会要求你挂上CDROM,或键入加载路径。

CENTRDB.R3S不可能是自由出错的。在我的例子中,它要求EXPORT4指出正确的键(6_LOCATI ON,然后7_LOCATION ),所以你可以键入正确的值。不要生气。处理下面要提到的问题,每一样东西都要直接通过oracle数据库软件安装的地方。

 

20.6.9 安装Oracle 8.0.5

请看看相应的SAP注释,和Oracle的关于Linux的说明,还有oracle DB可能出现的问题。更多有关安装oracle的信息,请参考安装oracle章节。

orainst安装Oracle 8.0.5

如果Oracle 8.0.5将被使用,一些其他的库需要被成功地重新连接,因为Oracle 8.0.5是与一个老的glibc连接的(Redhat 6.0),但RedHat 6.1已经使用了一个新的glibc。所以你必须安装下面额外的软件包来保证连接正常:

compat-libs-5.2-2.i386.rpm

compat-glibc-5.2-2.0.7.2.i386.rpm

compat-egcs-5.2-1.0.3a.1.i386.rpm

compat-egcs-c++-5.2-1.0.3a.1.i386.rpm

compat-binutils-5.2-2.9.1.0.23.1.i386.rpm

看看相应的SAP注释或oracle的说明了解更多信息。如果这不是选项,你可以使用最初的程序,或使用与最初的Redhat系统重连接的程序。

要编译智能代理,必须安装RedHat Tcl包。如果你不能得到tcl-8.0.3-20.i386.rpm,一个更新的像tcl-8.0.5-30.i386.rpm也可以用。

除了重连接,安装是直截了当的:

# su - oraids

# export TERM=xterm

# export ORACLE_TERM=xterm

# export ORACLE_HOME=/oracle/IDS

# cd /ORACLE_HOME/orainst_sap

# ./orainst

Enter来确认所有的屏幕直到软件被安装好,除了你必须取消Oracle On-Line Text Viewer选择之外,因为这不是当前可用的LinuxOracle会要求用i386-glibc20-Linux-gcc重新连接以代替gccegcs i386-redhat-Linux-gcc。由于时间紧迫,我决定使用Oracle 8.0.5 PreProduction版本。

安装Oracle 8.0.5 Pre-Production release for Linux (Kernel 2.0.33)

这个安装很容易。挂上CD,启动安装程序。它就会要求oracle home目录的定位,然后拷贝那儿所有的程序。我不删除先前安装的RDBMS

然后,oracle数据库就可以毫无问题地运行了。

20.6.10继续SAP R/3的安装

首先检查设置环境users idsamd (<sid>adm)oraids (ora<sid>)。他们现在都有使用主机名的.profile.login .cshrc文件。在这个例子中,系统的主机名是没有限制的名称,你必须在所有三个文件中改变hostnamehostname -s

加载数据库

然后,R3SETUP就重新启动或继续。R3SETUP就创建tablespaces然后从EXPORT1EXPORT6R3load加载数据进入数据库。

当数据库被加载完成,需要一些口令。对于测试安装,你可以使用默认口令:

问题

输入

Enter Password for sapr3

sap<ret>

Confirum Password for sapr3

sap<ret>

Enter Password for sys

change_on_install<ret>

Confirm Password for sys

change_on_install<ret>

Enter Password for system

manager<ret>

Confirm Password for system

manager<ret>

 

在这点上,我有几个dipgntab的问题。

听众

像下面那样用user oraids (ora<sid>)启动oracle听众:

    umask 0; lsnrctl start

另外,你也可以得到ORA-12546,因为socket没有正确的权限。

20.6.11 快速安装步骤

要求SAP R/3 许可密匙

这是必须的,因为临时许可只能用4个星期。不要忘记键入正确的操作系统:FreeBSD 4.3 Stable。首先得到硬件的密匙。以用户idsadm登陆然后呼叫saplicense

    # /sapmnt/IDS/exe/saplicense -get

呼叫saplicense需要一个选项列表。要得到许可密匙,需要安装使用:

    # /sapmnt/IDS/exe/saplicense -install

你就被要求键入下面的值:

    SAP SYSTEM ID   = <SID3 chars>

    CUSTOMER KEY    = <hardware key11 chars>

    INSTALLATION NO = <installation10 digits>

    EXPIRATION DATE = <yyyymmddusually “99991231”>

    LICENSE KEY     = <license key24 chars>

创建用户

在客户机000中创建一个用户。作为一个用户名,我通常选择wartung(或英语中的service)。要求的大概配置是sap_new sap_all。对于额外的安全的默认用户口令应当被改变(这包括用户sap*ddic)。

配置传输系统,配置,操作模式等

在客户端000,不同的用户ddicsap*,至少要做下面这些:

任务

处理

配置传输系统作为Stand-Alone Transport Domain Entity

STMS

为系统创建/编辑配置

RZ10

维护操作模式和建议

RZ04

 

这些和所有其他的快速安装步骤在SAP的安装指南中有描述。

编辑init<sid>.sap (initIDS.sap)

文件/oracle/IDS/dbs/initIDS.sap包含了SAP的备份情况。这儿是使用的磁带机的大小,压缩的类型。要运行sapdba / brbackup来得到这些,我改变了下面的值:

    compress = hardware

    archive_function = copy_delete_save

    cpio_flags = “-ov --format=newc --block-size=128 --quiet”

    cpio_in_flags = “-iuv --block-size=128 --quiet”

    tape_size = 38000M

    tape_address = /dev/nsa0

    tape_address_rew = /dev/sa0

解释:

compress

我使用的磁带机是HP DLT1,它支持硬件压缩。

archive_function

这个定义了保存oracle文件日志的默认行为:新的日志文件被保存到磁带机上,保存的日志文件会被再次保存然后再删除。如果你需要恢复数据库,而其中一个磁带机已经损坏了,这可以防止出现麻烦,

cpio_flags

默认的使用-B来设置blocksize5120 Bytes。对于DLT-TapesHP建议至少32K blocksize,所以我使用--block-size=128 for 64K--format=newc必须的,我使用的数字       要超过65535。最后项-quiet是需要的。

cpio_in_flags

标记需要从磁带机加载回数据。格式是自动验证的。

tape_size

这通常给出了磁带机的存储容量。出于安全原因,这个值要比实际的值要小一些。

Value

这比实际的值要稍微小一点。

tape_address

cpio使用的非rewindable设备

tape_address_rew

cpio使用的rewindable设备。

安装以后的配置问题

下面的SAP参数将在安装以后调整:

名称

ztta/roll_extension 

  250000000

abap/heap_area_dia  

  300000000

abap/heap_area_nondia

  400000000

em/initial_size_MB 

  256

em/blocksize_kB 

1024

ipc/shm_psize_40

70000000

 

SAP-Note 0013026:

名称

ztta/dynpro_area

2500000

 

SAP-Note 0157246:

名称

rdisp/ROLL_MAXFS

16000

rdisp/PG_MAXFS

30000

 

 

注意:根据上面的参数,在带有1G内存的系统上,可以下面这样寻找到内存的使用情况:

Mem: 547M Active,305M Inact,109M Wired,40M Cache,112M Buf,3492K Free

20.6.12安装过程中出现的问题

OSUSERSIDADM_IND_ORA During R3SETUP

如果在这阶段R3SETUP有问题,可以编辑文件CENTRDB.R3S。定位到[OSUSERSIDADM_IND_ORA]然后编辑下面的值:

    HOME=/home/idsadm (was empty)

    STATUS=OK (had status ERROR)

然后你可以重新启动R3SETUP

    # ./R3SETUP -f CENTRDB.R3S

OSUSERDBSID_IND_ORA During R3SETUP

在这一阶段R3SETUP可能也会出问题。只要编辑CENTRDB.R3S。定位到[OSUSERDBSID_IND_ORA],然后编辑下面的值:

    STATUS=OK

然后重新启动R3SETUP

    # ./R3SETUP -f CENTRDB.R3S

Oracle安装期间oraview.vrf文件没有找到

在开始安装之前,你不要取消选定Oracle On-Line Text Viewer。既然这个选项当前没有用于Linux,这在安装时是需要标记的。在oracle安装中取消选定这个产品,然后重新安装。

TEXTENV_INVALID During R3SETUPRFC or SAPGUI Start

如果这个错误还出现,正确的定位可能已经丢了。SAP注释0171356列出了必须要安装的RPMsaplocales-1.0-3saposcheck-1.0-1 for RedHat 6.1)。在这个例子中,你跳过了所有相关的错误,设置了相应的状态从ERROROK,然后你需要重新启动R3SETUPSAP系统不会被正确地配置,你就不能用一个sapgui连接到系统,即使系统被重新启动。设法使用一个旧的Linux sapgui连接会得到下面的信息:

    Sat May 5 14:23:14 2001

    *** ERROR => no valid userarea given [trgmsgo. 0401]

    Sat May 5 14:23:22 2001

    *** ERROR => ERROR NR 24 occured [trgmsgi. 0410]

    *** ERROR => Error when generating text environment. [trgmsgi. 0435]

    *** ERROR => function failed [trgmsgi. 0447]

    *** ERROR => no socket operation allowed [trxio.c 3363]

    Speicherzugriffsfehler

这个问题归咎于SAP R/3不能正确地指派一个位置,也不能自己正确地配置。要能够连接到SAP,需要在DEFAULT.PFL文件中添加下面的记录:

    abap/set_etct_env_at_new_mode =0

    install/collate/active =0

    rscp/TCP0B =TCP0B

重新启动SAP系统。现在,你可以连接到系统,即使你指定的国家语言不能正常工作。设置完国家后,这些记录会从DEFAULT.PFL中被删除,然后SAP系统重新启动。

ORA-12546. 用正确的权限来启动听众

用下面的命令来启动oracle听众:

    # umask 0; lsnrctl start

另外,你可能会得到ORA-12546,因为socket没有正确的权限。

 [DIPGNTAB_IND_IND] During R3SETUP

通常情况下,看看SAP注释0130581。在这个特定的安装过程中,由于一些原因,安装程序不能使用命名为“IDS”SAP系统,但空字符“”可以。这将导致出现无法访问目录的问题,就像路径能被动态使用<sid>一样。所以代替访问:

    /usr/sap/IDS/SYS/...

    /usr/sap/IDS/DVMGS00

下面是被使用的路径:

    /usr/sap//SYS/...

    /usr/sap/D00i

要继续安装,我创建了一个连接和一个额外的目录:

    # pwd

    /compat/Linux/usr/sap

    # ls -l

    total 4

    drwxr-xr-x 3  idsadm sapsys 512 May 5 11:20 D00

    drwxr-x--x 5  idsadm sapsys 512 May 5 11:35 IDS

    lrwxr-xr-x 1  root   sapsys 7 May 5 11:35 SYS -> IDS/SYS

    drwxrwxr-x 2  idsadm sapsys 512 May 5 13:00 tmp

    drwxrwxr-x 11 idsadm sapsys 512 May 4 14:20 trans

我也发现SAP notes (0029227 0008401)描述到了问题。

20.7 高级主题

如果你对Linux兼容模式是如何工作的感到好奇,这章正是你所需要的。下面的绝大部分内容是由Terry Lambert <tlambert@primenet.com> (Message ID: <199906020108.SAA07001@usr09.primenet.com>)发表在邮件列表<freebsd-chat@FreeBSD.org>上的内容组成的。

20.7.1 它是如何工作的?

FreeBSD有一个叫做可执行类加载器。这主要是加载进execve系统呼叫。碰巧的是FreeBSD有一个引导器(loader)的列表,而不是一个简单的返回一个符号#!的引导器!

从历史上来讲,只有UNIX平台的引导器会检查魔术(magic)数(通常是文件的前4个或8个字节)是否是二进制的,如果是,就调用二进制引导程序。

如果它不是二进制类型的,execve呼叫就会返回一个错误,shell就试图用shell命令执行它。

假定默认的是“whatever the current shell is”

随后,sh就开始检查前两个字符,如果它们是:\n,那它就调用csh shell

FreeBSD现在所做的是用一个普通的#!引导器仔细检查引导器的列表,然后由解释程序一个接一个地解释,返回给/bin/sh

为了支持Linux ABIFreeBSD就把魔术数看作为一个二进制ELF程序。(这样一来,它就使得在FreeBSDSolarisLinux和其他任何操作系统之间只要使用ELF格式就都可以顺利运行)。

ELF引导器会寻找一个专门的标记(brand),它是在ELF映像中的一个注释部分,但在SVR4/SolarisELF中没有。

为了执行Linux程序,它们必须被打上Linux类型的标记;使用brandelf

           # brandelf -t Linux file

做完之后,ELF引导器就会看到文件上的Linux的标记。

ELF引导器看到Linux的标记,引导器就会在proc结构中替换一个指示器。所有的系统呼叫就会通过这个指示器来索引(在一个传统的UNIX系统中,这就是sysent[]结构队列,包含系统呼叫)。另外,为了解决由于信号杂乱所造成的陷阱向量的问题,会造成线程的剧增,需要切断其他(或较小的)由Linux内核模块产生的修正。

Linux系统呼叫向量包含一个sysent[]记录的列表,它的地址位于内核模块之中。

当一个系统呼叫被Linux程序呼叫时,有缺陷的代码会把系统呼叫功能的指示器从proc结构中解除,然后获得Linux,而不是FreeBSD,系统呼叫记录会指示出来。

另外,Linux模式动态地reroots查找;这是很有效的。首先,会试图在/compat/Linux/original-path目录中查找文件,然后,如果失败了,就会在/original-path目录中查找文件。这样就可以确定要求其他程序的程序可以运行(例如,Linux工具链都可以在Linux ABI的支持下工作)。也就是说Linux程序可以加载和执行FreeBSD程序,如果当前没有相应的Linux程序,那你可以在目录树中放置一个uname命令来确保Linux程序不提示它们不能运行在Linux上。

更有效的是,在FreeBSD内核中有一个Linux内核;由内核提供的能够提供所有服务的各种潜在功能在FreeBSD系统呼叫表记录和Linux系统呼叫表记录之间是一样的:文件系统操作,虚拟内存操作,信号发送,System V IPC等等。唯一的不同是FreeBSD会得到FreeBSDglue功能,而Linux程序会得到Linuxglue功能。

哪一个是FreeBSD自己的ABI呢?这无关紧要。基本上,唯一的不同是FreeBSDglue功能是被静态连接到内核,而Linuxglue功能可能是被静态连接到内核,也可能它们通过一个内核模块来访问。

有一个真正的模拟器吗?没有,它只不过是一个ABI执行机制,不是一个模拟器。

为什么有时它被叫做“Linux模拟器呢?只是为了更容易地卖出FreeBSD罢了!实际上,历史上从来没有描述这样一种执行机制的名字,FreeBSD并不是真正地运行Linux程序,如果你不编译进代码,或加载一个模块,就需要有一个名字来描述这样一种加载功能——因此就想出了“Linux模拟器这样一个名字。