Yum 与 RPM 的技巧
Contents
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 插件的组件名称会有所不同(见下文)。
CentOS 5 的组件名为 yum-changelog
CentOS 6 的组件名为 yum-plugin-changelog
CentOS 7 的组件名为 yum-plugin-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 内的文档,或者你只有一个文件名称的话,你可以:
rpm -qdf /path/to/file
- 这样 rpm 会为你列出拥有这个文件的组件内的文档。
6. 组件来源
有时你或许会想知道你从那里获得某些组件,或者你的系统上有多少组件来自一个特定的软件库或供应者。有数个未收录在 rpm 使用手册内的寻找选项可以帮到你。虽然它们不是百份百完全,却肯定对你有帮助。大多数的软件库都会在 Release 符串中以一个标识码来标签他们的组件。举个例说,rpmforge就使用 rf 作为他们的标识码。你可以下面这个指令来检查你是否安装了他们的软件
rpm -qa release="*rf*"
或者如果你想知道你安装了多少个由 JohnnyHughes 创建的组件,你可以用
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