手册页部分 5: 标准、环境和宏

退出打印视图

更新时间: 2014 年 7 月
 
 

pkg(5)

名称

pkg - 映像包管理系统

描述

映像包管理系统 pkg(5) 是用于提供软件生命周期管理(安装、升级和删除)的框架。映像包管理以软件包为单位对软件进行管理,软件包是由一组关键字/值对以及可能的数据有效负荷定义的操作的集合。在许多情况下,操作是在文件系统中找到的文件,但它们也表示其他可安装对象,例如驱动程序、服务和用户。

软件包 FMRI 和版本

软件包 FMRI 和版本

每个软件包均由带有机制 pkg: 的故障管理资源标识符 (fault management resource identifier, FMRI) 表示。软件包的完整 FMRI 由机制、发布者、软件包名称和以下格式的版本字符串组成:

pkg://solaris/system/library/c++-runtime@0.5.11,5.11-0.175.0.0.0.2.1:20120921T190358Z

solaris 是发布者。system/library/c++-runtime 是软件包名称。虽然名称空间是有层次的且可具有任意深度,但不存在强制包含;名称从本质上而言是任意的。发布者信息为可选项,但必须位于 pkg:// 之后(如果存在)。包含发布者的 FMRI 通常被称为“全限定”。如果不存在发布者信息,那么软件包名称之前通常应带有 pkg:/

如果 FMRI 不包含发布者信息,打包客户端通常允许省略 FMRI 的机制。例如,pkg:/system/library/c++-runtime 可以写为 system/library/c++-runtime。如果省略了机制,客户端也允许省略除软件包名称的最后一个组成部分(用于匹配目的)之外的所有其他内容。例如,system/library/c++-runtime 可以写为 library/c++-runtimec++-runtime,这将与名为 c++-runtime 的软件包或以 /c++-runtime 结尾的软件包名称匹配。

发布者名称将个人、个人组或组织标识为一个或多个软件包的源。为避免发布者名称冲突并有帮于标识发布者,最佳做法是使用代表发布软件包实体的域名作为发布者名称。

版本跟在软件包名称后面,由 @ 符号分隔。版本包含四个数字序列,由标点符号分隔。前三个序列中的元素由圆点分隔,各序列可具有任意长度。不允许版本的组成部分以零开头(例如 01.1 或 1.01)。允许以零结尾(例如 1.10)。

版本的第一个部分是组件版本。对于紧密绑定到操作系统上的组件,此序列通常是操作系统中该版本的 uname -r 值。对于具有自己的开发生命周期的组件,此序列是一个由小圆点分隔的发行编号,例如 2.4.10。

版本的第二个部分(如果存在)必须跟在逗号 (,) 后面,是内部版本。内部版本指定构建软件包内容的操作系统版本,提供了希望软件包内容可成功运行的最低操作系统版本。

版本的第三个部分(如果存在)必须跟在连字符 (-) 后面,是分支版本。分支版本是用于提供特定于供应商的信息的版本控制组件。分支版本可在打包元数据发生更改时增大,独立于组件版本。分支版本可能包含内部版本号或其他信息。

版本的第四个部分(如果存在)必须跟在冒号 (:) 后面,是一个时间戳。时间戳表示软件包的发布时间。

在版本之间进行比较时,不考虑完整版本的任何组件,除非左侧的组件与其相同。因此,4.3-1 大于 4.2-7,因为 4.3 大于 4.24.3-3 大于 4.3-1,因为 3 大于 1

pkg.human-version 属性可以用于提供人工可读的版本字符串。对于软件包 FMRI,除了上文描述的软件包版本外,还可以提供 pkg.human-version 属性值,但该值不能替代软件包 FMRI 版本。人工可读的版本字符串仅用于显示目的。请参见“设置操作”了解更多信息。

系统的许多部分(如果适用)会在显示 FMRI 时缩短 FMRI 并接受简短格式的输入,以减少显示的或所需的信息量。通常,可以省略机制、发布者、内部版本和时间戳。有时可以省略所有版本控制信息。

操作

操作

操作表示系统上的可安装对象。在软件包的清单中对操作进行了描述。每个操作主要由其名称和一个关键属性组成。这些属性共同引用一个唯一的对象,与该对象一样遵循版本历史记录。操作可以具有其他属性。某些属性由包管理系统直接解释。其他属性可能仅对系统管理员或最终用户有用。

操作具有一种简单文本表示法:

action_name attribute1=
value1 attribute2=value2 ...

属性名称中不能包含空格、引号或等号 (=)。第一个等号后的所有字符都属于值。值中可以包含所有这些符号,虽然空格必须括在单引号或双引号中。单引号处于括在双引号中的字符串内时不需要进行转义,双引号处于括在单引号中的字符串内时也不需要进行转义。可使用反斜杠 (\) 字符作为引号的前缀来避免终止带引号的字符串。反斜杠可使用反斜杠进行转义。

操作可以具有多个属性。可以针对单个操作使用不同的值来多次命名某些属性。具有相同名称的多个属性将被视为无序列表。

具有多个属性的操作可以在清单文件中创建长行。可以通过使用反斜杠终止每个不完整的行来对此类行进行折行。请注意,属性/值对之间必须具有此接续字符。属性、属性值及其组合均不可分离。

下面列出的属性不是全部属性。事实上,任意属性都可附加到操作中,标准属性组易于扩大以合并将来的开发。

某些属性会导致在打包上下文外部执行其他操作。这些属性记录在下面的“执行器”部分中。

文件操作

file 操作表示普通文件。file 操作引用有效负荷,具有四个标准属性:

path

安装文件的文件系统路径。此属性是 file 操作的关键属性。

mode

文件的访问权限(采用数字格式)。这些只是简单权限,并非 ACL。

owner

拥有文件的用户的名称。

group

拥有文件的组的名称。

有效负荷是一个位置属性,因为它未命名。它是操作名称后面的第一个词。在发布的清单中,它是文件内容的 SHA-1 散列。如果存在于尚待发布的清单中,则它表示可以找到有效负荷的路径。请参见 pkgsend(1)。如果值包括一个等号,则可以使用散列属性代替位置属性。这两种属性可用于同一操作中。但是,散列必须完全相同。

preserveoverlay 属性影响是否以及如何安装 file 操作。

preserve

指定在软件包操作过程中何时以及如何保留文件。

初始安装软件包时,如果软件包提供的文件使用任何值定义了 preserve 属性并且该文件已经存在于映像中,则现有文件将存储在 /var/pkg/lost+found 中并且安装打包的文件。

初始安装软件包时,如果软件包提供的文件定义了 preserve 属性,但该文件尚未存在于映像中,则是否安装该文件取决于 preserve 属性的值:

  • 如果 preserve 的值是 legacy,则不安装打包的文件。

  • 如果 preserve 的值不是 legacy,则安装打包的文件。

软件包降级时,如果软件包的降级版本提供的文件使用任何值定义了 preserve 属性并且以下所有条件都为 true,将使用扩展名 .update 重命名映像中当前存在的文件并安装降级软件包中的文件:

  • 文件存在于映像中。

  • 软件包的降级版本提供的文件的内容不同于软件包的当前安装版本提供的文件的内容。

  • 软件包的降级版本提供的文件的内容不同于映像中存在的文件的内容。

如果以上任一条件不为 true,处理文件的方式与升级(而不是降级)软件包时相同。

升级软件包时,如果软件包的升级版本提供的 file 操作使用任何值定义了 preserve 属性并且 file 操作与软件包的当前安装版本提供的 file 操作相同,则不安装文件并且不修改映像中存在的文件。将保留自安装先前版本以来进行的所有修改。

升级软件包时,如果软件包的升级版本提供的 file 操作定义了 preserve 属性并且 file 操作是新的或者不同于软件包的当前安装版本提供的 file 操作,则以下面的方式执行升级:

  • 如果文件不存在于映像中,将安装新文件。

  • 如果软件包的升级版本提供的文件存在于映像中,不存在于软件包的当前安装版本中并且未使用 original_name 属性进行重命名或移动(请参见下文),则现有文件将存储在 /var/pkg/lost+found 中并且安装软件包的升级版本提供的文件。

  • 如果软件包的升级版本提供的文件存在于映像中并且其内容不同于软件包的当前安装版本提供的文件,则根据 preserve 属性的值进行升级:

    • 如果软件包的升级版本提供的文件具有的 preserve 值为 renameold,将使用扩展名 .old 重命名现有文件并且使用更新的权限和时间戳(如果存在)安装新文件。请参见下文的 timestamp 属性描述。

    • 如果软件包的升级版本提供的文件具有的 preserve 值为 renamenew,将使用扩展名 .new 安装新文件并且不修改现有文件。

    • 如果软件包的升级版本提供的文件具有的 preserve 值为 true,则不安装新文件,但是在现有文件中重置权限和时间戳(如果存在)。

  • 如果软件包的升级版本提供的文件存在于映像中,具有的内容与软件包的当前安装版本提供的文件相同并且具有的 preserve 值为 renameoldrenamenew,则现有文件将替换为软件包的升级版本提供的文件,包括替换权限和时间戳(如果存在)。

  • 如果软件包的升级版本提供的文件存在于映像中,在升级的软件包中具有的 preserve 值为 legacy,并且在软件包的当前安装版本中具有不同的 preserve 值,则使用扩展名 .legacy 重命名现有文件,并使用更新的权限和时间戳(如果存在)安装新文件。

  • 如果软件包的升级版本提供的文件存在于映像中并且在升级的软件包和软件包的当前安装版本中具有的 preserve 值为 legacy ,则在现有文件中重置权限和时间戳(如果存在)。

overlay

指定操作是允许其他软件包在同一位置交付文件,还是用交付的文件覆盖其他文件。此功能设计用于不参与任何自组装(例如 /etc/motd)且可安全覆盖的配置文件。

如果未指定 overlay,多个软件包将无法向同一位置提供文件。

overlay 属性可以使用以下值之一:

allow

允许另一个软件包将文件交付到同一位置。除非也设置了 preserve 属性,否则此值没有效果。

true

该操作交付的文件将覆盖已指定了 allow 的任何其他操作。

基于覆盖文件的 preserve 属性值保留对已安装文件所做的更改。在删除时,如果仍要安装将覆盖的操作,则将保留文件的内容,无论是否指定了 preserve 属性。只能一个操作覆盖另一个操作,且 modeownergroup 属性必须匹配。

对于 ELF 文件,可识别下列属性:

elfarch

ELF 文件的体系结构。此属性是 uname -p 查询文件所基于的体系结构后的输出。

elfbits

此属性为 3264

elfhash

此属性是文件中“相关”ELF 部分的散列。这些部分已在装入二进制文件时映射到内存中。在确定两个二进制文件的可执行行为是否将不同时,仅需要考虑这些部分。

对于 file 操作,可识别下列其他属性:

original_name

此属性用于处理可编辑文件在软件包之间或在位置之间(或在这两者之间)的移动操作。此属性采用的格式为源软件包的名称后跟一个冒号和文件的原始路径。所删除的任何文件将使用其软件包和路径或 original_name 属性的值(如果指定)进行记录。所安装的已设置 original_name 属性的任何可编辑文件将使用具有该名称的文件(如果它在同一打包操作中被删除)。

release-note

该属性用于指明此文件包含发行说明文本。该属性的值为软件包 FMRI。如果 FMRI 指定的软件包名称存在于原始映像中,指定的版本比原始映像中的软件包版本更高,则此文件将成为发行说明的一部分。特殊 FMRI feature/pkg/self 是指包含软件包。如果 feature/pkg/self 的版本为 0,则此文件仅在初次安装时是发行说明的一部分。

revert-tag

此属性用于标记应恢复为一个组的可编辑文件。revert-tag 属性的值为 tagname。可为单个 file 操作指定多个 revert-tag 属性。在使用所指定的任意标记调用 pkg revert 时,文件将恢复为其清单定义的状态。有关 pkg revert 命令的更多信息,请参见 pkg(1) 手册页。

还可以在目录级别指定 revert-tag 属性。请参见下文中的“目录操作”。

sysattr

此属性用于指定应该为此文件设置的任何系统属性。sysattr 属性的值可以是逗号分隔的详细系统属性列表,也可以是精简系统属性选项的字符串序列,如以下示例中所示。支持的系统属性在 chmod(1) 手册页中有介绍。在清单中指定的系统属性是一种额外设置,是对可能已由操作系统的其他子系统设置的系统属性的进一步设置。

file path=opt/secret_file sysattr=hidden,sensitive
file path=opt/secret_file sysattr=HT
timestamp

此属性用于设置文件的访问权限和修改时间。必须以 ISO-8601 格式使用 UTC 表示 timestamp 属性值,省略冒号和连字符。

为 Python 打包 .pyc.pyo 文件时需要 timestamp 属性。.pyc.pyo 文件的相关 .py 文件必须使用这些文件内嵌入的时间戳进行标记,如以下示例中所示:

file path=usr/lib/python2.6/vendor-packages/pkg/__init__.pyc ...
file path=usr/lib/python2.6/vendor-packages/pkg/__init__.py \
     timestamp=20130311T221521Z ...

file 操作的以下属性由系统自动生成,不能由软件包开发者指定:

hash

未压缩文件的 SHA-1 散列。

chash

压缩文件的 SHA-1 散列。

pkg.size

未压缩文件的大小(字节)。

pkg.csize

压缩文件的大小(字节)。

目录操作

dir 操作类似于 file 操作,因为它表示文件系统对象。但 dir 操作表示目录而不是普通文件。dir 操作具有与 file 操作相同的 pathmodeownergroup 属性,其中 path 是关键属性。dir 操作也接受 revert-tag 属性。revert-tag 属性的值对 filedir 操作是不同的。

目录是 IPS 中包括的引用。当显式或隐式引用某目录的最新软件包不再引用该目录时,将删除该目录。如果该目录包含未打包的文件系统对象,则将这些项移动到 $IMAGE_META/lost+found 中。有关 $IMAGE_META 的更多信息,请参见“文件”部分。

revert-tag

此属性用于标识应作为一个集合删除的未打包文件。有关如何为 file 操作指定此属性的说明,请参见上文中的“文件操作”。对于目录,revert-tag 属性的值为 tagname=pattern。可为单个 dir 操作指定多个 revert-tag 属性。在使用匹配的 tagname 调用 pkg revert 时,将删除此 dir 目录下匹配 pattern(使用 shell glob 字符)的所有未打包文件或目录。有关 pkg revert 命令的更多信息,请参见 pkg(1) 手册页。

salvage-from

此属性可用于将未打包的内容移动到一个新目录中。此属性的值是所挽救项的目录的名称。创建以 salvage-from 属性的值命名的目录的任何内容时,具有 salvage-from 属性的目录会继承。

链接操作

link 操作表示符号链接。link 操作具有以下标准属性:

path

安装符号链接的文件系统路径。此属性是 link 操作的关键属性。

target

符号链接的目标。链接将解析到的文件系统对象。

mediator

指定由给定中介组(例如 python)中涉及的所有路径名称共享的中介名称空间中的条目。可基于 mediator-version 和/或 mediator-implementation 执行链接中介。给定路径名称的所有中介链接必须指定同一中介。但是,并非所有中介版本和实现都需要在给定路径上提供链接。如果中介不提供链接,则会在选定该中介时删除链接。mediator 与特定版本和/或实现组合起来表示可选择供包管理系统使用的中介。

mediator-version

指定 mediator 属性描述的接口的版本(表示为非负整数的点分序列)。如果指定了 mediator 而未指定 mediator-implementation,则此属性是必需的。本地系统管理员可以显式设置要使用的版本。指定的值通常应与提供链接的软件包版本相匹配(例如,runtime/python-26 应使用 mediator-version=2.6),尽管这不是必需的。

mediator-implementation

指定除 mediator-version 之外还使用中介实现,或使用中介实现代替 mediator-version。不认为实现字符串应进行排序,如果系统管理员未显式指定,则由 pkg(5) 任意选择一个字符串。

该值可以是由字母数字字符和空格组成的任意长度的字符串。如果实现本身可被版本化或已被版本化,则应在字符串的结尾处在 @ 之后指定版本(表示为非负整数的点分序列)。如果存在实现的多个版本,则缺省行为是选择最高版本的实现。

如果系统上仅安装了特定路径的实现中介链接的一个实例,则会自动选择该实例。如果以后安装了该路径的其他链接,除非应用供应商、站点或本地覆盖或者如果某一链接进行了版本中介,否则不会切换链接。

mediator-priority

在解决中介链接中的冲突时,pkg(5) 通常会选择 mediator-version 值最大的链接,如果不可能,则会基于 mediator-implementation 进行选择。此属性用于为常规冲突解决方案过程指定覆盖。

如果未指定此属性,则会应用缺省中介选择逻辑。

如果值为 vendor,则与未指定 mediator-priority 的链接相比,会优先选择该链接。

如果值为 site,则与值为 vendor 或未指定 mediator-priority 的链接相比,会优先选择该链接。

本地系统管理员可以覆盖上面所述的选择逻辑。

硬链接操作

hardlink 操作表示硬链接。它具有与 link 操作相同的属性,path 也是其关键属性。

驱动程序操作

driver 操作表示设备驱动程序。driver 操作不引用有效负荷。驱动程序文件自身必须作为 file 操作进行安装。可识别下列属性(有关更多信息,请参见 add_drv(1M)):

name

驱动程序的名称。这通常是(但并不总是)二进制驱动程序文件的文件名。此属性是 driver 操作的关键属性。

alias

此属性表示驱动程序的别名。给定的驱动程序可以具有多个 alias 属性。无需任何特殊的引号规则。

class

此属性表示驱动程序类。给定的驱动程序可以具有多个 class 属性。

perms

此属性表示驱动程序的设备节点的文件系统权限。

clone_perms

此属性表示此驱动程序的克隆驱动程序次要节点的文件系统权限。

policy

此属性指定设备的其他安全策略。给定的驱动程序可以具有多个 policy 属性,但次要设备规范不可以存在于多个属性中。

privs

此属性指定驱动程序所用的特权。给定的驱动程序可以具有多个 privs 属性。

devlink

此属性指定 /etc/devlink.tab 中的条目。该值是定义了进入文件的确切行,带有由 \t 表示的制表符。有关更多信息,请参见 devlinks(1M)。给定的驱动程序可以具有多个 devlink 属性。

依赖操作

depend 操作表示软件包间的依赖性。一个软件包可以依赖于另一个软件包,因为第一个软件包需要第二个软件包中的功能才能运行自身包含的功能或者甚至进行安装。依赖性可以是可选的。如果安装时未满足某个依赖性,包管理系统会尝试安装或更新依赖软件包至足够新的版本(受其他约束限制)。

可以识别下列属性:

fmri

表示依赖软件包的 FMRI。此属性是 dependency 操作的关键属性。fmri 值不得包括发布者。假定软件包名称是完整的。require-any 类型的依赖性可具有多个 fmri 属性。fmri 值中的版本是可选项,虽然对于某些类型的依赖性来说,不带版本的 fmri 没有任何意义。

type

依赖性的类型。

require

该依赖性是必需的,必须具有等于或高于 fmri 属性中所指定版本的版本。如果未指定版本,则任何版本都满足依赖性。如果不能满足其任一必需依赖性,则无法安装软件包。

optional

该依赖性(如果存在)必须处于指定的版本级别或更高级别。

exclude

如果该依赖性存在于指定的版本级别或更高级别,则无法安装包含软件包。如果未指定版本,则依赖软件包无法与指定依赖性的软件包同时安装。

incorporate

该依赖性是可选项,但是依赖软件包的版本会受到约束。请参见下文的“约束和冻结”。

require-any

多个 fmri 属性指定的多个依赖软件包中的任一个都可满足依赖性(遵循与 require 依赖性类型相同的规则)。

conditional

该依赖性仅在系统上存在 predicate 属性定义的软件包时才是必需的。

origin

在安装此软件包之前,相关项目标(如果存在)在要修改的映像上必须具有指定值或更大值。如果 root-image 属性的值为 true,则目标必须存在于根目录为 / 的映像上,才能安装此软件包。如果 root-image 属性的值为 true,并且 fmri 属性的值以 pkg:/feature/firmware/ 开头,则将剩余的 fmri 值视为 /usr/lib/fwenum 中计算固件依赖项的命令。有关示例,请参见《Packaging and Delivering Software With the Image Packaging System in Oracle Solaris 11.2》。

group

除非软件包出现在映像避免列表上,否则该依赖性是必需的。请注意,过时软件包会无提示地满足组依赖性。请参见 pkg(1) 中的 avoid 子命令。

parent

如果映像不是子映像,会忽略该依赖性。如果映像是子映像,则依赖性必须存在于父映像中。符合 parent 依赖性的软件包版本与用于 incorporate 依赖性的软件包版本相同。

predicate

表示 conditional 依赖性的谓词的 FMRI。

root-image

仅对 origin 依赖性有影响,如上所述。

许可证操作

license 操作表示许可证或其他与软件包内容相关联的信息文件。软件包可以通过 license 操作将许可证、免责声明或其他指南提供给软件包安装程序。

license 操作的有效负荷将提供到与软件包相关的映像元数据目录中,且应仅包含用户可读的文本数据。不应包含 HTML 或任何其他形式的标记。通过各属性,license 操作可以向客户端指示必须显示相关的有效负荷并/或要求接受它。显示并/或接受的方法由客户端决定。

可以识别下列属性:

license

此属性是 license 操作的关键属性。此属性为许可证提供有意义的描述,以帮助用户在无需阅读许可证文本本身的情况下确定内容。其中一些示例值包括:

  • ABC Co. Copyright Notice

  • ABC Co. Custom License

  • Common Development and Distribution License 1.0 (CDDL)

  • GNU General Public License 2.0 (GPL)

  • GNU General Public License 2.0 (GPL) Only

  • MIT License

  • Mozilla Public License 1.1 (MPL)

  • Simplified BSD License

license 值在软件包内必须唯一。建议在说明中包括许可证的版本,如上面的几个示例所示。如果软件包有对应多种不同许可证的代码,请使用多个 license 操作。许可证属性值的长度不得超过 64 个字符。

must-accept

如果为 true,则用户必须先接受此许可证,才能安装或更新相关软件包。省略此属性等效于 false。接受的方法(例如,交互式或基于配置)由客户端决定。对于软件包更新,如果未更改许可证操作或有效负荷,将忽略此属性。

must-display

如果为 true,则在执行打包操作期间客户端必须显示操作的有效负荷。省略此值等效于 false。此属性不应该用于版权声明。此属性应该仅用于许可证或执行操作期间必须显示的其他材料。显示的方法由客户端决定。对于软件包更新,如果未更改许可证操作或有效负荷,将忽略此属性。

传统操作

legacy 操作表示由传统包管理系统使用的软件包数据。与此操作相关联的属性将添加到传统系统的数据库中,以便查询这些数据库的工具可以像实际安装了传统软件包一样工作。需特别指出的是,这应足以使传统系统确信系统上已安装了 pkg 属性指定的软件包,如此便可使用软件包来满足依赖性。

可识别根据 pkginfo(4) 上的参数指定的下列属性:

category

CATEGORY 参数的值。缺省值为 system

desc

DESC 参数的值。

hotline

HOTLINE 参数的值。

name

NAME 参数的值。缺省值为 none provided

pkg

要安装的软件包的缩写。缺省值为软件包的 FMRI 中的名称。此属性是 legacy 操作的关键属性。

vendor

VENDOR 参数的值。

version

VERSION 参数的值。缺省值为软件包的 FMRI 中的版本。

设置操作

set 操作表示软件包级别的属性或元数据,例如软件包描述。

可以识别下列属性:

name

属性的名称。

value

提供给属性的值。

set 操作可以提供软件包作者选择的任何元数据。但是,存在大量定义明确的对包管理系统具有特定意义的属性名称。

info.classification

一个 pkg(5) 客户端可以使用一个或多个标记对软件包进行分类。该值应具有一个机制(例如 "org.opensolaris.category.2008" 或 "org.acm.class.1998")和实际分类(例如 "Applications/Games"),由冒号 (:) 分隔。

pkg.description

软件包的内容和功能的详细描述,长度通常约为一个段落。

pkg.fmri

包含方软件包的名称和版本。请参见“描述”部分中的“软件包 FMRI 和版本”。

pkg.human-version

IPS 使用的版本方案很严格。请参见“描述”部分中的“软件包 FMRI 和版本”。较灵活的版本可以 pkg.human-version 属性值提供。IPS 工具显示该值,例如 pkg infopkg contentspkg searchpkg.human-version 值不用作版本比较的基准,并且不能用来替代 pkg.fmri 版本。

pkg.obsolete

如果为 true,则将软件包标记为过时。过时的软件包除了设置操作外不能具有任何其他操作,且不得标记为已重命名。

pkg.renamed

如果为 true,则软件包已被重命名。软件包中还必须存在一个或多个 depend 操作,且指向此软件包已重命名到的软件包版本。软件包不能同时标记为已重命名和过时,但在其他情况下可以具有任意多个设置操作。

pkg.summary

软件包的一行简短描述。

组操作

group 操作定义 UNIX 组,如 group(4) 中所定义。不存在对于组口令的支持。使用此操作定义的组最初不具有用户列表。可以使用 user 操作添加用户。可以识别下列属性:

groupname

组名的值。

gid

组的唯一数字 ID。缺省值为 100 之下的第一个自由组。

用户操作

user 操作定义 UNIX 用户,如 /etc/passwd/etc/shadow/etc/group/etc/ftpd/ftpusers 文件中所定义。将为使用此 user 操作定义的用户向相应文件添加条目。

user 操作用于为要使用的守护进程或其他软件定义用户。不使用 user 操作定义管理帐户或交互式帐户。

可以识别下列属性:

username

用户的唯一名称

password

用户的加密口令。缺省值为 *LK*。请参见 shadow(4)。

uid

用户的唯一 UID。缺省值为 100 之下的第一个自由值。

group

用户的主组名称。必须可在 /etc/group 中找到。

gcos-field

/etc/passwdgcos 字段的值。缺省值为 username

home-dir

用户的起始目录。此目录必须位于系统映像目录中,不在 /home 等其他挂载点下。缺省值为 /

login-shell

用户的缺省 shell。缺省值为空。

group-list

用户所属的辅助组。请参见 group(4)。

ftpuser

可设置为 truefalse。缺省值 true 指示允许用户通过 FTP 登录。请参见 ftpusers(4)。

lastchg

1970 年 1 月 1 日至上次修改口令的日期之间的天数。缺省值为空。请参见 shadow(4)。

min

所需的相邻两次更改口令之间的最小天数。必须将此字段设置为 0 或更大值才能启用口令有效期。缺省值为空。请参见 shadow(4)。

max

口令的最大有效天数。缺省值为空。请参见 shadow(4)。

warn

用户在口令到期之前多少天收到警告。请参见 shadow(4)。

inactive

允许该用户不活动的天数。按每台计算机对此进行计数。可从计算机的 lastlog 文件获取有关上次登录的信息。请参见 shadow(4)。

expire

表示为自 UNIX 纪元(1970 年 1 月 1 日)后的天数的绝对日期。达到此数字时,将无法再进行登录。例如,到期值为 13514 指定登录将在 2007 年 1 月 1 日失效。请参见 shadow(4)。

flag

设置为空。请参见 shadow(4)。

执行器

执行器

在某些上下文中,附加操作可能适合在为特定操作做准备时执行或者在引入特定操作后执行。这些附加操作特定于操作系统,通常仅在实时系统映像上才需要。实时映像是在当前区域的活动的、正在运行的引导环境的 / 处挂载的映像。当软件包安装或删除过程中涉及的多个操作具有相同的执行器时,会为该安装或删除过程执行一次与执行器存在情况相对应的操作。

错误指定的执行器可能会导致软件包安装失败,如果该执行器无法确定进行安全安装的方法。

系统定义了以下执行器:

reboot-needed

可设置为 truefalse。此执行器声明:如果软件包系统在实时映像上操作,则必须在新引导环境中更新或删除标记的操作。be-policy 映像属性控制新引导环境的创建。有关 be-policy 属性的更多信息,请参见 pkg(1) 手册页的“映像属性”部分。

disable_fmrirefresh_fmrirestart_fmrisuspend_fmri

其中每个执行器在软件包安装或删除过程中均使用服务实例的 FMRI 值进行操作。根据 svcadm(1M) 的 disable 子命令,disable_fmri 会导致给定的 FMRI 在删除操作之前被禁用。根据 svcadm(1M) 的各个子命令,refresh_fmrirestart_fmri 会导致给定的 FMRI 在安装、更新或删除操作后被刷新或重新启动。最后,suspend_fmri 会导致给定的 FMRI 在安装操作阶段之前被临时禁用,并在该阶段完成后被重新启用。

该值可以包含与多个服务实例匹配的模式。但是,它必须使用 svcs(1) 所接受的 glob 显式执行此操作,而不是通过不指示任何实例来隐式执行此操作。

中介

中介

中介是代表一组相关符号链接或硬链接的名称。如果两个或更多个链接操作拥有相同的路径和中介名称,则用户或软件包系统会根据版本、实现或优先级选择链接目标。有关中介属性的信息,请参见“链接操作”。

以下示例显示名为 java 的中介的两个不同实例(其中,链接选择的区别为版本)。这两个 link 操作会显示在两个不同软件包中。

link mediator=java mediator-version=1.6 path=usr/java target=jdk/jdk1.6.0_31
link mediator=java mediator-version=1.7 path=usr/java target=jdk/jdk1.7.0_02

有关如何为此链接路径选择所需版本的信息,请参见 pkg(1) 手册页中的 set-mediator 子命令。要选择版本,必须安装两个软件包。

约束和冻结

约束和冻结

在将软件包转换为新版本、添加到系统中或从系统中删除时,所选的版本或是否允许删除由对软件包施加的各种约束确定。这些约束可由其他软件包以依赖性的形式进行定义,或者由管理员以冻结的形式进行定义。

最常见的约束形式由 require 依赖性提供,如上面的“依赖操作”中所述。此类约束可防止软件包被降级或删除。

操作系统的大多数部分由名为 incorporation 的软件包进行封装。这些软件包主要提供由 incorporate 依赖性表示的约束。

如上所述,合并的软件包不需要存在于系统上,但如果存在,它将同时指定一个非独占最低版本和一个独占最高版本。例如,如果依赖性的 FMRI 具有版本 1.4.3,则低于 1.4.3 的版本不能满足依赖性,且任何高于或等于 1.4.4 的版本也不能满足依赖性。但是,可以允许仅仅扩展了点分序列的版本,如 1.4.3.7。

Incorporation 用于强制系统的各部分进行同步升级。对于某些组件(例如 C 库和内核),这是一项基本要求。对于其他组件(例如,不具有任何其他依赖性的简单用户级组件),同步升级仅仅用来提供一组经过测试的已知软件包版本,这些软件包版本可由 incorporation 的特定版本进行引用。

因为 incorporation 只是一个软件包,所以可将其删除,它提供的所有约束也将随之解除。但是,Oracle Solaris 提供的许多 incorporation 是其合并的软件包所必需的,因为解除其约束可能会不安全。

尝试将软件包升级到已安装的 incorporation 所不允许的版本,将不会尝试查找更高的 incorporation 版本来满足该请求,反而会失败。如果必须移动约束本身,而又无法删除指定它的 incorporation,则必须将 incorporation 升级到指定所需约束版本的版本。升级 incorporation 会导致不能满足新版本提供的约束的所有合并软件包也进行升级。

系统管理员可以使用 pkg freeze 命令约束软件包。在未提供版本的情况下,将指定软件包约束为系统上已安装的版本。如果提供了版本化软件包,则此管理约束或冻结会像已安装了合并依赖性(其中 fmri 属性具有所提供的软件包版本值)一样进行操作。

包管理系统永远不会自动解除冻结。要解除约束,请使用 pkg unfreeze 命令。

发布者和系统信息库

发布者和系统信息库

如上所述,发布者只是软件包客户端用来标识软件包提供者的一个名称。发布者可使用软件包系统信息库和/或软件包归档来发行其软件包。软件包系统当前支持以下两种类型的系统信息库:源系统信息库和镜像系统信息库。

是包含一个或多个软件包的所有元数据(例如,目录、清单和搜索索引)和内容(文件)的软件包系统信息库。如果在一个映像中为给定发布者配置了多个源,则软件包客户端 API 会尝试选择从其检索软件包数据的最佳源。这是最常见的系统信息库类型,当每次在软件包系统信息库上使用 pkgsendpkgrecv 时进行隐式创建。

mirror 是仅包含软件包内容(文件)的软件包系统信息库。如果在一个映像中为给定发布者配置了一个或多个镜像,则客户端 API 会优先使用镜像进行软件包内容检索并尝试选择从其检索软件包内容的最佳镜像。如果镜像不可访问、不具有所需内容或者运行缓慢,客户端 API 将从任何已配置的源系统信息库检索内容。镜像设计用于通过 pkg.depotd(1M) 的动态镜像功能在一组可信客户端之间共享内容。镜像还设计用于验证对软件包元数据的访问,但发行软件包内容不需要进行验证。例如,客户端可能配置有需要具有 SSL 密钥和证书对才能访问的 https 源,以及提供软件包内容的 http 镜像。这样,只有经过授权的客户端才可以安装或更新软件包,同时避免了验证软件包内容检索的开销。通过删除系统信息库中除名为 file 的子目录及其父目录之外的所有子目录可创建镜像。通过使用 pkg.depotd(1M) 的镜像模式还可将源系统信息库置备为镜像。

全局和非全局区域更新

全局和非全局区域更新

pkg 系统会强制使非全局区域与全局区域保持同步。这表示某些软件包在全局区域和所有非全局区域中必须处于同一版本,以确保运行相同的内核。为此,pkg 会使用 parent 依赖性对非全局区域施加某些约束。有关 parent 依赖性的更多信息,请参见“依赖操作”。

由于全局区域对非全局区域施加的限制,非全局区域必须可以访问全局区域的软件包且必须具有相似的发布者配置。使用系统信息库可实现上述两个目标(请参见 pkg.sysrepo(1M) 手册页)。系统信息库可提供全局区域中配置的发布者的访问权,以及有关如何配置这些发布者的信息。要阻止非全局区域在安装或更新期间选择不同软件包,在发布者搜索顺序中系统发布者的排列顺序需要高于非全局区域中配置的发布者的顺序。有关发布者搜索顺序的信息,请参见 pkg(1) 手册页中的 pkg set-publisher 命令。

要更新系统上的所有非全局区域,请使用不带全局区域中参数的 pkg update 命令。此命令会在全局区域上执行并以递归方式在每个非全局区域上执行。将对非全局区域仅进行最少的必要更改,以使其与全局区域中所进行的更改同步。例如,假设全局区域和非全局区域中都安装了版本 1 的软件包 foo,并假设系统信息库中存在版本 2。如果 foo 具有父项依赖性,则 pkg update foo 会在全局区域和非全局区域中将 foo 更新至版本 2,这是因为 parent 依赖性会强制使软件包保持同步。如果 foo 不具有父项依赖性,则 foo 在全局区域中会更新至版本 2,但在非全局区域中仍为版本 1。

侧面和变量

侧面和变量

软件可以具有可选组件和互斥组件。可选组件的示例包括语言环境和文档。互斥组件的示例包括 SPARC 或 x86 和调试或非调试二进制文件。

在 IPS 中,可选组件称为侧面,互斥组件称为变量。侧面和变量指定为软件包操作中的标记。每个侧面和变量标记都有一个名称和值。单个操作可以具有多个侧面和变量标记。具有多个侧面和变量标记的组件有多种,例如供开发者使用的特定于体系结构的头文件,或仅用于 SPARC 全局区域的组件。

以下是变量标记的一个示例 variant.arch=sparc。以下是侧面标记的一个示例 variant.arch=sparc。引用侧面和变量时,通常不带前导字符串 facet.variant.

侧面和变量是映像的特殊属性,无法在单个软件包上设置。要查看映像上设置的侧面和变量的当前值,请按 pkg(1) 手册页中所示,使用 pkg facetpkg variant 命令。要修改映像上设置的侧面和变量的值,请使用 pkg change-facetpkg change-variant 命令。

软件包客户机将侧面处理为布尔值:侧面在映像中仅能设置为 true(启用)或 false(禁用)。缺省情况下,映像中的所有侧面都被视为 true

可以使用 pkg change-facet 命令在映像内本地设置侧面,也可从父映像继承侧面。例如,非全局区域可从全局区域继承侧面。继承的侧面会在本地设置的侧面之前计算结果,并且优先于本地设置的侧面。如果同一个侧面既是继承的,又是本地设置的,则继承的侧面值会屏蔽本地设置的值。屏蔽的侧面不会影响侧面计算结果和软件包操作。使用 pkg change-facet 命令所做的侧面更改仅影响本地设置的侧面。只能通过更改父映像来更改继承的侧面。缺省情况下,pkg facet 命令不显示屏蔽的侧面。

操作的侧面标记值可以设置为 all true,以控制客户机如何过滤有侧面标记的操作。除 alltrue 之外的所有值都具有未定义的行为。有关要安装具有侧面标记的操作而必须在镜像中存在的条件的描述,请参见下文。

需要多个级别的过滤时,侧面的 all 值非常有用。在以下示例中,仅当 doc 侧面和至少一个 locale 侧面在映像中为 true 时,才安装 foo.txt 。这样允许管理员排除文档,但是仍启用或禁用特定语言环境支持。此外,仅当 docdevel 侧面在映像中都为 true 时,才安装 api.txt

file path=usr/share/doc/foo/foo.txt facet.doc=all facet.locale.en_GB=true facet.locale.en_US=true
file path=usr/share/doc/foo/api.txt facet.doc=all facet.devel=all

映像上设置的侧面可以为完整侧面(如 doc.man)或模式(如 locale.*)。要禁用侧面名称空间的一部分,仅启用其中的几个侧面时,此方式很有用。例如,您可以禁用所有语言环境,然后仅启用一个或两个特定语言环境,如以下示例所示:

# pkg change-facet locale.*=false
[output about packages being updated]
# pkg change-facet locale.en_US=true
[output about packages being updated]

大多数变量可以具有任意数量的值。例如,arch 变量可以设置为 i386sparcppcarm 或分发支持的任何体系结构。(Oracle Solaris 中仅使用 i386sparc。)但 debug 变量例外。debug 变量只能设置为 truefalse;其他值的行为不确定。如果文件操作同时具有非调试和调试版本,则必须针对这两个版本明确设置适用的 debug 变量,如以下示例所示:

file group=sys mode=0644 overlay=allow owner=root \
  path=etc/motd pkg.csize=115 pkg.size=103 preserve=true \
  variant.debug.osnet=true

file group=sys mode=0644 overlay=allow owner=root \
  path=etc/motd pkg.csize=68 pkg.size=48 preserve=true \
  variant.debug.osnet=false

要安装使用变量的软件包,必须在映像上设置变量值。archzone 变量由创建映像和安装其初始内容的程序设置。缺省情况下,debug.* 变量在映像中设置为 false

    映像中设置的侧面和变量会影响是否安装特定操作。

  • 始终会安装不带侧面或变量标记的操作。

  • 如果以下条件存在于映像中,将安装具有侧面标记的操作:

    • 操作上具有 all 值的所有侧面标记在映像中都为 truetrue 是缺省值)。

    • 如果操作上的任何侧面标记具有值 true,则这些侧面中的至少一个侧面在映像中为 true

  • 仅当所有变量标记的值与映像中设置的值相同时,才会安装带这些变量标记的操作。

  • 如果侧面和变量都允许安装操作,则会安装带有这两种标记的操作。

可以创建定制侧面标记和 variant.debug.* 变体标记。有关更多信息,请参见《Packaging and Delivering Software With the Image Packaging System in Oracle Solaris 11.2》。以下是 Oracle Solaris 中的常用标记。

变量名
可能值
variant.arch
sparc, i386
variant.opensolaris.zone
global, nonglobal
variant.debug.*
truefalse

以下列表描述了 Oracle Solaris 中使用的一小部分侧面标记:

facet.devel             facet.doc
facet.doc.html          facet.doc.info
facet.doc.man           facet.doc.pdf
facet.locale.de         facet.locale.en_GB
facet.locale.en_US      facet.locale.fr
facet.locale.ja_JP      facet.locale.zh_CN

映像策略

映像策略

映像策略由具有布尔值的映像属性所定义。有关 flush-content-cache-on-successsend-uuid 属性的说明以及如何查看和修改其值的信息,请参见 pkg(1) 手册页中的“映像属性”。

文件

因为 pkg(5) 映像可位于任意一个较大的文件系统内,需要使用标记 $IMAGE_ROOT 来区分相对路径。对于典型的系统安装,$IMAGE_ROOT 等效于 /。

$IMAGE_ROOT/var/pkg

完整或部分映像的元数据目录。

$IMAGE_ROOT/.org.opensolaris,pkg

用户映像的元数据目录。

在特定映像的元数据中,某些文件和目录可能包含修复和恢复期间有用的信息。标记 $IMAGE_META 用于指示包含元数据的顶层目录。 $IMAGE_META 通常是以上给出的两个路径之一。

$IMAGE_META/lost+found

在软件包操作期间移动的有冲突目录和文件的位置。

$IMAGE_META/publisher

为每个发布者包含一个目录。每个目录存储特定于发布者的元数据。

$IMAGE_META 目录分层结构中的其他路径是专用的,但可以进行更改。

属性

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

属性类型
属性值
可用性
package/pkg
接口稳定性
Uncommitted(未确定)

另请参见

pkg(1)pkgsend(1)pkg.depotd(1M)pkg.sysrepo(1M)svcs(1)svcadm(1M)

在 Oracle Solaris 11.2 中添加和更新软件

在 Oracle Solaris 11.2 中复制和创建软件包系统信息库

在 Oracle Solaris 11.2 中使用映像包管理系统打包和交付软件

https://java.net/projects/ips/pages/Home