在 Oracle Solaris 11 上使用映像包管理系统 (IPS) 进行高级管理

2011 年 11 月

作者:Glynn Foster

深入探究高级 IPS,了解如何确定软件包依赖项、查看清单、执行高级搜索以及分析系统状态。


Oracle Solaris 11 采用了一种新方法来进行生命周期和软件包管理,极大地简化了系统软件的管理过程,有助于降低操作系统维护的风险,包括减少意外停机和计划停机。使用映像包管理系统 (IPS),管理员可以使用大幅改进和现代化的过程从本地连接或远程软件包信息库安装和更新软件。

如果想要下载软件、加入论坛、阅读类似本文的内容之外的其他技术方法精品文章,请成为 OTN 成员。无垃圾邮件!

在另一篇文章 Oracle Solaris 11 映像包管理系统 (IPS) 基础知识简介中,我们介绍了基础管理知识,包括如何安装和卸载软件包、如何发现有关系统上安装的和信息库中的软件包的基本信息,以及如何更新系统。

本文介绍 IPS 使用方面的高级主题,包括详细说明不同的软件包依赖项、查看软件包清单、使用高级搜索查询、浏览日志和从意外事件恢复。要了解有关 IPS 的更多信息,请查看 Oracle 技术网的 IPS 技术聚焦页面上的各种内容。另请参见 Oracle Solaris 11 映像包管理系统速查表

了解软件包依赖项

很多情况下,一个软件包依赖于另一个软件包。例如,一个软件包可能需要另一个软件包中的功能才能正常工作或安装。软件包之间的这些关系(即依赖项)对于自动化进行软件包安装操作以及将系统软件升级到已知的、经过良好测试的状态十分重要。IPS 支持软件包之间的许多不同关系,表 1 列出了其中一些关系。

表 1. 软件包关系
依赖项说明
require该依赖项是必需的。如果一个软件包所必需的依赖项中有任何一项无法满足,则无法安装该软件包。
optional如果系统上已经存在此依赖项,则其版本必须为指定版本级别或更高版本级别。
exclude此依赖项将强制实施这样的限制:对于要安装的软件包来说,如果存在指定或更高版本级别的指定软件包,则不能安装该软件包。
incorporate此依赖项是可选的,但版本范围有上限和下限,只允许在现有序列中添加进一步的点分整数。
conditional仅当系统上安装了另一个谓词软件包时才需要此依赖项。这通常用于使软件包仅在系统上已经存在某些功能(如 X11 或语言绑定)时才为这些功能提供支持。
group除非软件包是在避免列表上(此时系统将尝试避免安装此软件包),否则需要此依赖项。不过,如果另一个软件包要求此依赖项,则无论此软件包是否在避免列表上都会安装。
parent此依赖项用于确保全局区域和非全局区域对所有内核组件及跨区域边界的任何软件保持同步。

我们通过查看所谓软件包清单 中对软件包的描述来看一看 IPS 如何表达这些关系。

查看软件包清单

软件包清单说明软件包的组装方式并提供有关该软件包的基本信息(如名称、版本、描述、分类等)、该软件包所包括的文件,以及依赖于哪些其他软件包或服务来满足其依赖项。尽管许多软件包命令能以便于呈现的形式筛选出此信息,有时直接使用 pkg contents -m 命令查看软件包清单也很有用,如清单 1 所示。

清单 1:查看软件包清单
# pkg contents -m gzip
set name=pkg.summary value="GNU Zip (gzip)"
set name=pkg.description value="The GNU Zip (gzip) compression utility"
set name=variant.arch value=i386 value=sparc
set name=info.classification \
value="org.opensolaris.category.2008:Applications/System Utilities"
set name=info.source_url value=http://alpha.gnu.org/gnu/gzip/gzip-1.3.5.tar.gz
set name=opensolaris.arc_url value=http://arc.opensolaris.org/caselog/PSARC/2008/488
license 91533ecafdca90d38563499351a030e497bc9dae \
chash=33000d74d113ed003308b6b2c6f6565597517ab8 license=SUNWgzip.copyright \
pkg.csize=657 pkg.size=1278
set name=org.opensolaris.consolidation value=userland
set name=info.upstream_url value=http://directory.fsf.org/GNU/gzip.html
depend fmri=pkg:/system/library@0.5.11-0.75.0.0.0.0.0 type=require
depend fmri=pkg:/shell/bash@4.1.9-0.175.0.0.0.525 type=require
dir group=sys mode=0755 owner=root path=usr
dir group=sys mode=0755 owner=root path=usr/bin
dir group=sys mode=0755 owner=root path=usr/share
dir facet.doc.info=true group=bin mode=0755 owner=root path=usr/share/info
dir facet.doc.man=true group=bin mode=0755 owner=root path=usr/share/man
dir facet.doc.man=true group=bin mode=0755 owner=root path=usr/share/man/man1
file c62b206499c0a4d8d001ba11535bca174b560e0d \
chash=3ed74ac7fa132f4ae5a708693d01836a157e3157 group=bin mode=0555 \
owner=root path=usr/bin/gzdiff pkg.csize=843 pkg.size=1983
file 3dd5f1cc40a1f4905f38de0e63c8014d4859bafc \
chash=265d006e043a0e1be102dd657d9d948e35389d24 group=bin mode=0555 \
owner=root path=usr/bin/gzgrep pkg.csize=1286 pkg.size=2953
file 146b8d4d51585df4af0f119e42e9ab6640aa4e97 \
chash=2261abcd4128f9a37757925583db89d2cf86caa8 elfarch=sparc \
elfbits=32 elfhash=da755339ab13a8e0ee46e645360674fac22c821c \
group=bin mode=0555 owner=root path=usr/bin/gzip pkg.csize=40521 \
pkg.size=67840 variant.arch=sparc
file 3040df3097d8301929cc5d784006e06a8403a611 \
chash=d89a6fc5dc477dd3d746da4fd42d332181a57b3e elfarch=i386 \
elfbits=32 elfhash=e104a125d6921a36ad6e8df471c772da28a2fa34 \
group=bin mode=0555 owner=root path=usr/bin/gzip pkg.csize=34020 \
pkg.size=71696 variant.arch=i386
....

清单中的每一行称为一个操作。操作描述整个软件包的一小部分。每行的第一部分描述操作类型:setlicensedependdirfile 等等。在清单中部,可以看到软件包依赖项的表达方式。在本例中,软件包有两个依赖项:一个用于 pkg:/shell/bash,一个用于 pkg:/system/library,如下所示。

depend fmri=pkg:/shell/bash@4.1.9-0.175.0.0.0.525 type=require
depend fmri=pkg:/system/library@0.5.11-0.75.0.0.0.0.0 type=require

注意,其中包括了用于不同架构(SPARC 和 x86)的两个版本的 /usr/bin/gzip 二进制可执行文件,如清单 2 所示。

清单 2:在软件包清单中指定 SPARC 和 x86 二进制可执行文件
file 146b8d4d51585df4af0f119e42e9ab6640aa4e97 \
chash=2261abcd4128f9a37757925583db89d2cf86caa8 elfarch=sparc \
elfbits=32 elfhash=da755339ab13a8e0ee46e645360674fac22c821c \
group=bin mode=0555 owner=root path=usr/bin/gzip pkg.csize=40521 \
pkg.size=67840 variant.arch=sparc
file 3040df3097d8301929cc5d784006e06a8403a611 \
chash=d89a6fc5dc477dd3d746da4fd42d332181a57b3e elfarch=i386 \
elfbits=32 elfhash=e104a125d6921a36ad6e8df471c772da28a2fa34 \
group=bin mode=0555 owner=root path=usr/bin/gzip pkg.csize=34020 \
pkg.size=71696 variant.arch=i386

能够在一个软件包中包括对不同架构的支持是一项名为变体 的重要 IPS 特性。根据系统架构的不同,IPS 将知道在系统上安装哪个版本。从开发和管理的角度来看,此特性可极大地降低维护各个软件包并保持它们同步所需的工作量,并可降低存储成本,因为对于与架构无关的软件包部分您只需要一个版本。另一篇文章如何在 Oracle Solaris 11 上创建软件包并将其发布到 IPS 信息库介绍了有关软件包清单及其创建过程的详细信息。

我们已经快速浏览了软件包清单,下面来看看一些复杂的搜索示例。

高级搜索

pkg contentspkg search 命令用于查看和搜索软件包内容。这两个命令彼此类似,可用于提供类似的信息,尤其是当以管道方式传递到其他命令进行筛选时。

通常,在安装软件包之前,可以看看由于准备安装的软件包中指定的依赖项而将要安装哪些软件包,这比较有用。我们来看看使用 pkg contents 命令的一个具体示例。我们将使用 -r 选项从远程信息库取得结果,因为我们想查询未安装的软件包而不是已安装的软件包。

# pkg contents -r -o fmri,type -t depend php-52
FMRI                                                     TYPE
pkg:/compress/bzip2@1.0.6-0.175.0.0.0.525                require
pkg:/image/library/libjpeg@6.0.2-0.175.0.0.0.0.0         require
pkg:/image/library/libpng@1.4.8-0.175.0.0.0.0.0          require
pkg:/library/libxml2@2.7.6-0.175.0.0.0.0.525             require
pkg:/library/libxslt@1.1.26-0.175-0.0.0.0.525            require
....

输出在第一列显示 PHP 依赖的软件包(已安装或未安装)列表(由软件包清单中 fmri 属性的值表示),并在第二列中显示依赖类型的列表(由软件包清单中 type 属性的值表示)。

在本例中,我们获取了为成功安装该软件包所需的所有依赖项的列表。还要注意,我们使用 -r 标志启用了对信息库的查询而非本地查询,因为系统上尚未安装 PHP 软件包。使用 pkg search 也可以显示类似的输出,如下所示:

# pkg search -o search.match,search.match_type 'web/php-52@:depend::'
SEARCH.MATCH                                             SEARCH.MATCH_TYPE
pkg:/compress/bzip2@1.0.6-0.175.0.0.0.525                require
pkg:/image/library/libjpeg@6.0.2-0.175.0.0.0.0.0         require
pkg:/image/library/libpng@1.4.8-0.175.0.0.0.0.0          require
pkg:/library/libxml2@2.7.6-0.175.0.0.0.0.525             require
pkg:/library/libxslt@1.1.26-0.175-0.0.0.0.525            require
....

pkg contentspkg search 命令彼此类似;都用于向系统查询软件包的内容。contents 命令显示一个或多个软件包中的操作,并基于您所选择的选项筛选输出。search 命令从另一个方向来进行查询,它查找包含用户所提供标记的软件包。

在本示例的第一列中(由搜索软件包名称匹配项表示),我们得到了软件包的列表;在第二列中(由匹配类型表示),我们得到了依赖项类型的列表。

search 命令使用采用 pkg_name:action_type:key:token 形式的字段或结构化查询。在本例中,我们使用 web/php-52@ 作为软件包名称,因为我们要搜索 pkg:/web/php-52 而不是其他匹配项,例如 pkg:/web/php-52/extensions/php-pear。在本例中,action_typedepend

其他两个字段保留为空白,因为我们想搜索所有依赖项。如果我们想要更特定的信息,例如,我们可以指定 require 作为关键字并将 *zlib 设置为标记,以确定 pkg:/web/php-52 是否对 pkg:/library/zlib 有必需的依赖项(实际确实如此)。

作为另一个示例,我们反过来看看哪些已安装的软件包对 pkg:/library/libxml2 存在必需的依赖项。继续使用 pkg search 命令,如清单 3 所示。

清单 3:使用搜索确定已安装软件包的依赖项
# pkg search -l -o pkg.name 'depend:require:library/libxml2'
PKG.NAME
system/library/libdbus-glib
system/zones
desktop/calculator/gcalctool
system/library
library/gnome/gnome-libs
desktop/system-monitor/gnome-system-monitor
SUNWcs
desktop/xscreensaver
desktop/compiz/library/libcompizconfig
....

在本示例中,我们使用 -l 标志来搜索已安装的软件包。使用 IPS 还可以进行许多其他搜索,对此您可以参考手册页面或正式文档。

分析系统状态

如果发生意外情况,可能需要进一步地分析系统状态。还有三个 IPS 命令,您可以用它们来检查给定系统上执行的所有软件包操作的历史日志记录,检查系统上安装的某个软件包或一组软件包的有效性,如果存在问题则进行修复。

要检查所有软件包操作的历史日志记录,请使用 pkg history 命令,如清单 4 所示。

清单 4:检查所有软件包操作的历史日志记录
# pkg history
START               OPERATION              CLIENT          OUTCOME
2011-05-23T00:48:32 set-property           transfer module Succeeded
2011-05-23T00:48:32 add-publisher          transfer module Succeeded
2011-05-23T00:48:32 refresh-publishers     transfer module Succeeded
2011-05-23T00:48:32 image-create           transfer module Succeeded
2011-05-23T00:48:45 rebuild-image-catalogs transfer module Succeeded
2011-05-23T00:48:55 set-property           transfer module Succeeded
2011-05-23T00:48:55 install                transfer module Succeeded
2011-05-23T00:02:39 uninstall              transfer module Succeeded
2011-05-23T01:02:39 update-publisher       transfer module Succeeded
2011-05-30T23:11:36 install                pkg             Succeeded
2011-05-31T00:11:01 refresh-publishers     pkg             Succeeded
2011-05-31T00:11:01 install                pkg             Failed
....

该输出按日期排序,列出了已执行的操作以及操作的调用者(在本例中,transfer module 是在此系统的安装过程中,pkg 是命令行客户端)。另外,可以使用一组日期戳轻松搜索历史记录,在本例中为 2011 年 10 月 1 日到 2011 年 10 月 18 之间的所有软件包命令,如下所示:

# pkg history -t 2011-10-01T00:00:00-2011-10-18T00:00:00
START               OPERATION              CLIENT          OUTCOME
2011-10-04T02:24:53 update                 pkg             Succeeded
2011-10-04T02:24:54 refresh-publisher      pkg             Succeeded
2011-10-04T02:25:55 rebuild-image-catalogs pkg             Succeeded
2011-10-04T05:13:47 add-publisher          pkg             Succeeded
....
2011-10-16T20:45:23 update                 pkg             Succeeded
2011-10-16T20:45:53 rebuild-image-catalogs pkg             Succeeded

还可以使用 pkg history - o 输出一些不同的列标题,包括完成打包操作所需时间、操作应用到哪个引导环境、启动操作的用户等选项。

# pkg history -o user,be,time,command -t 2011-10-01T00:00:00-2011-10-18T00:00:00
USER   BE        TIME      COMMAND
root   solaris   1:04:51   /usr/bin/pkg update
root   solaris   0:01:13   /usr/bin/pkg update
root   solaris   0:00:12   /usr/bin/pkg update
root   solaris-1 0:00:16   /usr/bin/pkg unset-publisher myrepo
root   solaris-1 0:03:47   /usr/bin/pkg install wireshark
root   solaris-1 0:00:02   /usr/bin/pkg refresh
....

虽然 ZFS 快照和克隆是非常好的从系统错误恢复的方式,但 IPS 还提供了对系统上的软件包安装进行验证的工具。使用 pkg verify 命令,您可以检查特定软件包或软件包组:

# pkg verify -v gzip
Verifying: PACKAGE                STATUS
pkg://solaris/compress/gzip       OK

在本例中,我们使用 -v 标志获取有关命令行的更多信息。如果未使用 -v 标志,则若软件包验证成功将不会有输出。

例如,我们故意对 /usr/bin/gzip 进行一些修改,在它顶部写入 1024 字节,然后再次尝试验证过程:

# mkfile 1024 /usr/bin/gzip
# pkg verify -v gzip
Verifying: PACKAGE                STATUS
pkg://solaris/compress/gzip       ERROR
	file: usr/bin/gzip
		Mode: 01600 should be 0555
		Unexpected Exception: Request error: class file/memory mismatch

IPS 检测到文件 /usr/bin/gzip 上的权限错误并引发异常,因为它不能有效检查二进制可执行文件的 ELF 头。幸运的是,我们可以使用 pkg fix 命令快速修复此问题,如清单 5 所示。

清单 5:修复软件包问题
# pkg fix gzip
Verifying: PACKAGE				ERROR
	file: usr/bin/gzip
		Mode: 01600 should be 0555
		Unexpected Exception: Request error: class file/memory mismatch
Created ZFS snapshot: 2011-06-30-05:24:15
Repairing: pkg//solaris/compress/gzip

DOWNLOAD				PKGS	FILES	XFER (MB)
Completed				 1/1  324/314   0.0/0.0

PHASE							ACTIONS
Update Phase						    3/3

PHASE							  ITEMS
Image State Update Phase				    2/2

如输出中所示,IPS 快速下载相应的内容并修复软件包。在本例中,由于内容缓存在系统上,因此 IPS 不必下载任何内容。

总结

Oracle Solaris 11 映像包管理系统是软件管理领域的一项重大进展,为系统更新提供集成的用户体验并提高安全性。IPS 通过提供改进的自动化和审计将管理 Oracle Solaris 的许多复杂性消弥于无形,从而允许管理员跨操作系统的虚拟和非虚拟实例灵活管理多个应用程序环境。

更多信息

下面是其他一些资源:

修订版 1.0,2011 年 11 月 2 日