使用映像包管理系统控制服务器配置

作者:Bart Smaalders 和 Alta Elstad

本文介绍如何控制 Oracle Solaris 11 系统升级,这样即使软件包发布者提供了更新的版本,系统升级也不会超过规定的版本。


2013 年 12 月发布


Oracle Solaris 11 映像包管理系统提供了各种方法来控制服务器可以升级到的操作系统版本。一种办法是提供一个自定义的 incorporation 软件包。

想对本文发表评论吗?请将链接发布在 Facebook 的 OTN Garage 页面上。有类似文章要分享?请将其发布在 Facebook 或 Twitter 上,我们来进行讨论。

incorporation 软件包 指定可以安装的其他软件包的版本。incorporation 软件包可确保您安装该 incorporation 软件包的 incorporate 依赖软件包时,只能安装依赖软件包的规定版本。您可以创建自己的自定义 incorporation 软件包来指定想要的约束。使用自定义 incorporation 控制可安装的软件版本使您能够轻松维护不同计算机上 Oracle Solaris 的不同版本,而无需维护多个软件包信息库。每个映像可以安装自定义升级控制 incorporation 软件包的不同版本。所有系统共享同一个软件包信息库,其中包含任何系统需要的所有软件版本。

在本文示例中,使用 Oracle Solaris 11.1 新安装了一个系统。solaris 发布者源点是 Oracle Solaris 支持信息库,其中包含 Oracle Solaris 11.1 发布以来的许多更新。示例公司中的 IT 部门不符合最新支持更新的要求,他们希望限制管理员只升级适合其环境的最新更新,而不是软件包信息库中可用的最新更新。

创建自定义 incorporation 软件包

映像中可安装的核心操作系统软件包的版本由 pkg:/entire incorporation 软件包控制。要控制系统升级,请创建一个软件包,指定特定版本的 pkg:/entire 软件包作为 incorporate 依赖项。

以下示例显示控制可安装的 pkg:/entire 软件包版本的自定义 incorporation 软件包的一个名为 upgradectrl.p5m 的清单。下面介绍该清单中的一些设置。

set name=pkg.fmri value=upgradectrl@1.0
set name=pkg.summary value="Incorporation to constrain the version of the OS"
set name=pkg.description value="This package controls the version of \
pkg://solaris/entire that can be installed."
set name=info.classification value="org.opensolaris.category.2008:Meta Packages/Incorporations"
set name=pkg.depend.install-hold value=core-os
set name=variant.opensolaris.zone value=global value=nonglobal
set name=variant.arch value=sparc value=i386
depend fmri=feature/package/dependency/self type=parent variant.opensolaris.zone=nonglobal
depend fmri=pkg://solaris/entire type=require
depend fmri=pkg://solaris/entire@0.5.11,5.11-0.175.1.0 type=incorporate

  • pkg.depend.install-hold。该设置确保如果用户更新 upgradectrl 软件包,将同时自动更新 pkg:/entire 软件包。
  • variant.opensolaris.zone。该设置允许在全局区域和非全局区域安装此软件包。另请参见 parent 依赖项的说明。
  • variant.arch。该设置允许在 SPARC 和 x86 系统上安装此软件包。
  • parent 依赖项。仅当该软件包已经安装在全局区域时,才能安装在非全局区域中。
  • require 依赖项。仅当 pkg://solaris/entire 软件包已经安装或可以在同一操作中安装时,才能安装 upgradectrl 软件包。
  • incorporate 依赖项。必须安装指定版本的 pkg://solaris/entire 软件包。根据指定的小数位精度的不同,可能有多个版本满足 incorporate 依赖项。在本示例中,0.175.1.0 指定 Oracle Solaris 11.1 SRU 0。此升级控制软件包将系统保持在新安装的 Oracle Solaris 11.1 版,不再安装支持更新。但此升级控制软件包将允许更新不受 pkg:/entire incorporation 约束的软件包。

upgradectrl 软件包发布到基于本地文件的信息库。该信息库用于开发和测试这个新软件包。如果您创建一个通用的信息库,应包括额外的步骤,如为该信息库创建一个单独的文件系统。有关如何创建通用软件包信息库的信息,请参见复制和创建软件包信息库

在系统上创建软件包开发信息库。有关 pkgrepo 命令的详细信息,请参见 pkgrepo(1) 手册页面。

$ pkgrepo create myrepo

设置该信息库的默认发布者。默认发布者是信息库的 publisher/prefix 属性的值。

$ pkgrepo -s myrepo set publisher/prefix=site

upgradectrl 软件包发布到开发信息库。

$ pkgsend -s myrepo publish upgradectrl.p5m
pkg://site/upgradectrl@1.0,5.11:20131120T010105Z
PUBLISHED

注意,信息库的默认发布者已应用于软件包 FMRI。

检查信息库,确认软件包已经发布。

$ pkgrepo -s myrepo list
PUBLISHER NAME                                       O VERSION
site      upgradectrl                                  1.0,5.11:20131120T010105Z
$ pkg list -vg myrepo
FMRI                                                                         IFO
pkg://site/upgradectrl@1.0,5.11:20131120T010105Z                             ---

将软件包交付到共享位置中一个单独 ZFS 文件系统中的本地信息库。

$ pkgrecv -s myrepo -d /export/IPSpkgrepos/Solaris upgradectrl
Processing packages for publisher site ...
Retrieving and evaluating 1 package(s)...
PROCESS                                         ITEMS    GET (MB)   SEND (MB)
Completed                                         1/1     0.0/0.0     0.0/0.0

验证信息库中的软件包及其包含的 pkg:/entire 版本。

$ pkg info -g /export/IPSpkgrepos/Solaris upgradectrl
          Name: upgradectrl
       Summary: Incorporation to constrain the version of the OS
   Description: This package controls the version of pkg://solaris/entire that
                can be installed.
      Category: Meta Packages/Incorporations
         State: Not installed
     Publisher: site
       Version: 1.0
 Build Release: 5.11
        Branch: None
Packaging Date: November 20, 2013 01:01:05 AM 
          Size: 0.00 B
          FMRI: pkg://site/upgradectrl@1.0,5.11:20131120T010105Z
$ pkg contents -Hro fmri -t depend -a type=incorporate upgradectrl
pkg://solaris/entire@0.5.11,5.11-0.175.1.0

有关如何创建和交付映像包管理系统软件包的详细信息,请参见使用映像包管理系统打包和交付软件中的“创建和发布软件包”。

设置 site 发布者的来源。

$ pkg set-publisher -g /export/IPSpkgrepos/Solaris site
$ pkg publisher
PUBLISHER              TYPE     STATUS P LOCATION
solaris                origin   online F https://pkg.oracle.com/solaris/support/
site                   origin   online F file:///export/IPSpkgrepos/Solaris/

安装升级控制软件包

安装升级控制软件包。在本例中,几乎不用做什么更改,因为安装的 pkg:/entire 版本与升级控制软件包包含的版本相同。

$ pkg list -v entire
FMRI                                                                         IFO
pkg://solaris/entire@0.5.11,5.11-0.175.1.0.0.24.2:20120919T190135Z           i--
$ zoneadm list
global
z1
$ pkg install upgradectrl
           Packages to install:  1
       Create boot environment: No
Create backup boot environment: No

Planning linked: 0/1 done; 1 working: zone:z1
Planning linked: 1/1 done
Downloading linked: 0/1 done; 1 working: zone:z1
Downloading linked: 1/1 done
PHASE                                          ITEMS
Installing new actions                           9/9
Updating package state database                 Done 
Updating image state                            Done 
Creating fast lookup database                   Done 
Reading search index                            Done 
Updating search index                            1/1 
Executing linked: 0/1 done; 1 working: zone:z1
Executing linked: 1/1 done

以下命令显示配置的 solaris 发布者提供的 pkg:/entire 版本比已安装版本高,但升级尝试受新安装的升级控制软件包控制。

$ pkg list -af entire
NAME (PUBLISHER)                                  VERSION                    IFO
entire                                            0.5.11-0.175.1.13.0.6.0    ---
entire                                            0.5.11-0.175.1.12.0.5.0    ---
entire                                            0.5.11-0.175.1.11.0.4.0    ---
entire                                            0.5.11-0.175.1.10.0.6.0    ---
entire                                            0.5.11-0.175.1.10.0.5.0    ---
...
$ pkg update
pkg update: No solution was found to satisfy constraints
Plan Creation: Package solver has not found a solution to update to latest available versions.
This may indicate an overly constrained set of packages are installed.
latest incorporations:
...
Try specifying expected results to obtain more detailed error messages.
$ pkg update -nv entire@0.5.11-0.175.1.13.0.6.0
pkg update: No matching version of entire can be installed:
  Reject:  pkg://solaris/entire@0.5.11,5.11-0.175.1.13.0.6.0:20131108T211557Z
  Reason:  This version is excluded by installed incorporation pkg://site/upgradectrl@1.0,5.11:20131120T010105Z

更新升级控制软件包

当您准备允许用户将其系统升级到新版本时,更新 upgradectrl.p5m 清单,并重新发布和重新交付新的升级控制软件包。在下面的清单中,更新了升级控制软件包的版本和 pkg:/entire incorporation 的版本。为了帮助用户,升级控制软件包的版本与 pkg:/entire 软件包的更新版本匹配。

set name=pkg.fmri value=upgradectrl@1.10
set name=pkg.summary value="Incorporation to constrain the version of the OS"
set name=pkg.description value="This package controls the version of \
pkg://solaris/entire that can be installed."
set name=info.classification value="org.opensolaris.category.2008:Meta Packages/Incorporations"
set name=pkg.depend.install-hold value=core-os
set name=variant.opensolaris.zone value=global value=nonglobal
set name=variant.arch value=sparc value=i386
depend fmri=feature/package/dependency/self type=parent variant.opensolaris.zone=nonglobal
depend fmri=pkg://solaris/entire type=require
depend fmri=pkg://solaris/entire@0.5.11,5.11-0.175.1.10 type=incorporate

以下命令重新发布和重新交付升级控制软件包:

$ pkgsend -s myrepo publish upgradectrl.p5m
pkg://site/upgradectrl@1.10,5.11:20131120T021902Z
PUBLISHED
$ pkgrepo -s myrepo list
PUBLISHER NAME                                      O VERSION
site      upgradectrl                                 1.10,5.11:20131120T021902Z
site      upgradectrl                                 1.0,5.11:20131120T010105Z
$ pkgrecv -s myrepo -d /export/IPSpkgrepos/Solaris upgradectrl
Processing packages for publisher site ...
Retrieving and evaluating 1 package(s)...
PROCESS                                         ITEMS    GET (MB)   SEND (MB)
Completed                                         1/1     0.0/0.0     0.0/0.0
$ pkg refresh site
$ pkg list -af pkg://site/upgradectrl
NAME (PUBLISHER)                                  VERSION                    IFO
upgradectrl (site)                                1.10                       ---
upgradectrl (site)                                1.0                        i--

升级映像

因为未指定软件包,以下 pkg update 命令将所有软件包更新到允许的最新可用版本。该命令更新到升级控制软件包的最新可用版本,这将升级映像,因为 upgradectrl 软件包中的 pkg.depend.install-hold 设置导致在更新 upgradectrl 软件包时更新 pkg:/entire 软件包。该映像升级到新 upgradectrl incorporation 中指定的 pkg:/entire incorporation 版本。

$ pkg update --be-name s11u1_10
            Packages to remove:   1
            Packages to update: 186
           Mediators to change:   1
       Create boot environment: Yes
Create backup boot environment:  No

Planning linked: 0/1 done; 1 working: zone:z1
Linked image 'zone:z1' output:
|  Packages to remove:  1
| Packages to install:  3
|  Packages to update: 73
| Mediators to change:  1
|  Services to change:  3
`
Planning linked: 1/1 done
DOWNLOAD                                PKGS         FILES    XFER (MB)   SPEED
Completed                            187/187   16139/16139  507.9/507.9  562k/s

Downloading linked: 0/1 done; 1 working: zone:z1
Downloading linked: 1/1 done
PHASE                                          ITEMS
Removing old actions                       1473/1473
Installing new actions                     3451/3451
Updating modified actions                16378/16378
Updating package state database                 Done 
Updating package cache                       187/187 
Updating image state                            Done 
Creating fast lookup database                   Done 
Reading search index                            Done 
Building new search index                    851/851 
Executing linked: 0/1 done; 1 working: zone:z1
Executing linked: 1/1 done

A clone of s11u1_0 exists and has been updated and activated.
On the next boot the Boot Environment s11u1_10 will be
mounted on '/'.  Reboot when ready to switch to this updated BE.
$ pkg list entire upgradectrl
NAME (PUBLISHER)                                  VERSION                    IFO
entire                                            0.5.11-0.175.1.0.0.24.2    i--
upgradectrl (site)                                1.0                        i--
$ beadm mount s11u1_10 /mnt
$ pkg -R /mnt list entire upgradectrl
NAME (PUBLISHER)                                  VERSION                    IFO
entire                                            0.5.11-0.175.1.10.0.6.0    i--
upgradectrl (site)                                1.10                       i--
$ beadm unmount s11u1_10

另请参见

另请参见以下资源:

关于作者

Bart Smaalders 是 Oracle Solaris 核心操作系统小组的一名高级工程师,他领导了映像包管理系统的开发。

Alta Elstad 是支持 Oracle Solaris 11 软件包的技术文档作家。

修订版 1.0,2013 年 12 月 6 日

关注我们:
博客 | Facebook | Twitter | YouTube