/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。每次调用带有 load、add 或 set 子命令的 aimanifest 命令时,都会打开、修改和保存 AIM_MANIFEST 文件。
aimanifest 命令可以修改的最小 AIM_MANIFEST 文件必须包含以下两项:
对适用于所开发的 XML 清单的 DTD 的 !DOCTYPE 引用。
该清单的根元素。
如果开始时使用空 AIM_MANIFEST 文件,则在 AI 要执行派生清单脚本时,第一个 aimanifest 命令必须指定 load 子命令,以至少装入所需的最小 AIM_MANIFEST 文件。修改清单的后续 aimanifest 命令使用 DTD 来确定在正在开发的清单中的何处添加元素。
除了将消息显示到 stdout 和 stderr 外,若要将错误消息和信息性消息保存到文件,请将 AIM_LOGFILE 环境变量设置为日志文件位置。信息将附加到该日志文件。该日志文件不会被清除。
aimanifest 命令包含以下选项:
显示用法帮助消息。
aimanifest 命令的 add、get 和 set 子命令具有以下选项:
返回该 aimanifest 命令创建(或对其执行操作)的 XML 元素的路径。该返回路径是节点 ID 链。您可以保存该返回路径值,以在对 aimanifest 的后续调用中使用。与使用 XML 元素和属性值指定路径相比,使用 –r 选项返回的路径会更为可靠,因为值可能会随所构建的 AI 清单而更改。有关 –r 选项返回的路径的更多信息,请参见“返回路径”部分。
aimanifest 命令的 load 子命令包含以下选项:
在添加新数据之前,不清除 AIM_MANIFEST 数据。
支持以下子命令:
将新元素添加到 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/D 和 value 为 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}}。
检索元素或属性值。对于空元素或属性值,将显示空字符串 ("")。path 必须与唯一的现有元素或属性匹配。有关 path 的更多信息,请参见“操作数”部分。
–r 选项可返回已访问节点的路径作为第二个返回字符串。有关更多信息,请参见“返回路径”部分。
更改现有元素或属性的值,或为现有元素创建新属性。不执行任何验证。
更改现有元素的值时,path 必须与唯一的现有元素匹配。如果该元素具有带相同标记的同级元素,则使用元素值或属性,或目标元素的子元素来使路径唯一。请参见“Path 操作数”部分。
设置某个属性值时,该属性不需要存在,但该属性所属的元素必须存在。
–r 选项可返回已更改元素的路径。有关更多信息,请参见“返回路径”部分。
从文件 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 要求的顺序将多个节点或子树添加到公共父节点。如果无法确定节点的正确位置,请将节点放置在它的新同级节点列表的末尾。
针对 !DOCTYPE 语句中引用的 DTD 验证 AIM_MANIFEST 清单。错误将输出到 stderr。如果验证失败,将返回非零状态。
需要以下操作数。
load 子命令需要 filename 操作数,它是要装入到 AIM_MANIFEST 清单的完整或部分清单的名称。
add 和 set 子命令需要 value 操作数。value 操作数是 path 操作数指定的元素或属性的有效值。
aimanifest 命令的 add、get 和 set 子命令需要 path 操作数。路径定义元素和属性的 XML 分层结构中的节点。
XML 元素分层结构也称为 XML 树。在以下部分 AI 清单中,auto_install 元素是树的根,ai_instance 和 software 元素是分支或子树的根。
<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_instance、target、disk 或 slice 开始指定上一段落中显示的 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 是元素的标记名称,如 /auto_install 所示。该分支规范也称为简单分支。只具有简单分支的路径称为简单路径。
A 是元素的标记名称,value 是该元素的值,如 /name="pkg:/entire" 所示。
A 是一个元素,B 是 A 的子元素,C 是 B 的子元素,value 是 C 元素的值。该路径格式指定的 A 元素具有值为 value 的孙元素 C。例如,如果 AI 清单具有多个软件部分,您可以使用此格式对安装软件包 pkg:/entire 的软件部分进行操作,如以下路径所示:
software[software_data/name="pkg:/entire"]
A 是一个元素,Aattr 是 A 的属性,而 value 是 Aattr 属性的值。该路径格式指定的 A 元素具有值为 value 的属性 Aattr。例如,如果 AI 清单定义了多个分片,您可以使用此格式对 name 值为 4 的分片进行操作,如 slice[@name="4"] 所示。
A 是一个元素,B 是 A 的子元素,C 是 B 的子元素,Cattr 是 C 的属性,而 value 是 Cattr 属性的值。该路径格式指定的 A 元素具有孙元素 C,C 元素具有值为 value 的属性 Cattr。例如,如果您的 AI 清单包含多个 software 部分,则可以使用此格式对包含某个 publisher 部分(其 name 值为 solaris)的 software 部分进行操作,例如,使用路径 software[source/publisher@name="solaris"] 。
/A[1] 指定清单中 A 元素的第一个实例。例如,如果 AI 清单具有多个软件部分,您可以使用此格式对第二个软件部分进行操作,如 /auto_install[1]/ai_instance[1]/software[2] 所示。
这是由 –r 选项返回的路径格式。请参见“返回路径”部分。
该路径指定了 A 元素的 Aattr 属性。该路径不指定 A 元素,而是指定 Aattr 属性。可使用此格式设置或获取 Aattr 属性。
该路径指定了 A 元素的 Aattr 属性,A 元素具有值为 value 的孙元素 C。
该路径指定了 A 元素的 Aattr 属性,A 元素具孙元素 C,C 元素具有值为 value 的属性 Cattr。
该路径指定了值为 value 的 B 元素的 Battr 属性。B 元素是 A 元素的子元素。
通过 –r 选项,add、get 和 set 子命令可返回由子命令创建或访问的元素地址。该返回地址采用节点 ID 链的格式。该返回地址可用于再次访问同一元素,即使与该元素关联的值已更改。
以下示例说明,由 –r 选项返回的地址可能比指定元素和属性值的路径更易于使用。从以下节点树开始:
auto_install | ai_instance | target | disk attribute: whole_disk=true | disk_name attribute: name=data1 attribute: name_type=volid
添加具有 name 属性值 data2 和 name_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 清单条目。为简明起见,省略了 destination 和 software_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_install 和 ai_instance 元素。如果装入的文件为 auto_install 或 ai_instance 元素指定属性,则这些属性值将替换现有值,或者将添加这些属性值。
使用以下命令将此 software 部分添加到 AIM_MANIFEST 清单:
$ aimanifest load -i extras.xml示例 6 使用值路径添加软件包
该示例通过将发布者名称指定为路径中的值,来将软件包添加到具有名为 solaris 的 publisher 元素的 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_install 和 ai_instance 元素。如果装入的文件为 auto_install 或 ai_instance 元素指定属性,则这些属性值将替换现有值,或者将添加这些属性值。
使用以下命令将此 software 部分添加到 AIM_MANIFEST 清单:
$ aimanifest load -i newpkg.xml示例 9 验证清单
验证 AIM_MANIFEST 清单。
$ aimanifest validate
将返回以下退出值:
该命令被成功处理。
出现错误。
该环境变量的值是所构建的 AI 清单的位置。
该环境变量的值是 aimanifest 操作的日志文件位置。
有关下列属性的说明,请参见 attributes(5):
|