JavaScript is required to for searching.
跳过导航链接
退出打印视图
Oracle Solaris 11 安装手册页     Oracle Solaris 11 Information Library (简体中文)
search filter icon
search icon

文档信息

前言

系统管理命令

aimanifest(1M)

distro_const(1M)

installadm(1M)

js2ai(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 清单,或修改现有的 XML 清单。尽管包含对某个 DTD 定义的有效 !DOCTYPE 引用的任何 XML 文件都可以使用 aimanifest,但是,该命令的目标用途是创建自动化安装程序 (Automated Installer, AI) 使用的派生清单。有关 AI 派生清单的信息,请参见《安装 Oracle Solaris 11 系统》。

可以多次调用 aimanifest 命令来开发清单。AIM_MANIFEST 环境变量用于指定 aimanifest 要修改的清单的位置。必须设置 AIM_MANIFEST。每次结合 loadaddset 子命令调用 aimanifest 命令时都会打开、修改和保存 AIM_MANIFEST 文件。

aimanifest 命令可以修改的 AIM_MANIFEST 文件至少必须同时包含下列两个片段:

如果使用一个空的 AIM_MANIFEST 文件开始操作(就像 AI 执行派生的清单脚本时那样),那么,第一个 aimanifest 命令必须指定 load 子命令来加载最起码所需的 AIM_MANIFEST 文件。用于修改清单的后续 aimanifest 命令将使用该 DTD 来确定在开发清单中的哪个位置添加元素。

如果既要在 stdoutstderr 中显示消息,又要在某个文件中保存错误消息和提示性消息,请将 AIM_LOGFILE 环境变量设置为某个日志文件位置。信息将附加在该日志文件中。该日志文件不被清除。

选项

aimanifest 命令包括以下选项:

-h--help

显示用法帮助消息。

aimanifest 命令的 addgetset 子命令包括以下选项:

-r, --return-path

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

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

-i, --incremental

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

子命令

支持以下子命令:

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 节点是路径中可以包含具有相同标记的同级的首批节点。将为新的 C 节点添加新的 D 节点作为子级。生成的清单的结构为 /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}}

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

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

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

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

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

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

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

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

load [-i | --incremental] filename

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

如果未指定 -i 选项,则会覆盖任何现有的 XML 数据。AIM_MANIFEST 文件中的所有数据将替换为 filename 文件的内容。filename 文件必须包含对某个 DTD 的 !DOCTYPE 引用,以便后续的 aimanifest 命令能够修改此文件。

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

以下事项会影响新数据在 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/D1filename 的内容为 /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/Dfilename 的内容为 /A/B/E/F,则发出 load -i 命令后,AIM_MANIFEST 文件的内容为 /A/B/{E/F,C/D}。E 节点添加在 DTD 允许这种节点的第一个位置。元素 A 和 B 的值是 filename 中的值,A 和 B 的属性已根据上述“示例 1”从 filename 合并为 AIM_MANIFEST

有时,无法确定正确的合并位置。如果需要跟在待合并节点后面的某个同级尚未添加,则可能会发生此情况。为避免出现此问题,请按照 DTD 强制要求的顺序,将多个节点或子树添加到某个公用父节点。如果无法确定某个节点在其新同级中的适当位置,请将此节点放置在新同级列表的末尾。

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 路径语法中,使用 @ 符号标识属性名称。software 元素的 type 属性的路径为 /auto_install/ai_instance/software@type

aimanifestpath 操作数必须对应于单个元素。请根据需要包含元素和属性值,以使路径保持唯一。例如,要为以下部分 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>

允许相对路径。以上段落中显示的 slice 路径在指定时可以使用 ai_instance targetdiskslice 开头,因为只有一个 slice 使用了 name 属性值 4。例如,可以使用路径 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

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

下列格式的分支显示了如何构造某个元素或元素属性的路径。

/A

A 是元素的标记名称,例如 /auto_install。此分支规范又称为简单分支。仅包含简单分支的路径称为简单路径。

/A=value

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

/A[B/C=value]

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

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,该孙级元素的 Cattr 属性值为 value。例如,如果您的 AI 清单包含多个 software 部分,则可以使用此格式对包含某个 publisher 部分(其 name 值为 solaris)的 software 部分进行操作,例如,使用路径 software[source/publisher@name="solaris"]

/A[1]

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

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

/A@Aattr

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

/A[B/C=value]@Aattr

此路径格式指定了 A 元素的 Aattr 属性,该元素包含值为 value 的孙级元素 C

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

此路径格式指定了 A 元素的 Aattr 属性,该元素包含孙级元素 C,该孙级元素的 Cattr 属性值为 value

/A/B=value@Battr

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

返回路径

使用 -r 选项,addget set 子命令将返回子命令创建或访问的元素的地址。这个返回的地址采用了节点 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 文件至少必须同时包含下列两个片段:

以下示例显示了某个 AI 清单最起码所需的 AIM_MANIFEST 清单文件:

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

通常,您会在对现有有效 AI 清单执行操作的派生清单脚本中使用 aimanifest 命令。要尝试演示这些示例,您可以复制 /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

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

这些 aimanifest 命令将导致生成下列 AI 清单条目。software 元素是允许相同标记的同级的 path 中的第一个元素,因此,该 XML 代码部分跟在已出现在输出文件中的最后一个 software 部分的后面。

<software name="extras" type="IPS">
  <source>
    <publisher name="extras">
      <origin name="file:///net/host2/export/extras_repo"/>
    </publisher>
  </source>
</software>

示例 4 通过使用返回路径添加发布者

该示例与前一示例相同,但使用不同的方法来实现相同的结果。

$ SW_PATH=$(aimanifest add -r \
> /auto_install/ai_instance/software@name extras)
$ aimanifest set ${SW_PATH}@type IPS
$ PUB_PATH=$(aimanifest add ${SW_PATH}/source/publisher@name extras)
$ aimanifest add \
${PUB_PATH}/origin@name file:///net/host2/export/extras_repo)

示例 5 通过添加清单段来添加发布者

该示例与前一示例相同,但使用第三种方法来实现相同的结果。

创建一个名称为 extras.xml、包含以下内容的文件:

<auto_install>
  <ai_instance>
    <software name="extras" type="IPS">
      <source>
        <publisher name="extras">
          <origin name="file:///net/host2/export/extras_repo"/>
        </publisher>
      </source>
    </software>
  </ai_instance>
</auto_install>

尽管您只需要 software 部分,但您必须同时包含 auto_installai_instance 元素。必须包含 path 操作数中所需的任何内容。如果加载的文件为 auto_install ai_instance 元素指定了属性,则这些属性值将替换现有值,或者被添加。

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

$ aimanifest load -i extras.xml

示例 6 通过使用值路径添加软件包

该示例通过指定发布者名称作为路径中的值,将一个软件包添加到前一示例生成的 software 元素,该元素包含名称为 extraspublisher 元素。该示例还显示了如何使用相对路径规范。

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

aimanifest 命令添加了以下 software_data 部分。

<software name="extras" type="IPS">
  <source>
    <publisher name="extras">
      <origin name="file:///net/host2/export/extras_repo"/>
    </publisher>
  </source>
  <software_data>
    <name>pkg:/system/utils</name>
  </software_data>
</software>

示例 7 通过使用返回路径添加软件包

该示例与前一示例相同,但使用不同的方法来实现相同的结果。该示例没有指定发布者名称作为路径中的值,而是使用了示例“通过使用返回路径添加发布者”所述的保存在 SW_PATH 中的 software 元素的路径。

$ aimanifest add ${SW_PATH}/software_data/name pkg:/system/utils

示例 8 验证清单

验证 AIM_MANIFEST 清单。

$ aimanifest validate

退出状态

将返回以下退出值:

0

该命令已成功处理。

>0

出现错误。

文件

AIM_MANIFEST

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

AIM_LOGFILE

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

属性

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

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

另请参见

installadm(1M)pkg(1)

《安装 Oracle Solaris 11 系统》中的第 III 部分, "使用安装服务器安装"