Yum 与 RPM 的技巧

yum 与 rpm 是优秀的组件管理工具,但它们拥有些比较罕为人知的选项,可容许你做一些很有趣的事情。你大概不会时常使用这些选项,但当有需要时,它们可以大派用处。

1. 令 rpm 显示结构

这是一个较简单的提示,而且对使用 x86_64 系统的人们特别有用。只消 ~/.rpmmacros 内的一行便能避免日后一大堆的麻烦。

echo "%_query_all_fmt %%{name}-%%{version}-%%{release}.%%{arch}" >> ~/.rpmmacros

2. 查询不是来自 CentOS 的组件

你想查询那些组件是利用第三方软件库安装,而不是来自 CentOS 的吗?

rpm -qa --qf '%{NAME} %{VENDOR}\n' | grep -v CentOS

3. 复位文件权限

你竟然将某个组件的文件权限完全搞乱了吗?没有问题,因为 rpm 能够为你撤消。

rpm --setperms <packagename>

4. 查阅修改日志

由于 CentOS 及上游供应商将安全性修正返向移植,当要找寻 CVE 修正时,版本号码很多时会误导。查阅组件的修改日志是找出修正是否已被实施的一个好方法。

4.1. 通过 RPM

rpm -q --changelog <packagename> | less

使用 less 并非必然的,但某些组件(例如内核)的修改日志可以是颇长篇的。使用 less 会方便阅读。

你也可显示未安装的 RPM 的修改日志,例如手动下载或以 URL 为路径的 RPM。

rpm -q --changelog -p /home/my_user/somepackage.rpm | less
rpm -q --changelog -p http://mirror.centos.org/centos/6/os/x86_64/Packages/qemu-kvm-0.12.1.2-2.445.el6.x86_64.rpm | less

4.2. 通过 YUM 的 Changelog 插件

RPM 十分强劲,但 YUM 也有它的优势。 尤其当 YUM 配合 Changelog 插件时,你在安装或更新组件_之先_便不须在本地下载组件或通过 URL 路径查看修改日志。

视乎所安装的 CentOS 版本,YUM Changelog 插件的组件名称会有所不同(见下文)。

如果你要检阅组件的细节,请执行以下 yum 指令。 此 YUM 插件已收录在 CentOS Base 软件库,但缺省是不被安装的(就 CentOS 6 的安装而言)。

yum info yum-plugin-changelog

你可用惯常安装组件的方法来安装 YUM Changelog 插件。

yum install yum-plugin-changelog

以下样例打印 tzdata 组件的最尾(最近)一则修改日志。 那些仍未安装的更新的修改日志都放在 Available Packages 部份,而不是 Installed Packages 部份。

yum changelog 1 tzdata | less

5. 文档在那里?

要快捷地列出一个组件的相关文档,你可以使用下列两个选项:

rpm -qd <packagename>

rpm -qdf /path/to/file

6. 组件来源

有时你或许会想知道你从那里获得某些组件,或者你的系统上有多少组件来自一个特定的软件库或供应者。有数个未收录在 rpm 使用手册内的寻找选项可以帮到你。虽然它们不是百份百完全,却肯定对你有帮助。大多数的软件库都会在 Release 符串中以一个标识码来标签他们的组件。举个例说,rpmforge就使用 rf 作为他们的标识码。你可以下面这个指令来检查你是否安装了他们的软件

rpm -qa release="*rf*"

rpm -qa packager="Johnny*"

这个技巧适用于大部份 rpm -qi <组件名称> 显示的类型上

另一个方法就是用 EPEL 软件库所提供的 keychecker 组件,它会按照签署用的 GPG 金钥列出组件。

7. 只取出一个文件

如果你只需要从某个 rpm 取出一个文件,而不想重装整个组件,你可以应用 rpm2cpio。举个例说,要将配置文件从 logrotate rpm 里取出来,你会运用下列指令:

rpm2cpio logrotate-1.0-1.i386.rpm |cpio -ivd etc/logrotate.conf

8. 查询组件的安装次序及日期

这个技巧在升级后用来找寻未被升级的组件时会有用。

rpm -qa --last >~/RPMS_by_Install_Date

请利用 less 来查看输出的底部,好让你能找到那些拥有较早安装日期的 rpm。你亦可以用 grep 去寻找特定组件及查看它们何时安装。

9. 查询软件库所提供的组件

寻找某个特定软件库所提供的所有组件,例如 RPMforge。这个方法并不会将已经从那个软件库安装的组件显示出来。

yum --disablerepo "*" --enablerepo "rpmforge" list available 

10. 在 yum 软件库里寻找一个符串

寻找在名称或描述中包含某个符串的组件。

yum search buildrpmtree | less 

11. 在命令行中启用或者禁用一个软件源

仅针对 CentOS 6 - 对 CentOS 5 无效。

yum-config-manager --enable c6-media

yum-config-manager --disable c6-media

12. 令 yum 应用代理服务器

要令 yum 应用代理服务器,你首先要 /etc/yum.conf 内加入下列参数:

proxy=http://yourproxy:8080/ 

当中 yourproxy 是你想访问的代理服务器的名称,而 8080 是代理端口。假如服务器需要验证,你可以这样指定登录凭证:

proxy=http://username:password@yourproxy:8080/ 

rpm 组件管理员则利用代理环境变量。它们可以在 /etc/profile 里为全系统设置,或在 ~/.bash_profile 里为个别用户设置:

export http_proxy=http://yourproxy:8080/ export ftp_proxy=http://yourproxy:8080/ 

要令 wget 应用代理服务器,请在 /etc/wgetrc 加入下列内容:

http_proxy = http://yourproxy:8080/  ftp_proxy = http://yourproxy:8080/ 

在这两个例子里,登录数据同样可以像上面样例般设置。

13. 用 yum 去安装本地组件,并自动地检查/满足依赖性

yum --nogpgcheck localinstall packagename.arch.rpm 

14. 设置以你的身份、而不是 root 来重建组件

有时你就是有必要重建某个组件 —— 可能只因为要应用一些在官方组件中未被选用的设置项目。又或者由于你发现了一些很好的软件,但在软件库内实在无没找到它,而网站只提供其它发行本的 rpm。因此你要把 src.rpm 弄来并亲自重建它。但你真的不想以 root 的身份个这个步骤。所以下面就是在你的主目录 —— 利用你的户口 —— 重建组件的方法。

14.1. 方法一

首先我们设置好你要用来工作的目录。留意它与 /usr/src/rehdat 的目录结构是何等惊人地相似:

[testuser@hostname ~]$ cd
[testuser@hostname ~]$ mkdir -p rpmbuild/{BUILD,RPMS,SPECS,SOURCES,SRPMS}
[testuser@hostname ~]$ ls rpmbuild/
BUILD RPMS SOURCES SPECS SRPMS
[testuser@hostname ~]$

接着我们改动一些 rpm 宏,好让 rpmbuild 知道关于你及你想在那里创建组件:

[testuser@hostname ~]$ echo "%_topdir /home/testuser/rpmbuild" >> ~/.rpmmacros
[testuser@hostname ~]$ echo "%packager Test User <testuser@example.com>" >> ~/.rpmmacros
[testuser@hostname ~]$ cat ~/.rpmmacros
%_topdir /home/testuser/rpmbuild
%packager Test User <testuser@example.com>
[testuser@hostname ~]$

这样就是了。下次你执行 rpmbuild --rebuild foo.src.rpm 的时候,你的制成品将会被放在 ~/rpmbuild/RPMS/i386 里(或者你刚创建的组件的结构)。简单,是不是?

14.2. 方法二

针对 CentOS-4,设置软件库页面里的 kbs-Extras 软件库(亦可加上 kbs-Misc),然后利用 "sudo" 或 "su -" 以 root 的身份执行 "yum install fedora-rpmdevtools"。接着以创建者的身份(你可能会想用一个特别的户口来避免问题发生在你的正常主目录里)执行 "fedora-buildrpmtree",这样一个 ~/rpmbuild/…… 目录树及一个 ~/.rpmmacros 档便会自动地被创建起来。

针对 CentOS-5 —— rpmdevtools 这个组件已经收录在软件库页面里的 EPEL 软件库内。

若果要令某些组件取得正确的名称,你需要加入下列宏(请按需要以合适的发行版本取代 "el4"):

[testuser@hostname ~]$ echo "%dist .el4" >> .rpmmacros 

15. 显示所有软件库的优先次序

你可以用 yum repolist all 来列出你系统上的所有软件库。然而,这样做并不会显示优先次序。下面是一个能够这样做的单行脚本。如果优先次序未被设置,它会被缺省为最低值(99)。

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

16. 显示所有已安装的 GPG 金钥

多谢论坛里的 babo 用户提供这个单行脚本来显示所有 GPG 金钥与及相关软件库的信息。

rpm -q gpg-pubkey --qf '%{name}-%{version}-%{release} --> %{summary}\n' 

17. 签署组件

如果你想签署组件让别人能验证该它真是由你所创建的,通过 rpm 你可以轻易地做到。我们不把文档收录在这里,但 Fedora RPM 包装指引内有一章(虽然是草稿)讨论这个主题。

你留心数个警告:

在 CentOS 4 及 CentOS 5 下你最好用 DSA 金钥来签署,因为这个做法没有已知的问题。

警告:如果你用 RSA 金钥来签署,gpg 默认会采用第 4 版的签名。CentOS 4 及 5 没法检查这类签名。你可强迫 rpm(或 gpg)改用第 3 版的签名。有关如何在你的 ~/.rpmmacros 内放入一个宏做这件事情,请参阅这则 Bugzilla 记录。请阅读整个讨论来理解这个问题

18. Yum 群组

你可以这样列出 yum 群组:

yum grouplist 

若要列出更多(隐藏)的群组连同标识码,请用:

yum grouplist hidden ids 

若要通过标识码安装一个群组(例如 X Window System (x11) 群组):

yum groupinstall x11 

Translation of revision 35

zh/TipsAndTricks/YumAndRPM (last edited 2015-05-08 03:31:11 by TimothyLee)