BigAdmin System Administration Portal
专题文章
Print-friendly VersionPrint-friendly Version

Solaris 10 操作系统中的区域“附加时更新”功能和修补程序的应用

Enda O'Connor,2009 年 6 月

简介

从 Solaris 10 5/08 操作系统开始,系统管理员已能够分离和附加区域,即,从一个系统中分离某个区域,然后将该区域附加到另一个系统。最初,这项功能存在一些局限性,因为源系统和要附加非全局区域的目标系统必须在软件包版本、修补程序级别和体系结构方面具有相同的软件级别。也就是说,您无法将 sun4v 系统中的某个区域移至 sun4u 系统,或无法将早期 Solaris 发行版中的某个区域移至当前 Solaris 更新发行版。

在 Solaris 10 10/08 发行版中,通过“附加时更新”命令(即 zoneadm attach-u 参数)提供了新的功能。

本文将介绍该“附加时更新”功能,其中包括以下主题:

确定要更新软件包的标准

在使用“附加时更新”功能时,要附加的区域会根据以下逻辑更新到与全局区域相同的软件级别,该逻辑可以确定更新哪些软件包:

  1. 如果非全局区域中的某个软件包具有 SUNW_PKG_ALLZONES=true 设置,则会选择更新该软件包。
  2. 如果某个软件包向继承的软件包目录传输文件,则会选择更新该软件包。(“继承的软件包目录”是指由非全局区域从全局区域继承的目录。默认情况下,稀疏区域继承 /usr/lib/platform/sbin。通过 zonecfg 命令的 add inherit-pkg-dir 子命令添加的任何目录都是继承的软件包目录。)
  3. 上述第 1 项或第 2 项中的软件包所依赖的任何软件包也会进行更新,无论该软件包的 SUNW_PKG_ALLZONES 如何设置,也无论该软件包是否向继承的软件包目录传输文件。

一旦选择更新某个软件包,将会使用最初安装区域时对该软件包进行安装的过程,执行下列操作:

  • 从要更新的非全局区域中删除该软件包
  • 将全局区域(在其中附加非全局区域)中的假脱机软件包安装到要附加的非全局区域

例如,如果更新 SUNWcsr,则会使用全局区域中的 /var/sadm/pkg/SUNWcsr/save/pspool/SUNWcsr/ 目录置备要附加的非全局区域中的更新 SUNWcsr 软件包。该目录是最初在执行 zoneadm install 命令过程中,置备新的非全局区域中的 SUNWcsr 软件包所使用的目录。

下面将举例说明上述第 3 项:如果软件包 A 具有 SUNW_PKG_ALLZONES=true 设置,则会选择更新该软件包。软件包 A 依赖于软件包 B。软件包 B 没有 SUNW_PKG_ALLZONES=true 设置,而且它向 /etc 目录传输文件(因此上述第 1 项和第 2 项的条件均不满足)。但是,由于软件包 A 依赖于软件包 B,因此也会选择更新软件包 B。

对于非全局区域使用的继承的软件包目录而言,该选择标准非常重要。完全根非全局区域没有继承的软件包目录。因此,与运行相同软件级别的稀疏区域相比,它需要更新的软件包更少。

此外,还值得注意的是,全局区域中任何具有 SUNW_PKG_THISZONE=true 设置的软件包均会被自动跳过,即,如果该软件包存在于非全局区域中,将不对其更新。

“附加时更新”与常规升级之间的区别

在继续下面的部分之前,最好应了解一下使用任何支持的升级机制来执行标准升级与使用“附加时更新”功能之间的区别。执行标准升级时,所有本机 Solaris 非全局区域都会升级,即,它们会收到升级期间提供的任何新软件包和功能;过时软件包会被删除;并且就更新发行版中提供的修补程序和软件包版本而言,非全局区域和全局区域将处于相同的软件级别。

也就是说,更新映像会应用到全局区域和所有非全局区域。升级过程中,不执行任何与全局区域和非全局区域相关的依赖性检查,并且映像中包含的所有软件包会置于所有区域(包括全局区域)中。

与此不同,如果您使用“附加时更新”功能,将会获取全局区域和要更新的非全局区域的软件清单。然后,按照前面所述的三项标准,zoneadm 会确定更新非全局区域中的哪些软件包。

因此,如果您从系统中分离出所有非全局区域,然后使用近期更新发行版对全局区域执行标准升级,之后您对非全局区域使用“附加时更新”功能,这样所获得的结果将不同于您对升级时附加有这些非全局区域的整个系统执行标准升级的情况。更新中提供的任何新软件包将不会传播到附加的非全局区域,除非至少满足以下条件之一:

  • 软件包满足 SUNW_PKG_ALLZONES=true
  • 软件包向继承的软件包目录传输文件。
  • 满足 ALLZONES=true 和/或向继承的软件包目录传输文件的某个软件包依赖于新软件包。

任何过时软件包将不会删除,除非它们满足 ALLZONES=true 或向继承的软件包目录传输文件。

“附加时更新”功能的主要用途是让用户以最少的交互操作,将一个系统中的非全局区域迁移到另一个系统。在 Solaris 10 10/08 发行版之前,用户必须确保要附加的非全局区域与将附加非全局区域的系统具有完全相同的系统软件级别。使用区域“附加时更新”功能,系统管理员现在可以附加具有较低修补程序级别的区域,并且该区域会自动更新到与要附加到的全局区域相同的修补程序级别。现在,用户还可以将 sun4v 系统中的非全局区域迁移到 sun4u 系统,反之亦然。

“附加时更新”功能的一个主要用途是允许快速、简便地在不同系统之间迁移 Solaris 容器。(容器是指非全局区域和资源控制的组合。)下面将举例说明该用途:如果 Sun Fire T2000 服务器运行了五个容器,每个容器都运行特定的数据库,其中一个数据库的大小随时间而增大以致于超出了其预期规模,这样便可能会使系统资源耗尽,从而导致性能问题。如果不能将受影响的容器迁移到具有更高性能的系统上,最终用户必须把该容器及其软件和软件配置复制到另一系统上,然后最终实现从旧容器到新容器的转换。但是,通过区域迁移,此任务便可大大简化,因为受影响的容器现在可以与其数据库、配置和关联的工作负荷一起移至新系统,从而为该容器以及旧系统中的其余四个容器均增加了可用资源。

修补程序的应用和区域“附加时更新”

使用“附加时更新”功能可将非全局区域更新到与全局区域相同的修补程序级别,在使用该功能的同时也发现了许多有趣的事情。下面便是一个示例:在应用修补程序包之前,系统管理员可以分离所有非全局区域,然后将修补程序包应用到全局区域,应用修补程序包并重新引导系统之后,使用区域 zoneadm -z <zonename> attach -u 命令将非全局区域附加回全局区域,同时将其更新到与全局区域相同的修补程序级别。

执行此操作的主要原因是附加区域时对其更新要比连续修补区域快得多。此外,也可以运行多个 zoneadm attach 命令。存在的主要问题是,根据在全局区域中应用的修补程序的不同,以及与继承的软件包目录相关的非全局区域配置的不同,使用“附加时更新”功能获得的结果可能会与执行以下操作有所差异:在附加了所有非全局区域的情况下,使用 patchadd 对全局区域和非全局区域应用修补程序。

下面的示例(尽管该示例有些勉强)可能有助于解释这种差异是如何产生的。如果非全局区域中有一个是完全根区域,并且所应用的某个修补程序是修补 Mozilla Firefox(即修补程序 125539-05),则全局区域将应用 125539-05,但区域“附加时更新”功能将不更新该非全局区域中的 SUNWfirefox。因此,修补程序 125539-05 不会应用于该非全局区域。

如果您改为在附加有该区域的情况下使用 patchaddpatchadd 则会对该非全局区域应用 125539-05。这是因为,迁移区域的规划与升级区域不同。确定是否升级应用程序级别的软件(例如 SUNWfirefox)只能由系统管理员决定。因此,区域“附加时更新”功能将不更新应用程序级别的软件,而是留给系统管理员来做此类决定。另一方面,传统升级会升级介质上的所有软件。

此外,在完全根非全局区域中,除非安装了 SUNWupdatemgru,否则不会更新修补实用程序要应用到的软件包。这意味着,实际上,除非在完全根非全局区域中安装了 SUNWupdatemgru,否则如果全局区域中安装了较新的修订版,该区域将会与全局区域不同步,因为修补实用程序 110254/119255 没有同步更新。

这是因为,119254/119255 修补 SUNWswmtSUNWinstall-patch-utils-rootSUNWpkgcmdsu 软件包,它们均满足 SUNW_PKG_ALLZONES=false。此外,由于完全根区域中没有继承的软件包目录,因此不会选择更新这些软件包,除非其中安装了 SUNWupdatemgru,原因是 SUNWupdatemgru 满足 SUNW_PKG_ALLZONES=true 并依赖于 SUNWswmt,而后者又依赖于 SUNWinstall-patch-utils-rootSUNWpkgcmds

因此,SUNWswmtSUNWinstall-patch-utils-rootSUNWpkgcmds 都会被选定进行更新,原因是 SUNWupdatemgru 依赖于 SUNWswmt,而后者又依赖于 SUNWinstall-patch-utils-rootSUNWpkgcmds

通常情况下,SUNWupdatemgruSUNWzonerSUNWzoneu 位于同一安装元群集中,因此,它会安装在任何非全局区域中。但是,如果通过安装最小元群集置备了系统,然后,添加了区域软件包,则由于未安装 SUNWupdatemgru,附加时不会更新任何完全根非全局区域中的修补实用程序软件包。

所有软件包在更新时将首先从非全局区域中删除,然后使用最初安装该区域时所用的相同功能从全局区域重新安装这些软件包。(由于 CR 6818813,计划在以后的更新发行版中更改此功能。在修复 CR 6818813 之后,如果选择更新的任何软件包版本与全局区域中安装的软件包版本匹配,将不会删除该软件包,而只是替换非全局区域中的软件包。这也会提升“附加时更新”功能的性能。)

因此,“附加时更新”功能也会用到最初安装区域时所用的功能。对于更新的软件包,其所有修补软件包 undo.Z 包都是从全局区域继承到要附加的非全局区域的。如果全局区域应用了大量修补程序,并且要附加的非全局区域是从应用了极少修补程序或未应用修补程序的系统中分离的,则这会导致该非全局区域所占的内存空间显著增加。

如果最终用户只是使用 patchadd 修补全局区域和所有非全局区域,则会在所修补的每个非全局区域中生成 undo.Z,而且它仅包含该非全局区域中实际替换掉的文件。对于稀疏区域,这意味着 patchadd 所创建的 undo.Z 不包含 /lib/platform/bin/sbin 中的任何文件。因此,其大小会小于使用区域“附加时更新”功能从全局区域继承的 undo.Z

完全根区域与稀疏根区域之间的区别

如果使用“附加时更新”功能分别对某个稀疏根区域和某个完全根区域(这两个区域同时在同一系统上置备,因此它们具有相同的软件包和修补程序级别)进行更新并比较其结果,则会发现两个区域中选择更新的软件包数量有所不同。因此,对于创建于 Solaris 10 5/08 操作系统中并更新到 Solaris 10 10/08 级别的稀疏根区域,会选择更新 505 个软件包;而对于完全根区域,则会选择更新 311 个软件包。

鉴于此,在考虑使用区域“附加时更新”功能加快修补过程之前,您需要了解下列两种操作之间的差异:一种是使用“附加时更新”功能将非全局区域更新到与全局区域相同的修补程序级别,另一种是在附加了所有非全局区域并且可对这些区域应用修补程序的情况下仅使用 patchadd

处理存在的临时诊断援助 (Interim Diagnostic Relief, IDR) 修补程序和特殊修补程序

如果要附加的非全局区域中安装了 Sun 提供的 IDR 修补程序,则要么必须将完全相同的 IDR 应用到目标全局区域,要么必须在分离源非全局区域之前从该区域中删除 IDR。(Solaris 10 5/09 操作系统通过向 zoneadm attach 命令提供 -b 参数,解决了这一问题,使用该参数可在附加非全局区域时删除 IDR。)

此外,对于存在的所谓“特殊修补程序”(仅在构建 Solaris 10 更新映像时使用且从未发行过的修补程序),也必须进行适当处理。当前发行的修补程序 140197 中的 CR 6743776 对特殊修补程序进行了说明。Solaris 10 5/09 操作系统的修补程序 139555-08 所提供的 CR 6791625 介绍了处理这些特殊修补程序的永久解决方案。

运行“附加时更新”的步骤

1. 在源系统上,运行 zoneadm -z <zonename> detach。(注意:分离功能是在 Solaris 10 5/08 操作系统中引入的。)

2. 将 zonepath 移至目标系统。

3. 如果目标全局区域未处于内核修补程序级别 139555(Solaris 5/09 或更高更新级别),则运行以下命令,以强制重新生成源非全局区域软件包。相关 CR 为 6685069。

#rm <zonepath>/SUNWdetached.xml

4. 使用 zonecfg 在目标系统上重新配置该区域。

5. 最后,运行以下命令:

#zoneadm -z <zonename> attach -u

有关迁移区域所需执行步骤的完整描述,请参见 How to Migrate a Non-Global Zone(如何迁移非全局区域)。

Solaris 10 5/09 中的错误报告功能也进行了改进。在以前的发行版中,如果认为某个软件包需要降级(即,要附加的非全局区域中的软件包版本高于其附加到的源全局区域中的软件包版本),则会逐个报告每个实例。也就是说,zoneadm attach -u 一次只报告一个错误。在 Solaris 10 5/09 操作系统中,首次调用 zoneadm attach -u 命令时,一次可报告所有错误。

更多信息

下面提供了一些其他资源:


Comments (latest comments first)

Discuss and comment on this resource in the BigAdmin Wiki

Unless otherwise licensed, code in all technical manuals herein (including articles, FAQs, samples) is provided under this License.


BigAdmin