yum-plugin-priorities

很多人發現只要有正確的設定,並且在應用時理解它的功能及意識到它的限制和潛在問題,priorities 插件依然是件很有用的工具。它可以與 execute 及/或 includepkg 選項一同使用,以及 enabled=0 這個選項來預設停用某個軟件庫。這個你便能夠選擇哪些來自較次要軟件庫的套件可以取代來自較重要軟件庫的套件。

1. 術語

註:這個插件在過往至少有兩個不同的名稱。它在 CentOS-5 上被稱為 yum-priorities,但在 CentOS-4 上卻名為 yum-plugin-priorities。在 CentOS-6 它再次還原為 yum-plugin-priorities。它在三個系統內的功能大致相同。

2. 安裝

借著將軟件庫與優先次序掛勾,priorities 可以在軟件庫間實施分級別的保障。來自較低級別軟件庫的套件永遠不會被用來更新那些來自較高級別軟件庫的套件。這些先後次序在安裝新套件時亦生效 —— 假若一個套件同時存在於多個軟件庫內,安裝時便會取用最高級別軟件庫中的套件。這個插件對於使用第三方軟件庫的人特別有用,因為這些軟件庫可能會更新系統檔案,對你的 CentOS 安裝的穩定性構成潛在的捐害。

要使用這個插件,你必須在 /etc/yum.conf 檔案內啟用插件,詳情見「Yum 插件」

你可以用下列指命安裝它:

CentOS-4 或 CentOS-6:

yum install yum-plugin-priorities

CentOS-5:

yum install yum-priorities

以下兩個位址備有 priorities

完成插件的安裝後,請確定它在你決定使用的軟件庫內已被啟用。要達至這個目的,請編輯 /etc/yum/pluginconf.d/priorities.conf,並確保它擁有下列內容:

[main]
enabled=1

3. 功能描述

<!> man 使用手用當然較 wiki 文章更有權烕。

有些套件在它們的元資料內指定 obsoletes。該套件屬性指明它會取替哪些不同名稱的舊套件。這樣可能會干擾分等級保護計劃。就例如有一個低級別軟件庫內的套件以 obsoletes: 取替一個高級別軟件庫內的套件。舉個例子,有一個來自高級別軟件庫的 gconfmm2 套件已被安裝了,而另一個套件(假設是 gconfmm20)聲稱能取替 gconfmm2 套件,那麼 yum 將會以 gconfmm20 取代 gconfmm2。如果你要插件考慮這類型升級,並利用固定的規則來推翻可能有用的更新,你可以在 /etc/yum/pluginconf.d/priorities.confmain 部份內加入下面一行:

check_obsoletes=1

這是一條機械式的規則,對於隨著時間管理一個發行版本所涉及的分柝及思考過程沒有認知,故此它有機會危害系統的健康。盲目地啟用某組 priorities 的規則等同信任自動導航,無法對發行版本的擴充作出反應。然而,透過正確及有計劃的應用,它卻可以避免第三方軟件庫利用 obsoletes 取代名稱不同的核心套件。

4. 針對性設定

當這個插件被啟用後,你可以加入下面一行為軟件庫增設優先次序:

priority=N

N 是一個 1 至 99 的整數。每個軟件庫的預設優先次序是 99。擁有最細數值的軟件庫會獲得最優先待遇。一般來說,最理想的做法是至少將極高等級賦予 CentOS 的 baseupdate 軟件庫。在下列的 /etc/yum.repos.d/CentOS-Base.repo 範例檔中,CentOS 的 baseupdate 軟件庫被賦予最高的等級(1):

[base]
name=CentOS-$releasever - Base
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os
#baseurl=http://mirror.centos.org/centos/$releasever/os/$basearch/
gpgcheck=1
gpgkey=http://mirror.centos.org/centos/RPM-GPG-KEY-centos4
priority=1

#released updates
[updates]
name=CentOS-$releasever - Updates
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=updates
#baseurl=http://mirror.centos.org/centos/$releasever/updates/$basearch/
gpgcheck=1
gpgkey=http://mirror.centos.org/centos/RPM-GPG-KEY-centos4
priority=1

#packages used/produced in the build but not released
[addons]
name=CentOS-$releasever - Addons
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=addons
#baseurl=http://mirror.centos.org/centos/$releasever/addons/$basearch/
gpgcheck=1
gpgkey=http://mirror.centos.org/centos/RPM-GPG-KEY-centos4
priority=1

#additional packages that may be useful
[extras]
name=CentOS-$releasever - Extras
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=extras
#baseurl=http://mirror.centos.org/centos/$releasever/extras/$basearch/
gpgcheck=1
gpgkey=http://mirror.centos.org/centos/RPM-GPG-KEY-centos4
priority=1

#additional packages that extend functionality of existing packages
[centosplus]
name=CentOS-$releasever - Plus
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=centosplus
#baseurl=http://mirror.centos.org/centos/$releasever/centosplus/$basearch/
gpgcheck=1
enabled=0
gpgkey=http://mirror.centos.org/centos/RPM-GPG-KEY-centos4
priority=1

#contrib - packages by Centos Users
[contrib]
name=CentOS-$releasever - Contrib
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=contrib
#baseurl=http://mirror.centos.org/centos/$releasever/contrib/$basearch/
gpgcheck=1
enabled=0
gpgkey=http://mirror.centos.org/centos/RPM-GPG-KEY-centos4
priority=2

註:上述例子針對 CentOS-4。在 CentOS-5 請將 RPM-GPG-KEY-centos4 檔案名稱(位於 gpgkey 行內)以 RPM-GPG-KEY-CentOS-5 取代。

/etc/yum.repos.d/CentOS-Base.repo 檔案內作出這些改動後,yum 便永遠不會用其它較低級別的軟件庫內的套件取替 baseupdate 軟件庫內的套件。這樣做可能會導致安全性更新及「定點發行」內的更新被無聲無息地壓抑掉,暴露你的系統給潛在的損害。請參閱文章起首的忠告。

5. 雜項

其中一立作者建議的設定是:

[base], [addons], [updates], [extras] ... priority=1

[centosplus] ... priority=1(與 base 及 updates 的優先次序相同)但應設為停用
[contrib] ... priority=2

第三方軟件庫 ... priority=N (N 是一個按你喜好大於 10 的數值)

你可以用 yum repolist all 來列出設置在你系統上的所有軟件庫。然而,它並不會顯示優先次序的數值。下面是作這個用途的單行腳本。假如數值未被設定,它會被預設為最低優先次序(99)。

sed -n -e "/^\[/h; /priority *=/{ G; s/\n/ /; s/ity=/ity = /; p }" /etc/yum.repos.d/*.repo | sort -k3n

6. 忠告

<!> 註:yum 的上游維護者,Seth Vidal,在 2009 年 9 月針對 'yum priorities' 說了以下的話:

唉,我真希望人們不設置 yum priorities。priorities 有很多東西令我不寒而慄。可能是它令我想起 apt 的「鎖定」功能,而這叫我很想破口大罵。

<!> 郵件列表的討論內容由這裡開始對這件事有更深入探討。討論中所提到的 Repositories 文章詳談 yumexcludeincludepkg 選項,是認識 priorities 的一個較好的起點。

最主要的憂慮就是 priorities 非常笨拙地從交易中移除套件。它令到斷定哪些套件被勿視及判斷其原因很困難。話雖如此,它依然非常有彈性,並能有效地列舉最多可用的套件。

Translation of revision 29

zh-tw/PackageManagement/Yum/Priorities (last edited 2012-09-24 06:40:44 by TimothyLee)