第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安装指南所描述的,你必须设置最大的共享内存。不要在FreeBSD下使用SHMMAX。SHMMAX只不过用来计算SHMMAXPGS和PGSIZE。因此要定义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_HOME和ORACLE_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.sh的shell脚本中。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
***************
*** 31,37 ****
# 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
--- 31,37 ----
# 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
***************
*** 32,38 ****
#
# 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
--- 32,38 ----
#
# 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)
使用FreeBSD的SAP系统安装不会被SAP支持团队所支持——他们只支持某些特定的平台。
20.6.1 序
这篇文章描述了将安装一个带有Oracle 8.0.5 for Linux的SAP R/3 4.6B IDES-System到FreeBSD 4.3机器上,包括FreeBSD 4.3-STABLE 和Oracle
8.0.5的安装。
虽然这篇文章深入地描述了许多重要的安装步骤,但它也不可能取代Oracle和SAP R/3的安装指南。请参看Linux版附带的文档和特定的oracle问题。
20.6.2 软件
下面的CDROM被用作SAP的安装:
名称 |
号码 |
描述 |
KERNEL |
51009113 |
SAP Kernel Oracle/Installation /AIX,Linux,Solaris |
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 Server(Linux版的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),和USV,ECC-RAM内存。在安装时将创建27GB的数据库文件,建议配置容量更大的磁盘。通常安装完之后,还需要扩展一些空间。
我使用带有2个800MHz
Pentium III处理器的主板,Adaptec 29160 Ultra160 SCSI适配器(能够访问一个40/80 GB DLT 磁带机和CDROM),Mylex AcelleRAID(2个通道,firmware 6.00-1-00 with 32MB RAM)。对于Mylex RAID控制器被挂上2个17G(mirrored)的硬盘,和4个36GB的硬盘(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.3的CVSup是很容易的。就像这样:
# 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,这个例子中,你正使用组dba和oper。
创建目录
这些目录通常被创建为分离的文件系统。这完全根据你的需求。我选择创建成简单的目录:我们先设置一些目录的所有者和权限(如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>是KERNEL,RDBMS,EXPORT1,EXPORT2,EXPORT3,EXPORT4, EXPORT5和EXPORT6这些中的一个。所有的文件系统都是大写的,其他使用-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个而不是仅仅3个EXPORT-CD。基于这点,安装模板CENTRDB.R3S用来安装一个标准的中央环境(R/3和Database),不是一个IDES中央环境,所以从EXPORT1目录拷贝相应的CENTRDB.R3S,另外R3SETUP将只要求3个EXPORT-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选择之外,因为这不是当前可用的Linux。Oracle会要求用i386-glibc20-Linux-gcc重新连接以代替gcc,egcs
或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文件。在这个例子中,系统的主机名是没有限制的名称,你必须在所有三个文件中改变hostname为hostname -s。
加载数据库
然后,R3SETUP就重新启动或继续。R3SETUP就创建tablespaces然后从EXPORT1到EXPORT6用R3load加载数据进入数据库。
当数据库被加载完成,需要一些口令。对于测试安装,你可以使用默认口令:
问题 |
输入 |
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 = <SID,3 chars>
CUSTOMER KEY = <hardware key,11 chars>
INSTALLATION NO =
<installation,10 digits>
EXPIRATION DATE =
<yyyymmdd,usually “99991231”>
LICENSE KEY = <license key,24 chars>
创建用户
在客户机000中创建一个用户。作为一个用户名,我通常选择wartung(或英语中的service)。要求的大概配置是sap_new 和sap_all。对于额外的安全的默认用户口令应当被改变(这包括用户sap*和ddic)。
配置传输系统,配置,操作模式等
在客户端000,不同的用户ddic和sap*,至少要做下面这些:
任务 |
处理 |
配置传输系统,作为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来设置blocksize为5120 Bytes。对于DLT-Tapes,HP建议至少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 R3SETUP,RFC or SAPGUI Start
如果这个错误还出现,正确的定位可能已经丢了。SAP注释0171356列出了必须要安装的RPM(saplocales-1.0-3,saposcheck-1.0-1 for RedHat 6.1)。在这个例子中,你跳过了所有相关的错误,设置了相应的状态从ERROR到OK,然后你需要重新启动R3SETUP,SAP系统不会被正确地配置,你就不能用一个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
<[email protected]> (Message ID: <[email protected]>)发表在邮件列表<[email protected]>上的内容组成的。
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 ABI,FreeBSD就把魔术数看作为一个二进制ELF程序。(这样一来,它就使得在FreeBSD,Solaris,Linux和其他任何操作系统之间只要使用ELF格式就都可以顺利运行)。
ELF引导器会寻找一个专门的标记(brand),它是在ELF映像中的一个注释部分,但在SVR4/Solaris的ELF中没有。
为了执行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会得到FreeBSD的glue功能,而Linux程序会得到Linux的glue功能。
哪一个是FreeBSD自己的ABI呢?这无关紧要。基本上,唯一的不同是FreeBSD的glue功能是被静态连接到内核,而Linux的glue功能可能是被静态连接到内核,也可能它们通过一个内核模块来访问。
有一个真正的模拟器吗?没有,它只不过是一个ABI执行机制,不是一个模拟器。
为什么有时它被叫做“Linux模拟器”呢?只是为了更容易地卖出FreeBSD罢了!实际上,历史上从来没有描述这样一种执行机制的名字,FreeBSD并不是真正地运行Linux程序,如果你不编译进代码,或加载一个模块,就需要有一个名字来描述这样一种加载功能——因此就想出了“Linux模拟器”这样一个名字。