我有一个 Solaris 11.3 系统,目前没有支持合同。因此,我使用 IPS 存储库http://pkg.oracle.com/solaris/release/,现在我已经使用 进行了本地镜像pkgrecv
。
我正在使用将大量软件包 pkg change-facet
更改为 false,以便我可以将这些软件包更新为最新版本。这很好用。version-lock
“问题”在于这些已更改的方面不会被我的非全局区域继承。因此,虽然我在全局区域中看到已更改的方面,并且可以升级受影响的软件包,但在我后来创建的任何非全局区域中情况并非如此:它显示原始的、未更改的方面,并且无法升级受影响的软件包。
pkg(5)
表示对方面所做的更改会被子映像继承,例如非全局区域会从全局区域继承。但我没有遇到这种情况。
最初我以为这是一个问题,但经过进一步思考,我意识到事实上我可能不希望全局变量中的方面更改总是继承到非全局变量中。不久之后,我发现我想在不更改这些方面的情况下安装带有基础软件的测试区域,这证明了这一点。
尽管如此,我仍然对表明它们确实继承的文档感到困惑,并且我相信理想情况下应该有一种方法来配置某些方面以进行继承。
因此,我的问题是:
- 有没有办法可以选择性地使某些方面继承到所有非全局变量中 - 也许通过创建一个新的 IPS 图像?
- 为什么 IPS 文档会指出方面做继承——它是否只谈论某些类型的方面?
这就是我所做的全部事情:
我一直在研究 Oracle 提供的新 FOSS 包的使用情况。我一直遵循以下指南:如何访问适用于 Oracle Solaris 11.3 的选定 FOSS 评估包。
本指南解释了必须将 facet 更改version-lock
为 false 才能更新软件包,并且可以在 Release 存储库中批量找到版本号字符串匹配的更新的 FOSS 软件包\*@\*-5.12.0.0.0.122
。该文档建议操纵 的输出pkg list
以创建pkg change-facet
命令来解锁所有版本。
我已经在我的全局区域中完成了此操作,并且随后pkg update --accept
成功执行并产生了大量升级的软件包。
但是,如果我随后安装一个新的非全局区域,它将默认为这些软件包的基本版本。如果我在该全局区域中运行pkg facet
,我将看到区域中的各个方面没有变化。例如,此处区域显示 Bash 的 version-lock=True 未发生变化:
root@goldenzone:~# pkg facet -a | grep version-lock.shell/bash
version-lock.shell/bash True system
而其全局显示正确的、新更改的version-lock = False:
root@magrathea:/system/zones# pkg facet -a | grep version-lock.shell/bash
version-lock.shell/bash False local
解决方法:
根据下面的评论,我现在通过使用包含的自定义 auto_install 清单安装我的黄金区域来解决这个问题<facet set="false">facet.version-lock.*</facet>
。
这没问题(尽管需要解锁全部版本锁,而不仅仅是那些具有 FOSS 更新的锁),但如果有办法让方面在全局变量和非全局变量之间继承,那还是很好知道的,因为文档似乎表明它们应该如此。
提前致谢。
答案1
我是图像包装系统的主要作者和设计者之一。
我想你的困惑是因为误解了文档的内容。特别是,请仔细注意 pkg(5) 中的这句话:
...非全局区域可以从全局区域继承方面。继承的方面在本地设置的方面之前进行评估,并且优先于本地设置的方面。
注意上面写着能, 不是将要。因此,文档描述了当方面被继承时会发生什么,但故意(我相信)没有说明什么时候它们会被继承。也就是说,它告诉你如何确定它们是否被继承(通过在“pkg facet”的 SRC 列中查找“parent”),但没有告诉你在什么条件下它们会被继承:
https://docs.oracle.com/cd/E53394_01/html/E54739/glmke.html
现在说说缺失的部分 —— 一般来说,继承的方面通常只适用于包中使用的 facet.version-lock.* 方面,因为一些相关包对自身有父依赖关系,如下所示:
依赖类型 = 父 fmri = 功能/包/依赖/自身
父依赖关系(如上所示)只是表明,若要将此包安装到非全局区域中,全局区域中必须先存在相同版本的相同包。这适用于必须在全局区域和非全局区域之间同步的包。
简而言之,继承通常不适用于大多数方面。确定哪些方面将被继承的逻辑可以在这里找到:
https://github.com/oracle/solaris-ips/blob/master/src/modules/client/linkedimage/common.py#L3462
这是有意为之,因为区域是一种容器技术,旨在允许隔离环境,管理员可以在其中设置不同于全局区域的配置。
话虽这么说,如果你想要将 change-facet 操作应用于全局区域和所有非全局区域,可以使用 change-facet 的“-r”(递归)选项执行此操作:
pkg 改变面-r ...
(请参阅 pkg(1),因为我显然不能发布超过两个链接。)
您甚至可以使用 -z 将其应用于特定区域。
哦,最后,你真的不想将所有版本锁的方面都设置为 False。这不仅会使系统更新速度变得异常缓慢,而且会失去所有确保实际使用经过测试的组件组合的安全性。