如何使用 Oracle Solaris 11 映像包管理服务配置信息库镜像服务

作者:Glynn Foster

确保系统是最新的并且安装了正确的软件。


2014 年 8 月发布


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

Oracle Solaris 11.2 的映像包管理系统 (IPS) 新增了几项改进,可帮助管理员安装软件和管理系统更新,还可帮助开发人员创建软件并将其发布到 IPS 信息库。您可以在 Tim Foster 的博客阅读这个改进列表。

在本文中,我们将介绍 Oracle Solaris 11.2 中新包括的信息库镜像服务,它可以帮助管理员保持本地信息库与 Oracle 托管的软件包信息库同步。我们还将介绍一些围绕合规性设计的新功能,旨在确保系统只安装符合您期望的软件。

创建本地软件包信息库

Oracle 公开托管了一些软件包信息库,它们允许管理员直接在数据中心的系统上安装和更新软件。但是许多数据中心环境中存在网络限制,这可能就需要管理员创建本地信息库。通过创建本地软件包信息库,管理员可确保快速、可靠地访问软件,并提供其他机制确保系统上安装的软件版本(通过软件包整合或冻结)经过内部测试和验证流程,符合企业标准。

在本文中,我们首先将从 Oracle 技术网上提供的 ISO 映像创建本地软件包信息库。假设我们已经将这些映像下载到 /mnt。这些映像包含与 Oracle Solaris 11.2 有关的所有软件 — 既包括标准介质安装过程中安装的软件,也包括软件包信息库中提供的可选软件。

root@solaris:# ls -1 /mnt
install-repo.ksh
README-zipped-repo.txt
sol-11_2-repo-1of4.zip
sol-11_2-repo-2of4.zip
sol-11_2-repo-3of4.zip
sol-11_2-repo-4of4.zip
sol-11_2-repo-md5sums.txt

我们来构造一个本地软件包信息库。我们首先在 tank/repositories 下创建一个 ZFS 数据集(假设另外有一个名为 tank 的 ZFS 池)来托管信息库。这意味着该信息库独立于引导环境之外。然后,我们运行脚本(如自述文件说明中所示):

root@solaris:# zfs create -o mountpoint=/repositories tank/repositories
root@solaris:# cd /mnt
root@solaris:/mnt# ./install-repo.ksh -d /repositories
Uncompressing sol-11_2-repo-1of4.zip...done.
Uncompressing sol-11_2-repo-2of4.zip...done.
Uncompressing sol-11_2-repo-3of4.zip...done.
Uncompressing sol-11_2-repo-4of4.zip...done.
Repository can be found in /repositories.

我们来看看生成的 /repositories ZFS 数据集:

root@solaris:/mnt# cd
root@solaris:# ls -1 /repositories
COPYRIGHT
NOTICES
pkg5.repository
publisher
README-repo-iso.txt

现在,我们已经复制了数据,接下来需要更改默认 IPS 发布者,使其指向这个新信息库。注意,我们尚未启用允许客户端通过 HTTP 或 HTTPS 连接到此信息库的 IPS 信息库 depot 服务;目前只能通过标准文件系统访问此信息库。

root@solaris:~# pkg set-publisher -G http://pkg.oracle.com/solaris/release -g /repositories/ solaris
root@solaris:~# pkg publisher
PUBLISHER                   TYPE     STATUS P LOCATION
solaris                     origin   online F file:///repositories/

为了说明信息库正常工作,我们以安装 cloud/openstack 组软件包为例。我们将使用 OpenStack 核心组件的有无来验证信息库同步是否正常工作。通过安装组软件包,我们还将安装 OpenStack 云控制器软件所需的所有软件。

root@solaris:~# pkg install cloud/openstack
           Packages to install: 177
            Services to change:   3
       Create boot environment:  No
Create backup boot environment: Yes
DOWNLOAD                                PKGS         FILES    XFER (MB)   SPEED
Completed                            177/177   17109/17109    58.6/58.6    0B/s

PHASE                                          ITEMS
Installing new actions                   20396/20396
Updating package state database                 Done 
Updating package cache                           0/0 
Updating image state                            Done 
Creating fast lookup database                   Done 
Updating package cache                           1/1 
root@solaris:~# pkg list cloud/openstack*
NAME (PUBLISHER)                                  VERSION                    IFO
cloud/openstack                                   0.2013.2.3-0.175.2.0.0.42.1 i--
cloud/openstack/cinder                            0.2013.2.3-0.175.2.0.0.42.1 i--
cloud/openstack/glance                            0.2013.2.3-0.175.2.0.0.42.1 i--
cloud/openstack/horizon                           0.2013.2.3-0.175.2.0.0.42.1 i--
cloud/openstack/keystone                          0.2013.2.3-0.175.2.0.0.42.1 i--
cloud/openstack/neutron                           0.2013.2.3-0.175.2.0.0.42.1 i--
cloud/openstack/nova                              0.2013.2.3-0.175.2.0.0.42.1 i--
cloud/openstack/swift                             1.10.0-0.175.2.0.0.42.1    i--

现在 IPS 信息库已上线,我们来生成一个 ZFS 快照,这样就可以有一个能轻松恢复的状态。

root@solaris:~# zfs snapshot tank/repositories@original

手动镜像软件包信息库

管理员可以使用 pkgrecv 命令逐个信息库检索软件包。在下面的清单 1 中,我们将使用 -m latest 选项检索所有软件包的最新版本,而不是提取每个软件包的所有版本,使用 * 匹配软件包故障管理资源标识符 (FMRI)。我们将使用 Oracle Solaris 版本信息库作为源信息库。我们还将使用 -v 选项启用详细模式。

root@solaris:~# pkgrecv -s http://pkg.oracle.com/solaris/release -d /repositories -m latest -v *
Processing packages for publisher solaris ...
Retrieving and evaluating 4870 package(s)...

Retrieving packages ...
        Packages to add:        24
      Files to retrieve:     10479
Estimated transfer size: 446.99 MB

Packages to transfer:
cloud/openstack/cinder@0.2013.2.3,5.11-0.175.2.1.0.2.0:20140723T183814Z
cloud/openstack/glance@0.2013.2.3,5.11-0.175.2.1.0.2.0:20140723T183837Z
cloud/openstack/horizon@0.2013.2.3,5.11-0.175.2.1.0.2.0:20140723T183851Z
cloud/openstack/keystone@0.2013.2.3,5.11-0.175.2.1.0.2.0:20140723T183928Z
cloud/openstack/neutron@0.2013.2.3,5.11-0.175.2.1.0.2.0:20140723T183943Z
cloud/openstack/nova@0.2013.2.3,5.11-0.175.2.1.0.2.0:20140723T184006Z
cloud/openstack/swift@1.10.0,5.11-0.175.2.1.0.2.0:20140723T184039Z
consolidation/java-7/java-7-incorporation@1.7.0.65.17,5.11-0:20140625T004018Z
consolidation/java-8/java-8-incorporation@1.8.0.11.12,5.11-0:20140625T004323Z
consolidation/userland/userland-incorporation@0.5.11,5.11-0.175.2.1.0.2.0:20140723T184045Z
developer/java/jdk@1.7.0.65.17,5.11:20140625T004034Z
developer/java/jdk-7@1.7.0.65.17,5.11:20140625T004019Z
developer/java/jdk-8@1.8.0.11.12,5.11:20140625T004324Z
entire@0.5.11,5.11-0.175.2.1.0.2.0:20140723T184046Z
library/java/java-demo@1.7.0.65.17,5.11:20140625T004046Z
library/java/java-demo-7@1.7.0.65.17,5.11:20140625T004035Z
library/java/java-demo-8@1.8.0.11.12,5.11:20140625T004340Z
library/python-2/jsonpatch@1.1,5.11-0.175.2.1.0.2.0:20140723T184048Z
library/python-2/jsonpatch-26@1.1,5.11-0.175.2.1.0.2.0:20140723T184047Z
library/python-2/jsonpatch-27@1.1,5.11-0.175.2.1.0.2.0:20140723T184048Z
runtime/java/jre@1.7.0.65.17,5.11:20140625T004254Z
runtime/java/jre-7@1.7.0.65.17,5.11:20140625T004046Z
runtime/java/jre-8@1.8.0.11.12,5.11:20140625T004347Z
service/network/dnsmasq@2.68,5.11-0.175.2.1.0.2.0:20140723T184049Z

PROCESS                                         ITEMS    GET (MB)   SEND (MB)
Completed                                       24/24 447.024/24 447.0/447.0   1164/1164

清单 1

在清单 1 中,我们可以看到信息库中刷新了 24 个影响 Java 和 OpenStack 的软件包。这是 Oracle Solaris 11.2 推出后不久提供的一个更新。

我们来仔细检查是否有这些版本:查看系统上的 cloud/openstack/nova 软件包(处理计算功能的 OpenStack 基础架构云服务),然后检查信息库中已有的版本,如清单 2 所示。

root@solaris:~# pkg list cloud/openstack/nova
NAME (PUBLISHER)                                  VERSION                    IFO
cloud/openstack/nova                              0.2013.2.3-0.175.2.0.0.42.1 i--
root@solaris:~# pkgrepo -s /repositories/ list cloud/openstack/nova
PUBLISHER NAME                                          O VERSION
solaris   cloud/openstack/nova                            0.2013.2.3,5.11-0.175.2.1.0.2.0:20140723T184006Z
solaris   cloud/openstack/nova                            0.2013.2.3,5.11-0.175.2.0.0.42.1:20140623T010318Z

清单 2

在清单 2 中,我们可以看到安装了版本 0.2013.2.3-0.175.2.0.0.42.1,但信息库中还有一个新版本 — 0.2013.2.3,5.11-0.175.2.1.0.2.0。现在,我们可以使用 pkg update 更新到这个新版本,如清单 3 所示。

root@solaris:~# pkg update
           Packages to install:   2
            Packages to update:  12
       Create boot environment:  No
Create backup boot environment: Yes
DOWNLOAD                                PKGS         FILES    XFER (MB)   SPEED
Completed                              14/14       154/154      0.8/0.8    0B/s

PHASE                                          ITEMS
Removing old actions                           83/83
Installing new actions                       124/124
Updating modified actions                    188/188
Updating package state database                 Done 
Updating package cache                         12/12 
Updating image state                            Done 
Creating fast lookup database                   Done 
Updating package cache                           1/1 

---------------------------------------------------------------------------
NOTE: Please review release notes posted at:

http://www.oracle.com/pls/topic/lookup?ctx=solaris11&id=SERNS
---------------------------------------------------------------------------

root@solaris:~# pkg list cloud/openstack/nova
NAME (PUBLISHER)                                  VERSION                    IFO
cloud/openstack/nova                              0.2013.2.3-0.175.2.1.0.2.0 i--

清单 3

在清单 3 中,我们可以看到已经安装了最新的 OpenStack 软件包,包括 Nova 计算服务。pkgrecv 在正常刷新本地软件包信息库。

还可以使用带 --clone 选项的 pkgrecv 生成信息库的完全克隆(包括所有时间戳)。如果要从头开始复制信息库,建议使用 --clone 选项,因为此法操作速度更快。

使用 pkgrecv 基本上是一个手动过程。我们可以轻松地创建一个 cron 作业来实现此目的,但我们还是将使用 Oracle Solaris 11.2 包含的新镜像服务特性。使用此特性比单用 cron 要多一些好处,例如,与 Oracle Solaris 服务管理工具 (SMF) 集成、日志记录、发布者配置管理等等。

介绍新 IPS 软件包镜像服务之前,我们先将本地软件包信息库回滚到原始状态,恢复安装 OpenStack 软件包时所做的更改,如清单 4 所示。使用新命令 pkg exact-install 安装和更新系统,就像是安装到裸机系统上一样。此命令对于试图强制实施合规性(例如,以确保使用经过验证的配置,并且系统上不会安装不必要的软件包)的管理员尤为有用。

这一特定系统使用 Oracle Solaris 11.2 交互式文本安装程序安装,它使用 solaris-large-server 组软件包作为安装基本服务器配置文件的边界。我们将用它作为希望恢复到的边界。严格执行此安装将新建一个引导环境,其中包含所做的更改,将在下一次系统重启时激活。

root@solaris:~# zfs rollback tank/repositories@original
root@solaris:~# pkg exact-install solaris-large-server
            Packages to remove: 198
       Create boot environment: Yes
Create backup boot environment:  No
PHASE                                          ITEMS
Removing old actions                     23784/23784
Updating package state database                 Done 
Updating package cache                       198/198 
Updating image state                            Done 
Creating fast lookup database                   Done 
Updating package cache                           1/1 

A clone of solaris exists and has been updated and activated.
On the next boot the Boot Environment solaris-1 will be
mounted on '/'.  Reboot when ready to switch to this updated BE.

Updating package cache                           1/1 
# reboot

清单 4

在清单 4 中,我们可以看到从系统中删除了 198 个软件包,新建了一个名为 solaris-1 新引导环境。系统重启后,我们检查系统状态和 OpenStack 软件包的信息库。

root@solaris:~# pkg list cloud/openstack/nova
pkg list: No packages matching 'cloud/openstack/nova' installed
root@solaris:~# pkgrepo -s /repositories/ list cloud/openstack/nova
PUBLISHER NAME                                          O VERSION
solaris   cloud/openstack/nova                            0.2013.2.3,5.11-0.175.2.0.0.42.1:20140623T010318Z

使用 IPS 镜像服务实现自动镜像

IPS 软件包镜像服务 application/pkg/mirror 可以帮助自动执行用另一个软件包信息库的内容更新软件包信息库的过程。和以前一样,我们将使用 Oracle Solaris 11.2 版本信息库中的已更新的内容更新 /repositories 中的软件包信息库。此服务使用 SMF 管理,最初是禁用的,如下所示:

root@solaris:~# svcs pkg/mirror
STATE          STIME    FMRI
disabled        3:29:10 svc:/application/pkg/mirror:default

我们将使用标准 SMF 管理命令对配置进行所需更改。我们首先使用 svccfg 命令检查此服务实例的默认配置,如清单 5 所示:

root@solaris:~# svccfg -s pkg/mirror:default
svc:/application/pkg/mirror:default> listprop config
config                      application        
config/cache_dir           astring     /var/cache/pkg/mirror
config/crontab_period      astring     "30 2 random * *"
config/debug               boolean     false
config/publishers          astring     solaris
config/ref_image           astring     /
config/repository          astring     /var/share/pkg/repositories/solaris
config/stability           astring     Evolving
config/value_authorization astring     solaris.smf.manage.pkg-mirror

清单 5

我们马上就可以在清单 5 中看到,我们希望将 config/repository 属性改为指向 /repositories,根据我们希望此服务取更新的时间,可能还需要更改 config/crontab_period 属性。

在本文中,我们将每隔 5 分钟取一次更新,这样我们可以查看其是否工作,但建议在数据中心相对不活跃的时间段(例如下班后)取更新。

svc:/application/pkg/mirror:default> setprop config/repository = astring: "/repositories"
svc:/application/pkg/mirror:default> setprop config/crontab_period = astring: "0,5,10,15,20,25,30,35,40,45,50,55 * * * *"
svc:/application/pkg/mirror:default> listprop config
config                      application        
config/cache_dir           astring     /var/cache/pkg/mirror
config/crontab_period      astring     "0,5,10,15,20,25,30,35,40,45,50,55 * * * *"
config/debug               boolean     false
config/publishers          astring     solaris
config/ref_image           astring     /
config/repository          astring     /repositories
config/stability           astring     Evolving
config/value_authorization astring     solaris.smf.manage.pkg-mirror
svc:/application/pkg/mirror:default> refresh
svc:/application/pkg/mirror:default> exit

默认情况下,服务使用系统上的发布者配置作为要镜像的源信息库。这使用 config/ref_image SMF 信息库配置(如 / 值所示)。这意味着它将尝试从 file:///repositories/ 取,因为这被配置为默认发布者。

我们有两种选择。我们可以将发布者重新更改为 Oracle 托管的发布者,也可以使用 pkg image-create 创建新的映像来提供正确的发布者信息,然后将此作为镜像服务的参考映像提供。在此我们选择第一种(产品文档中介绍了另一个示例)。

我们还需要更改 /repositories 的用户和组所有权,因为镜像服务以 pkg5srv 用户身份运行;只有当镜像到现有信息库时才会出现此问题。

root@solaris:~# pkg set-publisher -G /repositories -g http://pkg.oracle.com/solaris/release solaris
root@solaris:~# pkg publisher
PUBLISHER                   TYPE     STATUS P LOCATION
solaris                     origin   online F http://pkg.oracle.com/solaris/release/
root@solaris:~# chmod -R pkg5srv:pkg5srv /repositories

现在我们已经完成了配置,下面使用 svcadm enable 命令启用此服务实例,然后使用 svcs 检查其是否在线。

root@solaris:~# svcadm enable pkg/mirror:default
root@solaris:~# svcs pkg/mirror:default
STATE          STIME    FMRI
online          4:40:58 svc:/application/pkg/mirror:default

该服务将活动记录到 /var/log/pkg/mirror/ 位置。我们可以通过查看几个不同日志来检查该服务是否正常工作:

root@solaris:# tail -f /var/log/pkg/mirror/mirror.default.log
20140806T044502Z: svc:/application/pkg/mirror:default updates to /repositories from 
http://pkg.oracle.com/solaris/release/ :

^C
root@solaris:/var/log/pkg/mirror# tail -f /var/log/pkg/mirror/mirror.default.log.tmp
Fetching manifests:  2411/10563  22% complete
Fetching manifests:  2450/10563  23% complete
Fetching manifests:  2478/10563  23% complete
Fetching manifests:  2501/10563  23% complete
Fetching manifests:  2529/10563  23% complete
Fetching manifests:  2544/10563  24% complete
Fetching manifests:  2577/10563  24% complete
Fetching manifests:  2596/10563  24% complete
Fetching manifests:  2607/10563  24% complete
Fetching manifests:  2624/10563  24% complete
^C

数小时之后(Oracle Solaris 11 版本信息库非常巨大!),镜像服务将完成,我们可以检查希望出现在刷新后的信息库中的软件包的信息库状态。

root@solaris:~# pkgrepo -s /repositories/ list cloud/openstack/nova
PUBLISHER NAME                                          O VERSION
solaris   cloud/openstack/nova                            0.2013.2.3,5.11-0.175.2.1.0.2.0:20140723T184006Z
solaris   cloud/openstack/nova                            0.2013.2.3,5.11-0.175.2.0.0.42.1:20140623T010318Z

我们甚至可以查看信息库中包含哪些版本的 entireentire 是表示 Oracle Solaris 11 版本边界的软件包整合):

root@solaris:~# pkgrepo -s /repositories/ list entire
PUBLISHER NAME                                          O VERSION
solaris   entire                                          0.5.11,5.11-0.175.2.1.0.2.0:20140723T184046Z
solaris   entire                                          0.5.11,5.11-0.175.2.0.0.42.0:20140624T193832Z
solaris   entire                                          0.5.11,5.11-0.175.1.0.0.24.2:20120919T190135Z
solaris   entire                                          0.5.11,5.11-0.175.0.10.1.0.0:20120918T160900Z
solaris   entire                                          0.5.11,5.11-0.175.0.0.0.2.0:20111020T143822Z
solaris   entire                                          0.5.11,5.11-0.151.0.1:20101105T054056Z

总结

无论是对 Oracle 托管的信息库,还是对本地信息库,IPS 镜像都是一种非常有用的信息库镜像方式。使用 application/pkg/mirror 服务的多个 SMF 实例,管理员可以快速同步不同的信息库,实现更好的信息库地理分布,为全局数据中心环境中的不同客户端服务。

另请参见

另请参见以下资源:

关于作者

Glynn Foster 是 Oracle Solaris 首席产品经理。他负责多个技术领域,包括 OpenStack、Oracle Solaris 映像包管理系统、安装和配置管理。

修订版 1.0,2014 年 8 月 13 日

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