文章
服务器与存储开发
作者:Ginny Henningsen,2011 年 8 月
第 1 部分 — 利用 IPS 更新软件的最佳方法
第 2 部分 — 自动采集 ZFS 快照和跟踪软件更新的最佳方法本文是重点介绍 Oracle Solaris 11 Express 中软件更新最佳实践的系列文章的第三篇。第一篇文章介绍了 IPS 软件包管理模型,并重点介绍了在执行更新前创建新引导环境 (BE) 的最佳实践。第二篇文章讨论了 Time Slider 和自动快照服务,说明了如何初始化和使用这些服务,以便定期获得 BE 和 ZFS 卷的快照。
第三篇文章将更深入地探讨软件更新这个主题,探索配置有区域的 Oracle Solaris 11 Express 系统的更新过程。该主题特别有必要在此讨论,因为该版本中的区域与 Oracle Solaris 10 中的区域有所不同,针对分区系统的软件升级过程也有所不同。
请注意,Oracle Solaris 11 发布后,它将改变和简化区域的创建和升级过程。本文仅关注目前如何在 Oracle Solaris 11 Express 中执行区域升级,当这一过程改变时本文将进行更新。有关参考信息,请参阅 Oracle Solaris 11 Express 的文档全集。
区域是在 Oracle Solaris 10 中首次引入的,是用于隔离负载的内置的轻型虚拟机(请参见系统管理指南:Oracle Solaris 区域、Oracle Solaris 10 Containers 和资源管理)。一个区域内的进程仅限于访问该区域内的资源,它们不能干扰其他区域中的进程或资源。全局区域包含核心操作系统 (OS),管理员可以定义多个非全局区域来隔离用户级别的负载。
从功能性角度来看,Oracle Solaris 10 和 Oracle Solaris 11 Express 中的区域类似,但也存在一些显著差异,表 1 对此进行了总结。
表 1:Oracle Solaris 10 和 Oracle Solaris 11 Express 之间区域的差异| 特性 | Oracle Solaris 10 | Oracle Solaris 11 Express |
|---|---|---|
| 全局区域标记 | 标记为“native” | 标记为 ipkg 并基于新的 IPS 软件包管理模型 |
| 非全局区域标记 | 标记为“native”区域或标记为 Linux、Solaris 8 或 Solaris 9 标记区域 | 标记为 ipkg 区域或 solaris10 区域;请参见 手册页面第 5 部分:标准、环境和宏中的 solaris10(5) 手册页面 |
| 非全局区域根 | 完全根区域或稀疏根区域(稀疏根区域共享可执行文件的代码段和全局区域中的共享库) | 仅完全根区域且驻留在自己的 ZFS 数据集上 |
| 非全局区域内容 | 程序包必须与全局区域中的相同 | 非全局区域中的程序包与全局区域中的程序包可以不同 |
| 需要修补应用程序吗? | 需要,可并行应用于多个区域 | 不需要修补(pkg 更新取代修补) |
| 升级全局区域的同时,是否也更新非全局区域? | 是 | 否 |
如表 1 所示,Oracle Solaris 11 Express 中的 ipkg 区域仅是“完全根区域”且驻留在自己的 ZFS 数据集上。正如 Jeff Savit 在其博客(“迈入 11 版时代 — Oracle Solaris 11 Express 特性”)中介绍的那样,在 Oracle Solaris 11 Express 中创建非全局区域可利用 ZFS 克隆,这样自然可以节省空间。(Jeff 的博客进一步解释了如何在 Oracle Solaris 11 Express 上安装 solaris10 标记区域。)
在 Oracle Solaris 11 Express 中升级区域与在 Oracle Solaris 10 中升级区域不同。目前,Oracle Solaris 11 Express 中的 ipkg 标记区域不会随全局区域更新而更新。我们正在设法让区域更新能够并行进行,但在 Oracle Solaris 11 发布之前,必须手动更新 Oracle Solaris 11 Express 中的非全局区域。
记住 Oracle Solaris 11 Express 的最佳实践:
手动更新非全局区域,与全局区域保持同步。
此时,更新 Oracle Solaris 11 Express 中的非全局区域类似于将非全局区域迁移到其他服务器;在这两种情况下,必须将非全局区域的系统软件更新到与全局区域相同的版本级别。Oracle Solaris 11 Express 中的全局区域内容和非全局区域内容可以存在区别,但是特定版本级别必须保持同步。
本文逐步介绍一个在 Oracle Solaris 11 Express 上创建区域的简单示例以及当前更新全局和非全局区域的最佳实践。请注意,除非是从现有的非全局区域克隆区域,否则目前安装非全局区域需要网络连接并访问 Oracle Solaris 11 Express 程序包信息库。
为了做好准备,我们先在 Oracle Solaris 11 Express 中创建一个非全局区域。在 Oracle Solaris 11 Express 中创建非全局区域的过程类似于在 Oracle Solaris 10 中定义一个非全局区域。首先,配置非全局区域、安装该区域,然后再引导该区域。Oracle Solaris 11 Express 提供了一些新配置选项(例如,构建虚拟网络的选项;请参见 Jeff Victor 有关该主题的博客文章),但大多数情况下,区域配置基本相同。一个显著区别是,Oracle Solaris 11 Express 区域必须位于自己的 ZFS 数据集上,可以在配置区域前显式创建这个 ZFS 数据集:
# zfs create rpool/zones |
(本文中所有命令示例都假设用户为特权用户。请参见 Oracle Solaris 11 Express 入门中的“用户帐户、角色和权限配置文件”。)
以下命令为 ZFS 数据集 rpool/zones 定义了一个挂载点:
# zfs set mountpoint=/export/zfs rpool/zones |
如果您已经知道如何配置和安装区域,请跳过这一部分,直接阅读如何升级全局区域?如果您是区域方面的新手,下面几段内容逐步介绍了配置和安装的过程。
以下命令将在之前创建的 ZFS 数据集上配置一个新的名为 my-zone 的非全局区域:
# zonecfg -z my-zone my-zone: No such zone configured Use 'create' to begin configuring a new zone. zonecfg:my-zone> create zonecfg:my-zone> set zonepath=/export/zfs/my-zone zonecfg:my-zone> add net zonecfg:my-zone:net> set address=192.168.1.99 zonecfg:my-zone:net> set physical=e1000g0 zonecfg:my-zone:net> end zonecfg:my-zone> verify zonecfg:my-zone> commit zonecfg:my-zone> exit |
对于 Oracle Solaris 11 Express,区域安装访问 IPS 包信息库,从引用信息库或默认信息库提取程序包。默认情况下,区域安装使用位于 http://pkg.oracle.com/solaris/release 的版本信息库中的程序包:
# zoneadm -z my-zone install
A ZFS file system has been created for this zone.
Publisher: Using solaris (http://pkg.oracle.com/solaris/release/ ).
Image: Preparing at /zones/my-zone/root.
Cache: Using /var/pkg/download.
Sanity Check: Looking for 'entire' incorporation.
Installing: Core System (output follows)
------------------------------------------------------------
Package:
pkg://solaris/consolidation/osnet/osnet-incorporation@0.5.11,5.11-0.151.0.1:20101104T230646Z
License: usr/src/pkg/license_files/lic_OTN
.
.
.
Done: Installation completed in 371.635 seconds.
Next Steps: Boot the zone, then log into the zone console (zlogin -C)
to complete the configuration process.
|
启动区域并登录其控制台完成配置:
# zoneadm -z my-zone boot # zlogin -C my-zone [Connected to zone 'my-zone' console] |
此时,指定最终安装参数(主机名、名称服务、语言、地区、时区、root 口令等)。安装结束时,显示以下消息并启用区域登录:
System identification is completed. . . . my-zone console login: |
在全局区域中,以下命令可显示所有区域的状态:
# zoneadm list -iv ID NAME STATUS PATH BRAND IP 0 global running / ipkg shared 1 my-zone running /export/zfs/my-zone ipkg shared |
作为预防措施或者为了加快供应,您可以选择在一个区域处于非活动状态时对其进行克隆。首先,暂停非全局区域,然后导出其配置:
# zoneadm -z my-zone halt # zonecfg -z my-zone export -f /export/zfs/master |
编辑区域配置,根据需要更改区域路径、网络定义及其他参数:
# vi /export/zfs/master |
配置并克隆区域,然后引导非全局区域及其克隆副本:
# zonecfg -z my-zone2 -f /export/zfs/master # zoneadm -z my-zone2 clone my-zone # zoneadm -z my-zone boot # zoneadm -z my-zone2 boot |
列出区域:
# zoneadm list -iv ID NAME STATUS PATH BRAND IP 0 global running / ipkg shared - my-zone running /export/zfs/my-zone ipkg shared - my-zone2 running /export/zfs/my-zone2 ipkg shared |
首先,我们区分一下软件升级和软件安装。如果您在全局区域中使用 pkg install 命令添加程序包,该程序包就安装在这里,不会传播到非全局区域。要在非全局区域中安装程序包,经过授权的区域管理员可以登录到非全局区域并在其中执行 pkg install 命令。
例如,我们安装 Apache HTTP Server 2.2 版以便在非全局区域 my-zone 上构建一个 Web 服务器(简单起见,不显示命令输出):
root@my-zone:~# pkg install apache-22 |
在 my-zone 中执行 pkg history 命令会显示 Apache 安装。(将该输出与全局区域中的 pkg history 命令结果进行比较。)
Oracle Solaris 11 Express 中的最佳实践是在软件更改之前,生成新的引导环境 (BE)(请参见本系列第一篇文章)。在有些情况下,如在完全更新中,会自动创建新的 BE 并在重新引导时激活它。在其他情况下,您必须显式创建一个 BE。可通过以下几种方式发起系统软件更新:
pkg(1) 命令,如在 pkg update 中Oracle 为 Oracle Solaris 11 设计了三种不同类型的更新:
要访问 SRU 和定期更新版本,您必须拥有 Oracle Solaris 11 Express 支持合同并在 My Oracle Support 上拥有 CSI 注册账户(请参见文章支持信息库说明 [ID 1021281.1])。登录 My Oracle Support 下载所需证书和密钥文件以便能够访问支持信息库。更新全局区域前,为证书和密钥文件定义一个目录:
# mkdir -m 0755 -p /var/pkg/ssl # cp -i ./Oracle_Solaris_11_Express_Support.certificate.pem /var/pkg/ssl # cp -i ./Oracle_Solaris_11_Express_Support.key.pem /var/pkg/ssl |
然后,定义支持信息库的位置和 pkg 的发布者,指定证书和密钥:
# pkg set-publisher -k /var/pkg/ssl/Oracle_Solaris_11_Express_Support.key.pem -c /var/pkg/ssl/Oracle_Solaris_11_Express_Support.certificate.pem -O https://pkg.oracle.com/solaris/support solaris |
如果您使用的是 packagemanager GUI,则在重启 GUI 后会看到更新的程序包列表。pkg history -l 命令中的最后一项反映了发布者的改变:
Operation: update-publisher
Outcome: Succeeded
Client: pkg
Version: 052adf36c3f4
User: ghenning (101)
Start Time: 2011-04-21T10:16:40
End Time: 2011-04-21T10:16:43
Command: /usr/bin/pkg set-publisher -k
/var/pkg/ssl/Oracle_Solaris_11_Express_Support.key.pem -c
/var/pkg/ssl/Oracle_Solaris_11_Express_Support.certificate.pem -O
https://pkg.oracle.com/solaris/support/ solaris
Start State:
None
End State:
None
|
运行 pkg update -nv 命令可显示更新期间将发生的操作,实际上不会进行任何更改。首次运行时,您可能会收到提示 pkg 过期的警告:
# pkg update -nv WARNING: pkg(5) appears to be out of date, and should be updated before running update. Please update pkg(5) using 'pfexec pkg install pkg:/package/pkg' and then retry the update. |
安装新版本的 pkg 后,再次运行 update命令:
# pkg install pkg:/package/pkg
Packages to update: 1
Create boot environment: No
DOWNLOAD PKGS FILES XFER (MB)
Completed 1/1 126/126 0.7/0.7
PHASE ACTIONS
Install Phase 1/1
Update Phase 242/242
PHASE ITEMS
Package State Update Phase 2/2
Package Cache Update Phase 1/1
Image State Update Phase 2/2
# pkg update -nv
Packages to update: 45
Create boot environment: Yes
Rebuild boot archive: Yes
Changed fmris:
pkg://solaris/entire@0.5.11,5.11-0.151.0.1:20101105T054056Z ->
pkg://solaris/entire@0.5.11,5.11-0.151.0.1.6:20110328T230730Z
.
.
.
|
上述输出中突出显示的内容表明,全局区域的操作系统版本 (5.11-0.151.0.1) 低于支持信息库中的版本 (5.11-0.151.0.1.6)。更新还将自动创建一个新 BE。记住,如果更新不会 自动创建新 BE,最佳实践是显式创建一个 BE。
在没有 -nv 选项的情况下,pkg update 命令更新全局区域,并创建一个默认名称为 solaris-1 的新 BE。最佳实践是在 update 命令行上显式指定一个 BE 名称,以便 BE 的命名有些含义,例如:
# pkg update --require-new-be --be-name "S11E_SRU6"
Packages to update: 45
Create boot environment: Yes
DOWNLOAD PKGS FILES XFER (MB)
Completed 45/45 1235/1235 70.2/70.2
PHASE ACTIONS
Removal Phase 184/184
Install Phase 350/350
Update Phase 3349/3349
PHASE ITEMS
Package State Update Phase 90/90
Package Cache Update Phase 45/45
Image State Update Phase 2/2
A clone of solaris exists and has been updated and activated.
On the next boot the Boot Environment S11E_SRU6 will be mounted on '/'.
Reboot when ready to switch to this updated BE.
---------------------------------------------------------------------------
NOTE: Please review release notes posted at:
http://docs.sun.com/doc/821-1479
---------------------------------------------------------------------------
|
更新全局区域后,重新引导系统以运行更新的 BE。请注意,更新仅影响目前已安装的程序包。在最小的系统中(例如,通过 server_install 程序包捆绑安装的系统),升级不会安装不显示的程序包。
目前,您必须手动更新 Oracle Solaris 11 Express 非全局区域,与全局区域保持同步。更新全局区域后,重新引导系统并暂停非全局区域:
# zoneadm -z my-zone halt |
要更新非全局区域 my-zone,首先卸载该区域,就好像要将该区域迁移到其他服务器上一样:
# zoneadm -z my-zone detach # zoneadm list -iv ID NAME STATUS PATH BRAND IP 0 global running / ipkg shared - my-zone2 installed /export/zfs/my-zone2 ipkg shared |
接下来,执行带 -u 选项的 zoneadm attach 命令。-u 选项在再次挂载时升级区域:
# zoneadm -z my-zone attach -u
Log File: /var/tmp/my-zone.attach_log.meay8c
Attaching...
preferred global publisher: solaris
Global zone version: entire@0.5.11,5.11-0.151.0.1.6:20110504T002250Z
Non-Global zone version: entire@0.5.11,5.11-0.151.0.1:20101105T054056Z
Cache: Using /var/pkg/download.
Updating non-global zone: Output follows
Packages to update: 17
Create boot environment: No
DOWNLOAD PKGS FILES XFER (MB)
Completed 17/17 447/447 14.7/14.7
PHASE ACTIONS
Removal Phase 106/106
Install Phase 115/115
Update Phase 1734/1734
PHASE ITEMS
Package State Update Phase 34/34
Package Cache Update Phase 17/17
Image State Update Phase 2/2
Updating non-global zone: Zone updated.
Result: Attach Succeeded.
|
该命令将全局区域版本 (5.11-0.151.0.1.6) 和非全局区域版本 (5.11-0.151.0.1) 作比较并相应地执行更新。挂载并更新 ipkg 非全局区域后,即可引导它:
# zoneadm -z my-zone boot # zoneadm list -iv ID NAME STATUS PATH BRAND IP 0 global running / ipkg shared 1 my-zone running /export/zfs/my-zone ipkg shared - my-zone2 installed /export/zfs/my-zone2 ipkg shared |
系统上的每个非全局区域必须以这种方式进行卸载、挂载/升级和引导,才能与全局区域保持同步。已计划进行进一步开发以简化区域更新过程,但是目前,还要手动完成此过程。当 Oracle Enterprise Manager Ops Center 支持 Oracle Solaris 11 时,将显著简化系统管理工作,包括管理操作系统、固件更新、虚拟机、存储和网络结构的工作。
当然了,如何恢复取决于问题的性质。如果全局区域升级成功,但非全局区域升级存在问题,请检查在 attach -u 操作过程中生成的日志文件。该日志文件标有区域名称(例如,/var/tmp/my-zone.attach.log.meay8c)。尝试根据该日志文件来解决问题。如有必要,可以返回到更新前就已存在的软件状态,因为非全局区域的克隆副本和初始 BE 仍然存在。如果全局区域存在问题,也可以采用恢复之前的软件状态这种方法。
要恢复到升级前存在的软件状态,首先要暂停和卸载所有非全局区域:
# zoneadm -z my-zone halt # zoneadm -z my-zone2 halt # zoneadm list -iv ID NAME STATUS PATH BRAND IP 0 global running / ipkg shared - my-zone installed /export/zfs/my-zone ipkg shared - my-zone2 installed /export/zfs/my-zone2 ipkg shared # zoneadm -z my-zone detach # zoneadm -z my-zone2 detach |
之后,zoneadm list 命令仅显示处于运行状态的全局区域:
# zoneadm list -iv ID NAME STATUS PATH BRAND IP 0 global running / ipkg shared |
接下来,激活并启动名为 solaris 的初始 BE:
# beadm activate solaris # beadm list BE Active Mountpoint Space Policy Created -- ------ ---------- ----- ------ ------- S11E_SRU6 N / 336.37M static 2011-06-02 11:28 solaris R - 2.35G static 2011-05-26 11:09 # reboot |
可以挂载和引导非全局区域(my-zone2 尚未更新,与非全局区域 my-zone 不同)的克隆副本,直到问题解决为止:
# zoneadm -z my-zone2 attach -u
Log File: /var/tmp/my-zone2.attach_log.mPaq6g
Attaching...
preferred global publisher: solaris
Global zone version: entire@0.5.11,5.11-0.151.0.1:20101105T054056Z
Non-Global zone version: entire@0.5.11,5.11-0.151.0.1:20101105T054056Z
Cache: Using /var/pkg/download.
Updating non-global zone: Output follows
No updates necessary for this image.
Updating non-global zone: Zone updated.
Result: Attach Succeeded.
# zoneadm -z my-zone2 boot
|
如上述输出所示,全局区域和非全局区域 my-zone2 处于相同的版本级别,确切地说,在进行任何更新之前存在的版本。
Oracle Solaris 11 Express 中的 BE 充当升级的安全网,类似于 Oracle Solaris 10 中的 Live Upgrade 环境。更新 Oracle Solaris 11 Express 全局区域时,始终会创建一个新 BE,以便可以进行回溯。在发布 Oracle Solaris 11 并且改变区域升级过程之前,要使用 zoneadm -z zonename attach -u 命令手动更新所有原生 (native) 非全局区域,使之与全局区域保持同步。
以下是本文前面所引用的资源:
solaris10(5) 手册页面: http://download.oracle.com/docs/cd/E19963-01/index.html下面提供了额外资源:
Oracle Solaris 11 Express 映像包管理系统: http://download.oracle.com/docs/cd/E19963-01/index.html
| 修订版 1,2011 年 7 月 11 日 |