图 2 是一个更加复杂的软件包关系图。可以看到每个 package 中都包含了大量的 fileset,而一个 LPP 中又包含了大量的 package。这也是 AIX 中最普遍的情况。
VRMF 是系统版本号(Version)、发行版本号 (Release)、改进版本号 (Modification level) 和修正版本号 (Fix level) 的首字母的集合。这四个数字组合再一起,表示了软件包的版本。下面我们分别对这四个版本号进行详细的解释 .
发行版号(Release)——发行版号也是由一个两位数字表示,它代表了软件的发行版本。例如 :AIX5.3,其中的 3 就是发行版号,我们在这里省略了十位的 0,将 03 简写为 3.
改进版号(Modification level)——是由一个四位数字组成,表示最新的改进版级别。一般情况下,每过一段时间,软件发布者会将大量的更新打包成一个安装镜像并发布,此时改进版本级别会被改变。
修正版本号(fix level)——是由一个四位数字组成,表示最新的 fileset 修正版本。软件每经过一次修正,其修正版本号都会增加一次,直到改进版本号升高,修正版本号将被重置为 0。
AIX 为了实现在客户机 / 服务器环境下安装的灵活性将安装包划分为 usr 部分 (usr part)、root 部分 (root part) 和 share 部分 (share part)。
a)usr 部分 : 这个部分包括了 lpp_name 和 liblpp.a 两个控制文件以及软件包中可以被多个同构硬件共享的文件。在一个标准的 AIX 系统中,这些文件被放置在 /usr 目录树下。
b)root 部分这个部分包含了 liblpp.a 归档文件以及产品中不能被多个机器共享的部分。换句话说,每个机器必须有它自己的一个独立拷贝,这个部分和每台机器的配置相关联。在一个标准的 AIX 系统中,这些文件被放置在根(/)目录树下。如果一个 fileset 包含一个 root 部分那它也必须包含一个 usr 部分。
c)share 部分 : 这个部分包括了软件包中可以被多个异构硬件共享的文件。一般这个部分包括软件包中的非可执行文件,例如:文档和数据文件。在一个标准的 AIX 系统中,这些文件被放置在 /usr/share 目录树下。share 部分必须和 usr/root 部分分开打包,即包括 share 部分的 fileset 里不能包含 usr/root 部分,并且包含 share 部分的 fileset 不能和包含 usr/root 部分的 fileset 同名。
在图 3 中,我们可以看到,一个典型的 AIX 软件包中包含 usr 部分和 root 部分。每个部分中又包含着控制文件和安装文件。下面我们将对图 3 中的内容做详细的介绍。
上一节我们已经提到安装包的 usr 部分包含两个安装控制文件:lpp_name 和 liblpp.a 以及所有在安装和升级 usr 部分时将被安装的文件。下面我们分别对两个控制文件做一个简单的介绍:
这个文件提供了软件包安装和升级的信息 .
安装包的 root 部分包含 ./usr/lpp/PackageName/inst_root/liblpp.a 库文件以及所有在安装和升级 root 部分时将被安装的文件。
如果软件产品中包含 share 部分,share 部分必须独立于 usr 和 root 部分被单独的打包。这个部分和 usr 部分非常相似也包换 ./lpp_name 和 liblpp.a 以及所有在安装和升级 share 部分时将被安装的文件。
图 4 显示了 installp 对包进行操作中,所牵涉的资源和文件。下面,我们将对 installp 操作包的流程做详细的介绍。请大家参考图 4 进行理解。
installp 对包提供了如下四种主要的操作:
- Apply
- Commit
- Reject
- Remove
下面我们分别对 Apply/Reject/Remove 的流程做详细的介绍:
installp 处理 Apply 操作的流程:
a. 检查所需的 filesets 是否在安装媒介上存在。
b. 检查所需的 filesets 的版本,以确定他们是否已经被安装在系统上。
c. 解包 liblpp.a 文件,将其中的控制文件按照包的类型拷贝到相应目录。(usr 部分拷贝到 /usr/lpp/Package_Name,share 部分拷贝到 /usr/share/lpp/Package_Name,root 部分拷贝到 /usr/lpp/Package_Name/inst_root/liblpp.a)
d. 检查磁盘空间。
e. 检查所依赖的包是否已经安装或者在即将安装的软件包列表上。
f. 检查 license 。
h. 执行安装(拷贝文件,运行安装脚本)并生成 status 文件。
g. 如果 status 文件显示 apply 操作成功,更新 ODM 数据库中的 SWVPD 信息,否则清除并显示所有失败的文件。
installp 处理 Reject 操作的流程
- 检查软件包之间的依赖关系,保证所有被依赖的包都已被 Reject 。
- 如果 ./lpp.reject 存在则执行 ./lpp.reject,否则执行系统缺省的 /usr/lib/instl/reject 脚本,进行和 Apply 反向的 Reject 操作
- 更新 SWVPD 数据
installp 处理 Remove 操作的流程
a. 检查包之间的依赖关系,保证所有被依赖的包也都被 Remove 。
b. 如果 ./lpp.deinstall 存在则执行 ./lpp.deinstall ,否则执行系统缺省的 /usr/lib/instl/deinstall 脚本。
c. 删除属于此 fileset 的文件。
d. 从 SWVPD 中删除相关信息。
e. 删除软件 license 许可。
如何安装软件
由第 3 章我们知道软件包在被安装后,可以处于 applied 和 committed 两种状态。applied 状态会在 /usr/lpp/PackageName
目录保留软件包的前一个版本。当软件包的新版本出现问题时,用户可以方便的回滚到前一个稳定版本。而 committed 状态则会删除软件所有以前的版本,用户不再可以进行回滚操作。下面,我们就分别介绍如何将软件包安装为 applied 状态和 committed 状态。
在 AIX 中,用户可以通过命令行和 SMIT 来进行软件包的安装。由于篇幅关系,我们在这里只介绍命令行方式。
在命令行模式下,软件包安装通过 installp 命令来完成,下面列出了将软件包安装成 applied 模式的 installp 命令语法:
installp -a [ -eLogFile ] [ -V Number ] [ -dDevice ] [ -b ] [ -S ] [ -B ] [ -D ] [ -I ]
[ -p ] [ -Q ] [ -q ] [ -v ] [ -X ] [ -F | -g ] [ -O { [ r ] [ s ] [ u ] } ]
[ -tSaveDirectory ] [ -w ] [ -zBlockSize ] { FilesetName [ Level ]...| -f ListFile | all}
|
例如:要安装放置在 /usr/sys/inst.images 目录中的 bos.net 软件包中的所有 filesets,在安装中使用 checksum 检查,并使软件包处于 applied 状态。使用下面这个命令:
installp -avX -d/usr/sys/inst.images bos.net
|
将软件安装为 commited 状态,请使用下边的语法:
installp -ac [ -N ] [ -eLogFile ] [ -V Number ] [ -dDevice ] [ -b ] [ -S ] [ -B ] [ -D ]
[ -I ] [ -p ] [ -Q ] [ -q ] [ -v ] [ -X ] [ -F | -g ] [ -O { [ r ] [ s ] [ u ] } ]
[ -tSaveDirectory ] [ -w ]
[ -zBlockSize ] { FilesetName [ Level ]... | -f ListFile | all }
|
例如:要模拟安装放置在 /usr/sys/inst.images 目录中的 bos.net 软件包中的所有 filesets,在安装前进行磁盘容量检查,并使软件包处于 committed 状态。使用下面这个命令:
installp -acpX -d/usr/sys/inst.images bos.net
|
installp 命令的输出记录可以在 /var/adm/sw/installp.summary 文件中找到
如何 commit applied 软件包
commit 一个处于 applied 状态的软件包,也是使用 installp 命令来完成的。语法如下:
installp -c [ -eLogFile ] [ -VNumber ] [ -b ] [ -g ] [ -p ] [ -v ] [ -X ]
[ -O { [ r ] [ s ] [ u ] } ] [ -w ] { FilesetName [ Level ]... | -f ListFile | all }
|
例如:commit 所有的软件包更新
如何 reject applied 软件包
reject 一个处于 applied 状态的软件包,是使用 installp 命令来完成的。语法如下:
installp -r [ -eLogFile ] [ -VNumber ] [ -b ] [ -g ] [ -p ] [ -v ] [ -X ]
[ -O { [ r ] [ s ] [ u ] } ] [ -w ] { FilesetName [ Level ]... | -f ListFile }
|
例如:reject 所有写在 ./reject.list 文件中的 applied 状态的软件包
installp -rBfX ./reject.list
|
如何卸载软件包
卸载软件包,也是使用 installp 命令来完成的。语法如下:
installp -u [ -eLogFile ] [ -VNumber ] [ -b ] [ -g ] [ -p ] [ -v ] [ -X ]
[ -O { [ r ] [ s ] [ u ] } ] [ -w ] { FilesetName [ Level ]... | -f ListFile }
|
例如:模拟卸载 bos.net.ipsec.rte 和所以他依赖的包
installp -ugp -V2 bos.net.ipsec.rte
|
这个命令将显示所有将被卸载的文件列表,但是并不会真的删除它们。
安装失败后如何清理环境
如果一个软件包安装失败,installp 将不能够再次安装这个软件包,直到用户删除了在失败点之前的成功安装。要清理失败的环境可以使用下面的命令:
installp -C [ -b ] [ -eLogFile ]
|
问 1:如何得到目前的 system level ?
答:使用 oslevel 命令,例如:
-bash-2.05b# oslevel -s
5300-01-00-0000
5300—VR
01---TL
00---SP
0000—SPdate
|
注:TL(Technical Level)指 AIX 操作系统的技术版本(以前称为 ML, Maintenance Level),包括硬件、软件的新功能和传统的补丁。SP( Service Pack) 是服务补丁版本,包括一些不能等到下一个 TL 推出的关键的补丁及非常有限的新硬件驱动。如果想了解具体有关信息,请参照《IBM AIX Operating System Service Strategy Details and Best
Practices》()。
问 2:在将系统到新的 TL 后,如果 oslevel 命令仍然报告是老的 TL,怎么办?
答:首先使用 oslevel –s 命令查看当前的 TL,例如:
bash-2.05b# oslevel -s
5300-01-00-0000
|
接下来,使用 oslevel –rl 命令查看哪些 fileset 版本低于新的 TL,需要升级
bash-2.05b# oslevel -rl 5300-03
Fileset Actual Level Recommended ML
-----------------------------------------------------------------------------
X11.adt.ext 5.3.0.0 5.3.0.30
X11.adt.include 5.3.0.0 5.3.0.30
X11.base.lib 5.3.0.10 5.3.0.30
X11.base.smt 5.3.0.10 5.3.0.30
X11.compat.lib.X11R5 5.3.0.10 5.3.0.30
|
接下来使用 installp 命令升级 oslevel 列出的 fileset 就可以了。
问 3: 列出一个 fileset 中的所有文件 ?
答:使用 lslpp 命令,例如:
bash-2.05b# lslpp -f bos.rte
Fileset File
----------------------------------------------------------------------------
Path: /usr/lib/objrepos
bos.rte 5.3.7.0 /
/usr/aix
/usr/lpp
/usr/lpp/bos
/usr/lpp/bos/inst_root
…
Path: /etc/objrepos
bos.rte 5.3.7.0 /usr
/lib -> /usr/lib
/dev
/etc
…
|
问 4: 如何列出一个文件属于哪个 fileset ?
答:使用 lslpp 命令,例如:
bash-2.05b# lslpp -w /opt/csm/pm/CSMDefs.pm
File Fileset Type
----------------------------------------------------------------------------
/opt/csm/pm/CSMDefs.pm csm.core File
|
问 5:如何列出一个 fileset 中没有被安装的文件?
答:使用 restore -qTvf 命令,例如:
bash-2.05b# restore -qTvf U805874.csm.hpsnm.bff
New volume on U805874.csm.hpsnm.bff:
Cluster 51200 bytes (100 blocks).
Volume number 1
Date of backup: Tue Oct 11 13:01:35 2005
Files backed up by name
User BUILD
0 ./
1113 ./lpp_name
0 ./usr
0 ./usr/lpp
0 ./usr/lpp/csm.hpsnm/csm.hpsnm/1.4.1.12
16682 ./usr/lpp/csm.hpsnm/csm.hpsnm/1.4.1.12/liblpp.a
0 ./usr/lpp/csm.hpsnm/csm.hpsnm/1.4.1.12/inst_root
1178 ./usr/lpp/csm.hpsnm/csm.hpsnm/1.4.1.12/inst_root/liblpp.a
…
6812032 ./usr/websm/codebase/pluginjars/hsc.jar
total size: 78826891
files archived: 54
|
问 6:如何从一个 fileset 中直接得到文件?
答:使用 restore -qxvdf 命令,例如:
bash-2.05b# ls -al csm.core
-rw-r--r-- 1 root system 2744320 Feb 11 17:02 csm.core
-bash-2.05b# restore -qxvdf csm.core
New volume on csm.core:
Cluster 51200 bytes (100 blocks).
Volume number 1
Date of backup: Thu Sep 7 08:04:51 2006
Files backed up by name
User BUILD
x 0 ./
x 3804 ./lpp_name
x 0 ./usr
x 0 ./usr/lpp
…
x 774 ./opt/csm/samples/mkres/IBM.Sensor/MySensor.pm
total size: 3868461
files restored: 166
-bash-2.05b# du -m opt/
0.03 opt//csm/install/defs
0.71 opt//csm/install/pkgdefs
0.76 opt//csm/install
0.03 opt//csm/pm/Rpm/Child
0.10 opt//csm/pm/Rpm
1.38 opt//csm/pm
0.05 opt//csm/lib
0.00 opt//csm/samples/mkres/IBM.Association
0.00 opt//csm/samples/mkres/IBM.Condition
0.02 opt//csm/codebase
0.00 opt//csm/man/cat1
0.00 opt//csm/man/cat5
0.04 opt//csm/man/man1
0.01 opt//csm/man/man5
0.05 opt//csm/man
3.83 opt//
|
问 7. 如何列出一个 archive 文件中的内容 ?
答:使用 ar –t 命令,例如:
bash-2.05a# ar -v -t /usr/lib/libcfg.a
rwxr-x--- 300/300 122917 Oct 5 02:58 2007 shr.o
|
问 8. 如何从一个 archive 中得到文件 ?
答:使用 ar –x 命令,例如
bash-2.05a# ar -v -x /usr/lib/libcfg.a
x - shr.o
bash-2.05a# ls shr.o
shr.o
|
AIX 对软件包的管理功能非常强大,lpp 结构的软件包使用起来也非常灵活。但是,和其他 UNIX 上的软件包使用上还是有很大的不同之处,由于篇幅所限,本文所涉及的内容非常有限,作为 AIX 系统管理员,只有在日常的工作做多总结,才能做到随心所欲对 AIX 软件包进行管理