如何使用分发构造器创建自定义 Oracle Solaris 11 映像

作者:Isaac Rozenfeld

通过一个示例学习如何创建和分发自定义 Oracle Solaris 11 映像,该示例从头到尾展示了此过程。


2011 年 9 月

目录:

简介

本文介绍如何创建包含自定义软件的自定义 Oracle Solaris 11 映像,

并简要概述创建自定义 Oracle Solaris 11 映像的原因。文中介绍了相关概念,随后是一个使用分发构造器创建自定义(“golden”)映像的实际示例。最后,该示例演示了如何提取创建的映像并将其作为供应流程的一部分提供给系统使用。

:本文是针对 Oracle Solaris 11 撰写的,该版本是称为“Oracle Solaris 11 Express”的多个开发版本的巅峰之作。有关本文中所引用特定特性的信息的链接,请访问 http://www.oracle.com/technetwork/cn/server-storage/solaris11/documentation/index.html

分发构造器概述

分发构造器是一个用于生成预配置的、可引导的 Oracle Solaris 11 映像的命令行工具。它是作为一个开源项目由 Oracle Solaris 工程师和社区开发的,包含在 Oracle Solaris 11 中,以便为更大的 Oracle Solaris 生态系统提供增值服务。例如,大型企业和 OEM 们可以使用该工具生成可部署的映像以支持类似云的大型服务器场。

目前,该工具接受 XML 清单文件作为输入,并基于该清单文件中指定的参数生成一个 ISO 映像。也可以选择基于生成的 ISO 映像创建一个 USB 映像。

使用默认清单文件创建的映像与作为 Oracle Solaris 11 版的一部分分发的 LiveCD 映像相当。例如,可以在创建映像之前通过向映像添加其他程序包来修改 ISO 映像的内容。因此,可以创建最小化、耐用的自定义映像。随后在将这些映像部署到企业时,可根据需要在其上叠加其他功能。因此,其实际价值在于能够修改产生引导环境的默认设置以创建自定义、可再分发的 ISO(或 USB)映像。

使用分发构造器:示例

下面几节介绍使用分发构造器生成映像的过程。

获取分发构造器

要使用分发构造器,需要在系统上安装和运行 Oracle Solaris 11。还可以使用虚拟机管理程序托管 Oracle Solaris 11 的映像。使用分发构造器时所建议的最小可用磁盘空间为 8 GB。

由于会发生管理任务,因此运行分发构造器需要 root 权限。

为了获取分发构造器,您需要安装 distribution-constructor 程序包,该程序包由映像包管理系统 (IPS) 信息库托管,您的系统中应该已经配置了 IPS。要验证是否配置了 IPS 信息库,请运行 pkg publisher 命令。

如果尚未配置 IPS 信息库,请在尝试添加 distribution-constructor 程序包之前配置它。否则,程序包添加将失败。

系统应配置了网络访问(如果是通过网络访问 IPS 信息库)或本地配置的从同一系统提供服务的 IPS 信息库。

本文示例使用了本地配置的 IPS 信息库,如 pkg publisher 命令的以下输出所示,该输出指示 IPS 信息库通过 HTTP 托管在 localhost

root@solarix:/usr/share/distro_const# pkg publisher
PUBLISHER			      TYPE     STATUS   URI
solaris                              origin   online   http://localhost/

验证确实配置了信息库之后,以 root 身份运行 pkg install distribution-constructor 命令添加分发构造器程序包。

然后从 IPS 信息库下载 distribution-constructor 程序包并立即安装。pkg install distribution-constructor 命令显示进程的状态,如清单 1 所示,这样便于观察进度。

清单 1:pkg install distribution-constructor 命令的输出
root@solarix:~# pkg install distribution-constructor

	 Packages to install:  2
     Variants/Facets to change: 20
       Create boot environment: No
Create backup boot environment: No

DOWNLOAD				 PKGS       FILES XFER (MB)
Completed				 2/2	  62/62 0.1/0.1

PHASE				   ACTIONS
Install Phase			   117/117 

PHASE				     ITEMS
Package State Update Phase		       2/2 
Image State Update Phase		       2/2 

准备使用分发构造器创建映像

使用分发构造器的方法有两种:

  • 使用所提供的清单文件,这种方法有助于熟悉分发构造器的工作方式
  • 向映像添加程序包或从映像删除程序包(定制映像)

安装 distribution-constructor 程序包时,将创建 /usr/share/distro_const 目录,并在该目录中安装一些示例 XML 清单文件供 x86 和 SPARC 映像使用,例如:

boot_archive_contents_sparc.xml  dc_ai_x86.original.xml dc_text_x86.xml
boot_archive_contents_x86.xml    dc_ai_x86.xml	 lang_facets.xml
dc_ai_sparc.original.xml         dc_livecd.xml	 profile
dc_ai_sparc.xm                   dc_text_sparc.xml	 sort

清单文件为分发构造器提供一份蓝图,指定所需映像的内容和参数。

建议初学者利用现有的 XML 清单文件,将其用作模板。为此,请将清单文件复制到其他位置(例如主目录)并进行重命名。然后编辑该副本使其包含所需内容。

:始终记住在编辑清单文件之前一定要制作一个备份副本。

在以下示例中,将制作清单文件的副本,然后编辑该副本。

root@solarix:/# cp /usr/share/distro_const/dc_text_sparc.xml ~/my_golden_image.xml
root@solarix:/# vi ~/my_golden_image.xml

浏览一下该清单,发现其中有一些重要代码段说明了可能的关注领域。

在其中一个重要的可编辑代码段中,您可以选择更改自定义映像的名称:

<distro name="MyGoldenImage_Solaris_AI_X86" add_timestamp="false">

此外,还有一个代码段可在其中定义 IPS 信息库的位置,如以下示例所示。分发构造器访问信息库并检索映像的程序包。

如果您不想使用默认的 pkg.oracle.com/solaris/release 信息库,请修改该位置以指向所选择的信息库。在此处的示例中,我们使用 localhost 作为信息库的位置,因为使用的是本地配置的 IPS 信息库。

  <publisher name="solaris">
	 <origin name="http://localhost"/>

生成并部署了映像之后,未来可能需要添加到映像的任何软件很可能将来自该 IPS 信息库。您可以预先配置默认 IPS 信息库的地址,稍后搜索软件时将使用该地址。

清单 2 显示了清单中指定地址的那个代码段。在本示例中,指定 http://192.168.1.222 作为 IPS 信息库的 IP 地址。

清单 2:在清单中指定 IPS 信息库的地址
<!-- The default publisher to be set on the system after it has been installed.
    -->
    <software name="set-ips-attributes" type="IPS">
      <destination>
        <image img_root="{PKG_IMAGE_PATH}" action="use_existing"/>
      </destination>
      <source>
        <publisher name="solaris">
          <origin name="http://192.168.1.222"/>
          <!--
            If mirrors for this publisher are desired, they can be set here
          -->
          <!-- Uncomment before using
          <mirror name="mirror.example.com"></mirror>
          -->
        </publisher>
      </source>
    </software>

下一个重要代码段列出将包含在映像中的程序包。如果您有要添加到基本映像的程序包,请将这些程序包添加到该代码段,每行一个程序包,如清单 3 中所示。

清单 3:在清单中指定附加程序包
<!-- 
	List of packages used to form the installed image

        By default the latest build available in the specified IPS repository
        is installed. If another build is required, the build number has to be
        appended to the 'entire' package in the following form:

        <name>pkg:/entire@0.5.11-0.build#</name>
      -->
      <software_data action="install">
        <name>pkg:/entire@latest</name>
        <name>pkg:/system/install/media/internal</name>
        <name>pkg:/system/install/text-install</name>
        <name>pkg:/group/system/solaris-auto-install</name>
      </software_data>

在清单的最后几个代码段中,有一个是在其中定义分发构造器工作区的代码段。您必须确认程序包映像区对于您的系统是有效的,否则,则必须修改清单。

如果所需的位置(托管在 ZFS 数据集上)不存在,将创建该位置。但是您指定的 zpool 必须已经存在。默认情况下,它位于在 ZFS 池 /rpool 中创建的一个名为 dc 的文件系统中,并且在清单的标记为“Target Section”的代码段中定义,如清单 4 所示:

清单 4:指定分发构造器工作区的位置
 <!--
      Target Section: defines zfs build dataset to be used for the build
      Filesystem name should not include the name of the zpool.
    -->
    <target name="desired">
      <logical>
        <zpool name="rpool" action="use_existing">
          <filesystem name="dc/ai" action="preserve"/>
        </zpool>
      </logical>
    </target>

Target Section 中指定的信息与文件系统名一起用于创建 ZFS 数据集中的目录结构,如下所示:

  • <ZFS data set>/build_data/pkg_image:程序包映像区。
  • <ZFS data set>/build_data/boot_archive:引导根生成区。
  • <ZFS data set>/build_data/tmp:用作生成过程一部分的临时目录。
  • <ZFS data set>/media:放置输出映像的区域
  • <ZFS data set>/logs:保存记录分发构造器执行的步骤和所有命令的输出的日志文件的区域。名为 simple-log-YYYY-MM-DD-HH-Mi 的“简单”日志仅包含错误。名为 detail-log-YYYY-MM-DD-HH-Mi 的“详细”日志包含信息性输出和错误。控制台会回显简单日志文件中的信息。

使用分发构造器进行最后调整

得到理想的清单内容后,下一步是生成映像。

分发构造器的命令行界面是 distro_const 命令,它安装在 /usr/bin 目录中。当您添加 distribution-constructor 程序包时,该目录已添加到 $PATH

分发构造器的一个独特特性是利用检查点的能力,即利用模块化方法生成映像的能力。检查点有助于节省开发理想自定义映像的过程的时间。开发理想自定义映像通常需要进行某些调整,同时缩小特定软件包的大小、进行适当的标记、命名和其他行为以及配置首选项。

检查点为生成过程增添了模块化功能,可使您免于重复已成功完成并进行相应标记的生成步骤。在开发映像期间,如果需要纠正某个特定步骤并需要重新尝试生成映像,只需要从该步骤开始继续执行过程,这样可以利用先前已经成功完成的步骤。

要想查看一共有哪些检查点,只需执行 build -l 子命令,如下所示。任何可恢复的检查点均在 Resumable 列中进行了标记。清单 5 显示没有可恢复的检查点。

清单 5:列出检查点
root@solarix:/# distro_const build -l  my_golden_image.xml 
 
Checkpoint           Resumable Description
----------           --------- -----------
transfer-ips-install           Transfer pkg contents from IPS
set-ips-attributes             Set post-install IPS attributes
pre-pkg-img-mod                Pre package image modification
ba-init                        Boot Archive Initialization
ba-config                      Boot Archive Configuration
ba-arch                        Boot Archive Archival
boot-setup                     Setup boot menu     
pkg-img-mod                    Pkg image area modification
create-iso                     ISO media creation  
create-usb                     USB media creation  
ai-publish-package             Publish pkg(5) repository

/usr/share/distro_const 目录中提供的示例 XML 清单一般为以下三种类型之一:

  • 自动安装程序:该类型很灵活,具有丰富特性,本文示例使用了此类型。它用于以非交互式方式(即无需人工参与的编程方式)在大量系统上安装自定义映像。
  • 文本安装程序:该类型用于以交互式方式在“无头”服务器上安装自定义映像。
  • LiveCD/USB 安装程序:该类型用于以交互式方式在使用 GUI 的服务器上安装自定义映像。

根据您在这三种清单类型中选择使用哪一种,某些检查点可能不存在。例如,当使用基于 LiveCD 的清单时,boot-setup 检查点的描述将为 Setup LiveCD boot menu,而如果使用基于文本安装程序的清单,您将看到 Setup boot menu 这样的描述。使用基于自动安装程序的清单,则没有直接的交互式引导,因此根本没有 boot-setup 检查点。

事实上,使用基于自动安装程序的清单,检查点的数目会明显变少,这是因为通过安装服务以模块化和可伸缩的方式在企业中部署基于自动安装程序的映像(在最后一部分讨论)。检查点数目和类型上的这些差异不应作为考虑因素。

执行映像生成过程时,由于分发构造器与基础 ZFS 文件系统技术的独特功能紧密集成,您将看到大部分检查点是可恢复的。最终,输出将类似清单 6 所示:

清单 6:可恢复的检查点
Checkpoint           Resumable Description
----------           --------- -----------
transfer-ips-install     X     Transfer pkg contents from IPS
set-ips-attributes       X     Set post-install IPS attributes
pre-pkg-img-mod          X     Pre package image modification
ba-init                  X     Boot Archive Initialization
ba-config                X     Boot Archive Configuration
ba-arch                  X     Boot Archive Archival
boot-setup               X     Setup boot menu     
pkg-img-mod              X     Pkg image area modification
create-iso               X     ISO media creation  
create-usb               X     USB media creation  
ai-publish-package       X     Publish pkg(5) repository  

使用分发构造器创建映像

要创建映像,请不带任何选项直接执行 build 命令。这将开始生成创建过程,取决于配置、磁盘性能、网络访问速度以及要创建的映像大小,这可能需要 30 至 45 分钟。

为显示状态和进度,提供了日志记录。如前所述,提供了两个日志文件:一个简单日志和一个详细日志。您可能希望通过单独的终端窗口监视日志文件。该命令及产生的一些早期输出如图 1 中示例所示:

图 1

图 1. build 命令的输出

再过几分钟之后,输出中新增了其他状态更新,如图 2 所示。

图 2

图 2. build 命令的更多输出

随着该过程继续,屏幕上将输出其他信息,直至过程完成。

输出的最后一行显示一个日期和时间戳,指示生成完成的时间。如果您需要在使用分发构造器执行多个生成之后返回该生成,该行将非常有用。

创建安装服务以分发映像

成功创建映像之后,需要创建一个安装服务来将映像分发(安装)到其他系统。

Oracle Solaris 11 中的安装服务通过 installadm 命令来进行处理,它们明显比先前版本的 Oracle Solaris 中的情况更简单。

如前所述,根据用作输入的 XML 清单的不同,分发构造器所产生的映像可以分为三种风格:

  • 基于自动安装程序
  • 基于文本安装程序
  • 基于 LiveCD/USB

例如,如果您使用的是自动安装程序映像,则可以使用 installadm create-service 命令创建安装服务并将该映像发布到该服务,以便该映像对客户端可用。

以下是在可能已经有几个预配置服务的自动安装服务器上创建安装服务的一个简单示例。

root@solarix:~# installadm create-service -n x86snv173 -s \  /home/isaac/MyGoldenImage_Solaris_AI_X86.iso 
OK to use default image path: /export/auto_install/x86snv173? [y/N]: y

Creating service: x86snv173

Setting up the target image at /export/auto_install/x86snv173 ...
Refreshing install services

就是这样!您可以验证刚刚创建的服务是否列出,如下所示:

root@solarix:~# installadm list

Service Name  Alias Of  Status  Arch   Image Path 
------------  --------  ------  ----   ---------- 
x86snv173     -         on      x86    /export/auto_install/x86snv173
修订版 1.0,2011 年 9 月 20 日