<<TableOfContents: execution failed [Argument "maxdepth" must be an integer value, not "[1]"] (see also the log)>>
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:
通过 CentOS Extras 软件库。由于 CentOS Extras 软件库被缺省为启用的,因此在 CentOS 上你可以借着安装 yum-plugin-priorities 来设置这个插件。在 CentOS 5 Extras 软件库中,这个组件名叫 yum-priorities。更多有关 CentOS Extras 软件库的数据可以在「软件库」页内找到。
自 yum-utils 1.0.1 起,priorities 插件已经被加入上游的 yum-utils 源代码内。yum-utils 内的版本同时支持 yum 2.4.x 及 3.0.x。设置指引已收录在压缩档内位于 plugins/priorities 目录的 README 文件里。
完成插件的安装后,请确定它在你决定使用的软件库内已被启用。要达至这个目的,请编辑 /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.conf 的 main 部份内加入下面一行:
check_obsoletes=1
这是一条机械式的规则,对于随着时间管理一个发行版本所涉及的分柝及思考过程没有认知,故此它有机会危害系统的健康。盲目地启用某组 priorities 的规则等同信任自动导航,不能对发行版本的扩充作出反应。然而,通过正确及有计划的应用,它却可以避免第三方软件库利用 obsoletes 取代名称不同的核心组件。
4. 针对性设置
当这个插件被启用后,你可以加入下面一行为软件库增设优先次序:
priority=N
N 是一个 1 至 99 的整数。每个软件库的缺省优先次序是 99。拥有最细数值的软件库会获得最优先待遇。一般来说,最理想的做法是至少将极高等级赋予 CentOS 的 base 和 update 软件库。在下列的 /etc/yum.repos.d/CentOS-Base.repo 样例档中,CentOS 的 base 及 update 软件库被赋予最高的等级(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 便永远不会用其它较低级别的软件库内的组件取替 base 及 update 软件库内的组件。这样做可能会导致安全性更新及「定点发行」内的更新被无声无息地压抑掉,暴露你的系统给潜在的损害。请参阅文章起首的忠告。
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 文章详谈 yum 的 exclude 和 includepkg 选项,是认识 priorities 的一个较好的起点。
最主要的忧虑就是 priorities 非常笨拙地从交易中删除组件。它令到断定哪些组件被勿视及判断其原因很困难。话虽如此,它依然非常有灵活性,并能有效地枚举最多可用的组件。
Translation of revision 29