手册页部分 1M: 系统管理命令

退出打印视图

更新时间: 2014 年 7 月
 
 

aimanifest(1M)

名称

aimanifest - 修改自动化安装程序 (Automated Installer, AI) 所使用的 XML 文件

用法概要

/usr/bin/aimanifest [-h]
aimanifest add [-r] path value
aimanifest get [-r] path
aimanifest set [-r] path value
aimanifest load [-i] filename
aimanifest validate

描述

aimanifest 命令可创建新的 XML 清单或修改现有的清单。虽然 aimanifest 可用于包含对 DTD 定义的有效 !DOCTYPE 引用的任何 XML 文件,但它的设计目的是创建供自动化安装程序 (Automated Installer, AI) 使用的派生清单。有关 AI 派生清单的信息,请参见《安装 Oracle Solaris 11 系统》。

可以多次调用 aimanifest 命令以开发清单。AIM_MANIFEST 环境变量指定供 aimanifest 进行修改的清单的位置。必须设置 AIM_MANIFEST。每次调用带有 loadaddset 子命令的 aimanifest 命令时,都会打开、修改和保存 AIM_MANIFEST 文件。

    aimanifest 命令可以修改的最小 AIM_MANIFEST 文件必须包含以下两项:

  • 对适用于所开发的 XML 清单的 DTD 的 !DOCTYPE 引用。

  • 该清单的根元素。

如果开始时使用空 AIM_MANIFEST 文件,则在 AI 要执行派生清单脚本时,第一个 aimanifest 命令必须指定 load 子命令,以至少装入所需的最小 AIM_MANIFEST 文件。修改清单的后续 aimanifest 命令使用 DTD 来确定在正在开发的清单中的何处添加元素。

除了将消息显示到 stdoutstderr 外,若要将错误消息和信息性消息保存到文件,请将 AIM_LOGFILE 环境变量设置为日志文件位置。信息将附加到该日志文件。该日志文件不会被清除。

选项

aimanifest 命令包含以下选项:

–h–-help

显示用法帮助消息。

aimanifest 命令的 addgetset 子命令具有以下选项:

–r, –-return-path

返回该 aimanifest 命令创建(或对其执行操作)的 XML 元素的路径。该返回路径是节点 ID 链。您可以保存该返回路径值,以在对 aimanifest 的后续调用中使用。与使用 XML 元素和属性值指定路径相比,使用 –r 选项返回的路径会更为可靠,因为值可能会随所构建的 AI 清单而更改。有关 –r 选项返回的路径的更多信息,请参见“返回路径”部分。

aimanifest 命令的 load 子命令包含以下选项:

–i, –-incremental

在添加新数据之前,不清除 AIM_MANIFEST 数据。

子命令

支持以下子命令:

aimanifest add [-r | --return-path] path value

将新元素添加到 XML 清单。在 path 上添加新元素,其值为 value。有关 path 的更多信息,请参见“操作数”部分。如果 path 以属性 (@attr) 结尾,则新元素具有 attr 属性,而 value 为该属性的值。

除了检查 path 中的父/子关系外,不执行任何验证。

–r 选项可返回新添加节点的路径。有关更多信息,请参见“返回路径”部分。

如果父路径与 AIM_MANIFEST 文件中的元素匹配,则它必须仅与一个元素匹配。新元素将创建为匹配的父元素的子项。该路径可以指定元素和属性值以匹配唯一的父元素,如本部分中“示例 2:带有值的路径”所示。

    如果父路径与 AIM_MANIFEST 文件中的元素不匹配,则根据需要创建新元素并将新子元素添加到新父元素中。根据以下规则,将已添加元素的路径从以前存在的元素中分割出来:

  • 分割发生在路径中用于指定某个值的所有组成部分之后。

  • 分割发生在路径中用于指定某个值的所有组成部分之后,且在 DTD 允许多个带相同标记的相关元素的第一个位置处。

    使用该 XML 清单模式分析以下示例:

  • 清单以单个 A 节点开始。

  • A 节点只能有一个 B 节点子项。

  • B 节点可以有多个 C 节点子项。

  • C 节点可以有多个 D 节点子项。

示例 1:简单路径。AI 清单具有一个 A 节点、一个 B 节点和一个 C 节点:/A/B/C。在 path/A/B/C/D 的情况下发出 add 子命令。在这种情况下,将创建新的 C 节点,因为 C 节点是路径中可以具有带相同标记的同级节点的第一个节点。将添加新 D 节点作为新 C 节点的子项。生成的清单结构为 /A/B/{C,C/D}。针对不同的 D 值发出同一命令将会产生三个 C 节点:/A/B/{C,C/D,C/D}

示例 2:带有值的路径。AI 清单具有一个 A 节点、一个 B 节点和两个 C 节点。只有其中一个 C 节点的值为 1,因此清单的结构为 /A/B/{C,C=1}。在 path/A/B/C=1/Dvalue 为 10 的情况下发出 add 子命令。在这种情况下,不会添加新的 C 节点,因为对 C 指定值 1 会标识唯一的节点,该路径不能在指定了值的分支上或其之前进行分割。该路径可以进行分割的第一个位置是 D 处。将添加值为 10 的新 D 节点作为值为 1 的 C 节点的子项。生成的清单结构为 /A/B/{C,C=1/D=10}。针对值为 20 的 D 发出同一命令将产生 /A/B/{C,C=1/{D=10,D=20}}

aimanifest get [-r | --return-path] path

检索元素或属性值。对于空元素或属性值,将显示空字符串 ("")。path 必须与唯一的现有元素或属性匹配。有关 path 的更多信息,请参见“操作数”部分。

–r 选项可返回已访问节点的路径作为第二个返回字符串。有关更多信息,请参见“返回路径”部分。

aimanifest set [-r | --return-path] path value

更改现有元素或属性的值,或为现有元素创建新属性。不执行任何验证。

更改现有元素的值时,path 必须与唯一的现有元素匹配。如果该元素具有带相同标记的同级元素,则使用元素值或属性,或目标元素的子元素来使路径唯一。请参见“Path 操作数”部分。

设置某个属性值时,该属性不需要存在,但该属性所属的元素必须存在。

–r 选项可返回已更改元素的路径。有关更多信息,请参见“返回路径”部分。

aimanifest load [-i | --incremental] filename

从文件 filename 中装入 XML 清单或部分 XML 清单。除了检查元素的父/子关系外,不执行任何验证。

如果未指定 –i 选项,将覆盖任何现有 XML 数据。AIM_MANIFEST 文件中的所有数据将替换为 filename 文件的内容。filename 文件必须包括对 DTD 的 !DOCTYPE 引用,以便后续 aimanifest 命令可以修改该文件。

如果指定 –i 选项,则在添加新数据之前,不清除 AIM_MANIFEST 数据。而是,以增量方式插入新数据或将新数据与现有 XML 数据合并。AIM_MANIFEST 中 !DOCTYPE 引用指定的 DTD 用于确定合并 filename 数据的方式和位置。如果缺少 !DOCTYPE 引用,将使用位于 /usr/share/install/ai.dtd 的 AI 清单 DTD。如果 filename 中的数据无法与 DTD 协调,将返回非零错误状态。

    以下注意事项会影响将新数据插入到 AIM_MANIFEST 清单的位置:

  • AIM_MANIFEST 数据路径和 filename 数据路径开头附近元素的标记的匹配程度

  • 这些 AIM_MANIFEST 数据元素下所允许的子元素

  • 允许带相同标记的同级元素的位置

  • 不带子项的 AIM_MANIFEST 数据节点所在的位置

    处理 filename 数据的每个元素时,如果符合以下所有条件,则通常不会在 AIM_MANIFEST 数据中为此元素创建新节点。而是,使用新数据替换现有节点。

  • 两个数据集均包含具有相同标记和相同位置的节点。

  • AIM_MANIFEST 中 !DOCTYPE 引用指定的 DTD 不允许这两个节点作为带相同标记的同级元素一起存在。

  • filename 数据元素具有子项。

插入 filename 中的元素时,将在开始创建新节点的位置进行分割,尽可能地接近 AIM_MANIFEST 数据根。分割的第一个新节点将在允许带相同标记的同级元素的最早点创建,或者在相应的最早点(如果 AIM_MANIFEST 中不存在带相同标记的元素)创建。

    使用该 XML 清单模式分析以下示例:

  • 清单以单个 A 节点开始。

  • A 节点只能有一个 B 节点子项。

  • B 节点可以有多个 C 节点子项。

  • B 节点只能有一个 E 节点子项。

    示例 1:插入带相同标记的元素。如果 AIM_MANIFEST 的内容为 /A/B/C1/D1,而 filename 的内容为 /A/B/C2/D2,则在执行 load -i 命令后,AIM_MANIFEST 文件的内容为 /A/B/{C1/D1,C2/D2}。C 节点是可以添加新节点的第一个位置。filename 数据中的 C 节点将添加到 AIM_MANIFEST 数据的现有 C 节点之后。如果两个 A 元素具有不同的值或者两个 B 元素具有不同的值,则 filename 元素的值将替换 AIM_MANIFEST 元素的值。如果两个 A 元素具有不同的属性或者两个 B 元素具有不同的属性,则将合并属性值。

  • 同时存在于 AIM_MANIFEST 文件和 filename 文件中的 A 和 B 的属性在合并文件中采用 filename 文件中的值。

  • 存在于 AIM_MANIFEST 文件或 filename 文件但不同时存在于这两个文件中的 A 和 B 的属性将都保留在合并文件中。

示例 2:插入带不同标记的元素。如果 AIM_MANIFEST 的内容为 /A/B/C/D,而 filename 的内容为 /A/B/E/F,则在执行 load -i 命令后,AIM_MANIFEST 文件的内容为 /A/B/{E/F,C/D}。E 节点将添加到 DTD 允许该节点的第一个位置处。元素 A 和 B 的值是 filename 中的值,而 A 和 B 的属性将从 filename 合并到 AIM_MANIFEST,如上面的示例 1 所述。

有时,无法确定正确的合并位置。如果尚未在要合并的节点后添加所需的同级节点,则可能会发生这种情况。要避免出现此问题,请以 DTD 要求的顺序将多个节点或子树添加到公共父节点。如果无法确定节点的正确位置,请将节点放置在它的新同级节点列表的末尾。

aimanifest validate

针对 !DOCTYPE 语句中引用的 DTD 验证 AIM_MANIFEST 清单。错误将输出到 stderr。如果验证失败,将返回非零状态。

操作数

需要以下操作数。

Filename 操作数

load 子命令需要 filename 操作数,它是要装入到 AIM_MANIFEST 清单的完整或部分清单的名称。

Value 操作数

addset 子命令需要 value 操作数。value 操作数是 path 操作数指定的元素或属性的有效值。

Path 操作数

aimanifest 命令的 addgetset 子命令需要 path 操作数。路径定义元素和属性的 XML 分层结构中的节点。

XML 元素分层结构也称为 XML 树。在以下部分 AI 清单中,auto_install 元素是树的根,ai_instancesoftware 元素是分支或子树的根。

<auto_install>
  <ai_instance>
    <software type="IPS"/>
  </ai_instance>
</auto_install>

aimanifest 路径语法中,使用正斜杠字符 (/) 表示树结构中的分支。在当前示例中,software 元素的路径为 /auto_install/ai_instance/software

属性将绑定到一个元素。在 aimanifest 路径语法中,使用 at 符号 (@) 标识属性名称。software 元素的 type 属性的路径为 /auto_install/ai_instance/software@type

aimanifest path 操作数必须对应于单个元素。根据需要包括元素和属性值以使路径唯一。例如,要指定以下部分 AI 清单中定义的第二个分片的大小,您可以使用路径 /auto_install/ai_instance/target/disk/slice[@name="4"]/size@val 来标识要为其指定大小的分片。

<auto_install>
  <ai_instance>
    <target>
        <disk>
          <slice name="0"/>
          <slice name="4"/>
        </disk>
    </target>
  </ai_instance>
</auto_install>

允许使用相对路径。可以从 ai_instancetargetdiskslice 开始指定上一段落中显示的 slice 路径,因为只有一个 name 属性值为 4 的 slice。例如,您可以使用路径 slice[@name="4"]/size@val

如果 path 内的 value 包含正斜杠字符,则该值必须用单引号或双引号括起来,如 /name="pkg:/entire" 所示。

如果 aimanifest 调用位于 shell 脚本中,则包含引号的值可能需要进行其他特殊处理。在 shell 脚本中,aimanifest 路径值中的引号可能需要用前导反斜杠字符 (\) 进行转义,以便 shell 不会删除或解释引号。检查要使用的 shell 规则。以下示例显示了 ksh93 脚本中带有正斜杠字符的值:

/usr/bin/aimanifest get software_data[name=\"pkg:/entire\"]@action

本手册页中的大多数示例都省略了反斜杠转义字符,因为本手册页假定不在脚本或特定 shell 中调用 aimanifest。有关 AI 派生清单脚本的信息,请参见《安装 Oracle Solaris 11 系统》。

以下分支格式说明了如何构造元素或元素属性的路径。

/A

A 是元素的标记名称,如 /auto_install 所示。该分支规范也称为简单分支。只具有简单分支的路径称为简单路径。

/A=value

A 是元素的标记名称,value 是该元素的值,如 /name="pkg:/entire" 所示。

/A[B/C=value]

A 是一个元素,BA 的子元素,CB 的子元素,valueC 元素的值。该路径格式指定的 A 元素具有值为 value 的孙元素 C。例如,如果 AI 清单具有多个软件部分,您可以使用此格式对安装软件包 pkg:/entire 的软件部分进行操作,如以下路径所示:

software[software_data/name="pkg:/entire"]
/A[@Aattr=value]

A 是一个元素,AattrA 的属性,而 valueAattr 属性的值。该路径格式指定的 A 元素具有值为 value 的属性 Aattr。例如,如果 AI 清单定义了多个分片,您可以使用此格式对 name 值为 4 的分片进行操作,如 slice[@name="4"] 所示。

/A[B/C@Cattr=value]

A 是一个元素,BA 的子元素,CB 的子元素,CattrC 的属性,而 valueCattr 属性的值。该路径格式指定的 A 元素具有孙元素 C,C 元素具有值为 value 的属性 Cattr。例如,如果您的 AI 清单包含多个 software 部分,则可以使用此格式对包含某个 publisher 部分(其 name 值为 solaris)的 software 部分进行操作,例如,使用路径 software[source/publisher@name="solaris"]

/A[1]

/A[1] 指定清单中 A 元素的第一个实例。例如,如果 AI 清单具有多个软件部分,您可以使用此格式对第二个软件部分进行操作,如 /auto_install[1]/ai_instance[1]/software[2] 所示。

这是由 –r 选项返回的路径格式。请参见“返回路径”部分。

/A@Aattr

该路径指定了 A 元素的 Aattr 属性。该路径不指定 A 元素,而是指定 Aattr 属性。可使用此格式设置或获取 Aattr 属性。

/A[B/C=value]@Aattr

该路径指定了 A 元素的 Aattr 属性,A 元素具有值为 value 的孙元素 C

/A[B/C@Cattr=value]@Aattr

该路径指定了 A 元素的 Aattr 属性,A 元素具孙元素 C,C 元素具有值为 value 的属性 Cattr

/A/B=value@Battr

该路径指定了值为 valueB 元素的 Battr 属性。B 元素是 A 元素的子元素。

返回路径

返回路径

通过 –r 选项,addgetset 子命令可返回由子命令创建或访问的元素地址。该返回地址采用节点 ID 链的格式。该返回地址可用于再次访问同一元素,即使与该元素关联的值已更改。

以下示例说明,由 –r 选项返回的地址可能比指定元素和属性值的路径更易于使用。从以下节点树开始:

        auto_install
             |
        ai_instance
             |
           target
             |
           disk
         attribute: whole_disk=true
             |
         disk_name
         attribute: name=data1
         attribute: name_type=volid

添加具有 name 属性值 data2name_type 属性值 volid 的新 disk 节点:

        auto_install
             |
        ai_instance
             |
           target
             |
  |----------|----------|
disk                  disk
whole_disk=true       whole_disk=true
    |                     |
disk_name             disk_name
name=data1            name=data2
name_type=volid       name_type=volid

可以使用单个命令轻松添加具有一个属性的新 disk_name 元素。要添加第二个和第三个属性,您必须指定要更改的 disk_name 元素。比较以下用于多次访问同一节点的两种方法。

使用值指定路径

此示例中的命令使用值指定路径。请注意,您必须在第一个命令中分配一个唯一值,以便可以使用该值在后续命令中指定唯一路径。如果值已更改,该方法可能会产生错误的结果。

$ aimanifest add target/disk/disk_name@name data2
$ aimanifest set \
> target/disk/disk_name[@name=data2]@name_type volid
$ aimanifest set \
> target/disk[disk_name@name=data2]@whole_disk true

使用返回路径指定路径

多次访问同一节点的最可靠方法是将路径保存到新 disk_name 元素,然后使用该保存路径进行后续访问。

$ NewDisk=$(aimanifest add -r target/disk@whole_disk true)
$ aimanifest add ${NewDisk}/disk_name@name data2
$ aimanifest add ${NewDisk}/disk_name@name_type volid

通过 –r 选项返回到 $NewDisk 的路径采用 ID 来表示节点,并且没有值:

$ aimanifest add -r target/disk/@whole_disk true
/auto_install[1]/ai_instance[1]/target[1]/disk[2]

示例

要尝试执行这些示例,您需要设置 AIM_MANIFEST。

$ export AIM_MANIFEST=/tmp/aimtest.xml

    aimanifest 命令可以修改的最小 AIM_MANIFEST 文件必须包含以下两项:

  • 对适用于所开发的 XML 清单的 DTD 的 !DOCTYPE 引用。

  • 该清单的根元素。

以下示例显示 AI 清单的最小 AIM_MANIFEST 清单文件:

<!DOCTYPE auto_install SYSTEM "file:///usr/share/install/ai.dtd">
<auto_install/>

通常,您将在派生清单脚本中使用 aimanifest 命令,对现有的有效 AI 清单进行操作。要尝试执行这些示例,您可以复制 /usr/share/auto_install/manifest/default.xml,然后定义 AIM_MANIFEST 以引用该副本。确保该副本可写。

示例 1 设置 auto_reboot 属性
$ aimanifest set /auto_install/ai_instance@auto_reboot false
示例 2 获取 auto_reboot
$ aimanifest get /auto_install/ai_instance@auto_reboot
false
示例 3 使用值路径添加发布者

该示例中的软件包系统信息库是 file:///net/host2/export/extras_repo 中的文件系统信息库。发布者为 extras。由于一个 software 元素只能具有一个 source 元素,因此本示例会将新 publisher 元素添加到包含 solaris 发布者的 source 元素中。

$ aimanifest add \
> software[@type=IPS]/source[publisher@name=solaris]/publisher@name \

extras
$ aimanifest add \
> publisher[@name=extras]/origin@name \
> file:///net/host2/export/extras_repo

如果您以 default.xml AI 清单起步,则这些 aimanifest 命令将导致以下 AI 清单条目。为简明起见,省略了 destinationsoftware_data 元素。

<software type="IPS">
  <source>
    <publisher name="solaris">
      <origin name="http://pkg.oracle.com/solaris/release"/>
    </publisher>
    <publisher name="extras">
      <origin name="file:///net/host2/export/extras_repo"/>
    </publisher>
  </source>
</software>
示例 4 使用返回路径添加发布者

此示例与上一示例相同,但使用不同的方法实现相同的结果。

$ NEW_PUB=$(aimanifest add -r \
> software[@type=IPS]/source[publisher@name=solaris]/publisher@name \

extras)
$ echo $NEW_PUB
/auto_install[1]/ai_instance[1]/software[1]/source[1]/publisher[2]
$ aimanifest add ${NEW_PUB}/origin@name \
file:///net/host2/export/extras_repo
示例 5 通过添加清单片段添加发布者

本示例通过装入包含一个部分 AI 清单的文件添加 extras 发布者。在这种情况下,会单独生成一个附加的 IPS 类型的 software 元素且定义有 extras 发布者。此新的 software 元素将插入到定义了 solaris 发布者的原始 IPS software 元素之后。以这一新 software 元素内的 software_data 元素命名的软件包仅从 extras 发布者或此新 software 元素中定义的其他发布者中进行搜索。此清单片段还定义了一个要安装的软件包,因为不包含要安装的软件的 software 元素不起作用。

创建具有以下内容的名为 extras.xml 的文件:

<auto_install>
  <ai_instance>
    <software type="IPS">
      <source>
        <publisher name="extras">
          <origin name="file:///net/host2/export/extras_repo"/>
        </publisher>
      </source>
      <software_data action="install">
        <name>pkg:/package/from/extras_repo</name>
      </software_data> 
    </software>
  </ai_instance>
</auto_install>

即使您只需要 software 部分,您也必须包括 auto_installai_instance 元素。如果装入的文件为 auto_installai_instance 元素指定属性,则这些属性值将替换现有值,或者将添加这些属性值。

使用以下命令将此 software 部分添加到 AIM_MANIFEST 清单:

$ aimanifest load -i extras.xml
示例 6 使用值路径添加软件包

该示例通过将发布者名称指定为路径中的值,来将软件包添加到具有名为 solarispublisher 元素的 software 元素。

$ aimanifest add \
> software[source/publisher@name=solaris]/software_data/name \
> pkg:/system/utils

如果您以 default.xml AI 清单起步,则 aimanifest 命令会添加下面显示的第二个 software_data 元素。

<software_data action="install">
  <name>pkg:/entire@latest</name>
  <name>pkg:/group/system/solaris-large-server</name>
</software_data>
<software_data>
  <name>pkg:/system/utils</name>
</software_data>
示例 7 使用返回路径添加软件包

此示例与上一示例相同,但使用不同的方法实现相同的结果。本示例使用带有返回路径选项的 get 子命令将软件包添加到定义了 solaris 发布者的 software 元素。

$ NEW_PKG=$(aimanifest get -r \
software[source/publisher@name=solaris] | awk '{print $2 }')
$ echo $NEW_PKG
/auto_install[1]/ai_instance[1]/software[1]
$ aimanifest add ${NEW_PKG}/software_data/name \
pkg:/system/utils
示例 8 通过添加清单片段添加软件包

本示例通过装入包含一个部分 AI 清单的文件来添加软件包。在这种情况下,会单独生成一个附加的 IPS 类型的 software 元素,且该元素插入到原始 IPS software 元素之后。这一新 software 只包含一个 software_data 元素;没有指定任何 source 元素。以这一新 software 元素中的 software_data 元素命名的软件包会从上述的 software 元素中定义的发布者中进行搜索。

创建具有以下内容的名为 newpkg.xml 的文件:

<auto_install>
  <ai_instance>
    <software type="IPS">
      <software_data>
        <name>pkg:/system/utils</name>
      </software_data>
    </software>
  </ai_instance>
</auto_install>

即使您只需要 software 部分,您也必须包括 auto_installai_instance 元素。如果装入的文件为 auto_installai_instance 元素指定属性,则这些属性值将替换现有值,或者将添加这些属性值。

使用以下命令将此 software 部分添加到 AIM_MANIFEST 清单:

$ aimanifest load -i newpkg.xml
示例 9 验证清单

验证 AIM_MANIFEST 清单。

$ aimanifest validate

退出状态

将返回以下退出值:

0

该命令被成功处理。

>0

出现错误。

文件

AIM_MANIFEST

该环境变量的值是所构建的 AI 清单的位置。

AIM_LOGFILE

该环境变量的值是 aimanifest 操作的日志文件位置。

属性

有关下列属性的说明,请参见 attributes(5):

属性类型
属性值
可用性
system/install/auto-install/auto-install-common
接口稳定性
Uncommitted(未确定)

另请参见

installadm(1M)

安装 Oracle Solaris 11.2 系统 中的第 III 部分, 使用安装服务器安装