2011 年 11 月
作者:Glynn Foster
Oracle Solaris 11 采用了一种新方法来进行生命周期和软件包管理,极大地简化了系统软件的管理过程,有助于降低操作系统维护的风险,包括减少意外停机和计划停机。使用映像包管理系统 (IPS),管理员可以使用大幅改进和现代化的过程从本地连接或远程软件包信息库安装和更新软件。
|
在另一篇文章 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 所示。
# 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 ....
清单中的每一行称为一个操作。操作描述整个软件包的一小部分。每行的第一部分描述操作类型:set
、license
、depend
、dir
、file
等等。在清单中部,可以看到软件包依赖项的表达方式。在本例中,软件包有两个依赖项:一个用于 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 所示。
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 contents
和 pkg 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 contents
和 pkg 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_type
为 depend
。
其他两个字段保留为空白,因为我们想搜索所有依赖项。如果我们想要更特定的信息,例如,我们可以指定 require
作为关键字并将 *zlib
设置为标记,以确定 pkg:/web/php-52
是否对 pkg:/library/zlib
有必需的依赖项(实际确实如此)。
作为另一个示例,我们反过来看看哪些已安装的软件包对 pkg:/library/libxml2
存在必需的依赖项。继续使用 pkg search
命令,如清单 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 所示。
# 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 所示。
# 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 日 |