跳过导航链接 | |
退出打印视图 | |
![]() |
Oracle Solaris 11 安装手册页 Oracle Solaris 11 Information Library (简体中文) |
- 修改自动化安装程序 (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。每次结合 load、add 或 set 子命令调用 aimanifest 命令时都会打开、修改和保存 AIM_MANIFEST 文件。
aimanifest 命令可以修改的 AIM_MANIFEST 文件至少必须同时包含下列两个片段:
对某个 DTD 的 !DOCTYPE 引用,该引用对于所开发的 XML 清单应该有效。
该清单的根元素。
如果使用一个空的 AIM_MANIFEST 文件开始操作(就像 AI 执行派生的清单脚本时那样),那么,第一个 aimanifest 命令必须指定 load 子命令来加载最起码所需的 AIM_MANIFEST 文件。用于修改清单的后续 aimanifest 命令将使用该 DTD 来确定在开发清单中的哪个位置添加元素。
如果既要在 stdout 和 stderr 中显示消息,又要在某个文件中保存错误消息和提示性消息,请将 AIM_LOGFILE 环境变量设置为某个日志文件位置。信息将附加在该日志文件中。该日志文件不被清除。
aimanifest 命令包括以下选项:
显示用法帮助消息。
aimanifest 命令的 add、get 和 set 子命令包括以下选项:
返回该 aimanifest 命令创建或对其执行操作的 XML 元素的路径。该返回路径是一个节点 ID 链。您可以保存这个返回路径,以便对 aimanifest 执行后续调用时使用。使用 -r 选项返回的路径,比使用 XML 元素和属性值指定路径更加可靠,因为在构建 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 节点是路径中可以包含具有相同标记的同级的首批节点。将为新的 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/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 必须匹配某个现有的唯一元素。如果该元素包含标记相同的同级,则使用元素值或属性或者目标元素的子元素来使路径保持唯一。请参见“路径操作数”部分。
设置某个属性的值时,该属性不需要存在,但该属性所属的元素必须存在。
-r 选项返回所更改元素的路径。有关更多信息,请参见“返回路径”部分。
从文件 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/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 的属性已根据上述“示例 1”从 filename 合并为 AIM_MANIFEST 。
有时,无法确定正确的合并位置。如果需要跟在待合并节点后面的某个同级尚未添加,则可能会发生此情况。为避免出现此问题,请按照 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 路径语法中,使用 @ 符号标识属性名称。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、 target、disk 或 slice 开头,因为只有一个 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 是元素的标记名称,例如 /auto_install。此分支规范又称为简单分支。仅包含简单分支的路径称为简单路径。
A 是元素的标记名称, value 是该元素的值,例如 /name="pkg:/entire"。
A 是元素,B 是作为 A 子级的元素,C 是作为 B 子级的元素,value 是 C 元素的值。此路径格式指定了 A 元素,该元素包含值为 value 的孙级元素 C。例如,如果您的 AI 清单包含多个 software 部分,则可以使用此格式对用于安装软件包 pkg:/entire 的 software 部分进行操作,如以下路径所示:
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,该孙级元素的 Cattr 属性值为 value。例如,如果您的 AI 清单包含多个 software 部分,则可以使用此格式对包含某个 publisher 部分(其 name 值为 solaris)的 software 部分进行操作,例如,使用路径 software[source/publisher@name="solaris"] 。
/A[1] 指定清单中某个 A 元素的第一个实例。例如,如果您的 AI 清单包含多个 software 部分,则可以使用此格式对第二个 software 部分进行操作,例如 /auto_install[1]/ai_instance[1]/software[2] 。
这是 -r 选项返回的路径格式。请参见“返回路径”部分。
此路径指定了 A 元素的 Aattr 属性。此路径没有指定 A 元素,而是指定了 Aattr 属性。使用此格式可以设置或获取 Aattr 属性。
此路径格式指定了 A 元素的 Aattr 属性,该元素包含值为 value 的孙级元素 C。
此路径格式指定了 A 元素的 Aattr 属性,该元素包含孙级元素 C,该孙级元素的 Cattr 属性值为 value。
此路径指定了值为 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 文件至少必须同时包含下列两个片段:
对某个 DTD 的 !DOCTYPE 引用,该引用对于所开发的 XML 清单应该有效。
该清单的根元素。
以下示例显示了某个 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_install 和 ai_instance 元素。必须包含 path 操作数中所需的任何内容。如果加载的文件为 auto_install 或 ai_instance 元素指定了属性,则这些属性值将替换现有值,或者被添加。
使用以下命令将此 software 部分添加到 AIM_MANIFEST 清单:
$ aimanifest load -i extras.xml
示例 6 通过使用值路径添加软件包
该示例通过指定发布者名称作为路径中的值,将一个软件包添加到前一示例生成的 software 元素,该元素包含名称为 extras 的 publisher 元素。该示例还显示了如何使用相对路径规范。
$ 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
将返回以下退出值:
该命令已成功处理。
出现错误。
该环境变量值是正在构建的 AI 清单的位置。
该环境变量值是 aimanifest 操作的日志文件的位置。
有关下列属性的说明,请参见 attributes(5):
|