Solaris

Solaris 11.3 非全域區域不繼承 IPS 方面更改(到版本鎖定)

  • June 9, 2017

我有一個沒有(目前)支持契約的 Solaris 11.3 系統。因此,我使用位於http://pkg.oracle.com/solaris/release/的 IPS 儲存庫,我現在已在本地使用pkgrecv.

我習慣於在大量軟體包上pkg change-facet更改為 false,這樣我就可以將這些軟體包更新到最新版本。version-lock這工作正常。

“問題”是我的非全域區域沒有繼承這些更改的方面。因此,雖然在全域區域中我看到了更改的方面,並且可以升級受影響的包,但在我後來創建的任何非全域區域中都不是這樣:它顯示原始的、未更改的方面,並且無法升級受影響的包。

pkg(5)表示對構面的更改由子映像繼承,例如從全域區域繼承的非全域區域。但這對我來說並沒有發生。

最初我認為這是一個問題,但經過進一步思考,我意識到實際上我可能不希望全域中的方面更改總是繼承到非全域中。不久之後,我發現我想用基礎軟體安裝測試區,而不改變這些方面,這向我證明了這一點。

儘管如此,我仍然對錶明它們確實繼承的文件感到困惑,並且我相信理想情況下應該有一種方法來配置某些方面以進行繼承。

因此,我的問題是:

  1. 有沒有辦法讓某些方面繼承到所有非全域對像中——也許是通過創建一個新的 IPS 映像?
  2. 為什麼 IPS 文件表明 facets確實繼承 - 它只談論某些類型的 facets 嗎?

這就是我正在做的全部:

我一直在調查 Oracle 提供的新 FOSS 軟體包的使用情況。我一直在遵循此處的指南:如何訪問選定的 FOSS 評估包以供 Oracle Solaris 11.3 使用

本指南說明version-lock在更新包之前必須將 facet 更改為 false,並且更新的 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 更新的版本鎖),但如果有辦法讓方面在全域和非全域之間繼承仍然會很好,因為文件似乎表明他們應該這樣做。

提前致謝。

我是 Image Packaging System 的主要作者和設計者之一。

我想您的困惑是由於對文件所述內容的誤解。特別要注意 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 change-facet -r …

(參見 pkg(1),顯然我不能發布超過兩個連結。)

您甚至可以使用 -z 將其應用於特定區域。

哦,最後,您真的不想將所有版本鎖的構面設置為 False。這不僅會使系統的更新速度非常慢,而且您會失去所有確保您實際使用經過測試的組件組合的安全措施。

引用自:https://serverfault.com/questions/853789