关于本系列本系列文章帮助您学习 Linux 系统管理任务相关知识。您可以使用本系列文章中的资料准备 Linux Professional Institute Certification 级别 1 (LPIC-1)考试 。 请参见我们的 学习 Linux,101:LPIC-1 路线图,查看本系列中各文章的介绍和链接。该路线图目前仍然在更新中,目前反映的最新内容是 LPIC-1 考试的最新目标(2009 年 4 月):在我们完成文章后,我们会将其添加到路线图中。但是,与此同时,您可以在我们的 LPI 认证考试准备教程 中找到类似资料的早期版本,这些内容支持 2009 年 4 月以前发布的 LPIC-1 目标。 概述在本文中,学习如何在 Linux 系统上使用 RPM 和 YUM 包管理工具管理包。学习:
本文帮助您准备 Linux Professional Institute's Junior Level Administration (LPIC-1) 考试 101 中主题 102 下的目标 102.5。该目标的权值为 3。 先决条件为了最有效地利用本系列中的文章,您应该具有基本的 Linux 知识,并需要准备一个 Linux 系统,用于练习本文介绍的命令。有时候不同版本的程序输出格式不同,因此您所得到的结果未必总是与这里所示的清单和图相同。特别是,许多输出高度依赖于系统上已经安装的包。您自己的输出可能很不一样,但是应该能够看出重要的共同点。 包管理简介联系 IanIan 是我们最受欢迎、最高产的作者之一。阅读 Ian 在 developerWorks 上发表的所有文章。查看 Ian 的个人信息,与 Ian、其他作者和 My developerWorks 的其他读者联系。 过去,许多 Linux 程序以源代码的形式发行,用户把源代码构建为所需的程序或程序集;源代码还附带必需的手册页、配置文件等等。现在,大多数 Linux 发行商使用称为包 的预构建的程序或程序集,包便于在发行版上安装。在本文中,学习帮助安装、更新和删除包的包管理 工具。本文主要关注 Red Hat 开发的 Red Hat Package Manager (RPM),以及 Duke University 物理系最初为管理 Red Hat Linux 系统开发的 Yellowdog Updater Modified (YUM)。本系列中的另一篇文章 “学习 Linux,101:Debian 包管理” 讨论 Debian 系统上使用的包管理工具。 从用户的角度来说,基本的包管理功能由命令提供。Linux 开发人员一直致力于让 Linux 更容易使用,他们开发了其他工具(包括 GUI 工具)来补充基本工具,这对最终用户隐藏了基本工具的一部分复杂性。在本文和 学习 Linux,101:Debian 包管理 中,我们主要讨论基本工具,但是也会提到一些其他工具,让您能够继续研究它们。 RPM、YUM 和 APT(适用于 Debian 系统)有许多相似之处。它们都可以安装和删除包。关于安装的包的信息保存在数据库中。它们都有基本的命令行功能,同时通过其他工具提供对用户更友好的界面。它们都可以从 Internet 获取包。 在安装 Linux 系统时,通常会安装许多包。这个集合可能是根据系统的用途定制的,比如服务器、桌面或开发工作站。有时候,可能需要安装新的包以添加新功能,更新现有的包,甚至删除不再需要或已经被新的包取代的包。我们来看看如何完成这些任务以及如何解决一些相关的难题,比如寻找包含某一命令的包。 RPMRed Hat 于 1995 年引入了 RPM。RPM 现在是 Linux Standard Base (LSB) 中采用的包管理系统。
在本文中,我们主要关注前两组命令选项。在 RPM 的手册页中可以找到其他功能的相关信息。 还应该注意 YUMYUM 在 RPM 系统中增加了自动更新和包管理,包括依赖关系管理。与 Debian Advanced Packaging Tool (APT) 一样,除了了解系统上安装的包之外,YUM 还使用存储库。存储库是包的集合,通常可以通过网络连接访问它们。 安装 RPM 包假设您想学 Lisp,一位同事让您使用 清单 1. 没有找到 gcl 命令[ian@echidna ~]$ gcl --help bash: gcl: command not found [ian@echidna ~]$ which gcl /usr/bin/which: no gcl in (/usr/lib64/qt-3.3/bin:/usr/kerberos/sbin:/usr/kerber os/bin:/usr/lib64/ccache:/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/ sbin:/home/ian/bin) [ian@echidna ~]$ type gcl bash: type: gcl: not found 您可能会问同事要安装哪个包,也可能猜想 清单 2. 用 rpm 安装 gcl —— 第一次尝试[root@echidna ~]# rpm -i gcl-2.6.8-0.6.20090701cvs.fc12.x86_64.rpm error: Failed dependencies: gcl-selinux is needed by gcl-2.6.8-0.6.20090701cvs.fc12.x86_64
如果您使用过 Debian 的 APT,可能希望有像 清单 3. 使用 yum 安装 gcl[root@echidna ~]# yum install gcl Loaded plugins: presto, refresh-packagekit Setting up Install Process Resolving Dependencies --> Running transaction check ---> Package gcl.x86_64 0:2.6.8-0.7.20100201cvs.fc12 set to be updated --> Processing Dependency: gcl-selinux for package: gcl-2.6.8-0.7.20100201cvs.fc12.x86_64 --> Running transaction check ---> Package gcl-selinux.x86_64 0:2.6.8-0.7.20100201cvs.fc12 set to be updated --> Finished Dependency Resolution Dependencies Resolved ===================================================================================== Package Arch Version Repository Size ===================================================================================== Installing: gcl x86_64 2.6.8-0.7.20100201cvs.fc12 updates 6.3 M Installing for dependencies: gcl-selinux x86_64 2.6.8-0.7.20100201cvs.fc12 updates 17 k Transaction Summary ===================================================================================== Install 2 Package(s) Upgrade 0 Package(s) Total download size: 6.4 M Installed size: 40 M Is this ok [y/N]: y Downloading Packages: Setting up and reading Presto delta metadata updates/prestodelta | 964 kB 00:01 Processing delta metadata Package(s) data still to download: 6.4 M (1/2): gcl-2.6.8-0.7.20100201cvs.fc12.x86_64.rpm | 6.3 MB 00:12 (2/2): gcl-selinux-2.6.8-0.7.20100201cvs.fc12.x86_64.rpm | 17 kB 00:00 ------------------------------------------------------------------------------------- Total 398 kB/s | 6.4 MB 00:16 Running rpm_check_debug Running Transaction Test Transaction Test Succeeded Running Transaction Installing : gcl-selinux-2.6.8-0.7.20100201cvs.fc12.x86_64 1/2 Installing : gcl-2.6.8-0.7.20100201cvs.fc12.x86_64 2/2 Installed: gcl.x86_64 0:2.6.8-0.7.20100201cvs.fc12 Dependency Installed: gcl-selinux.x86_64 0:2.6.8-0.7.20100201cvs.fc12 Complete! 清单 3 中的输出表明,YUM 在名为 “updates” 的存储库中找到了 gcl.x86_64 0:2.6.8-0.7.20100201cvs.fc12 和 gcl-selinux.x86_64 0:2.6.8-0.7.20100201cvs.fc12(稍后详细讨论),并判断出总下载大小。按 “y” 同意之后,它下载这两个包,然后安装依赖包,最后安装 gcl。在本文后面会进一步讨论依赖关系。 包的位置在前一节中,学习了如何安装 RPM 包。但是,包来自什么地方呢? 典型的 repo 文件分为三个部分,一个用于一般的包,一个用于调试包,最后一个用于源代码包。常常可以从不同的位置(即镜像)获取发行版的包拷贝。所以 repo 文件告诉 除了存储库位置之外,repo 文件还指出某个存储库是否启用了,以及是否应该使用 GPG 签名检查下载的包。 清单 4. fedora-updates.repo[ian@echidna ~]$ cat /etc/yum.repos.d/fedora-updates.repo [updates] name=Fedora $releasever - $basearch - Updates failovermethod=priority #baseurl=http://download./pub/fedora/linux/updates/$releasever /$basearch/ mirrorlist=https://mirrors./metalink?repo=updates-released-f$r eleasever&arch=$basearch enabled=1 gpgcheck=1 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-fedora-$basearch [updates-debuginfo] name=Fedora $releasever - $basearch - Updates - Debug failovermethod=priority #baseurl=http://download./pub/fedora/linux/updates/$releasever /$basearch/debug/ mirrorlist=https://mirrors./metalink?repo=updates-released-deb ug-f$releasever&arch=$basearch enabled=0 gpgcheck=1 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-fedora-$basearch [updates-source] name=Fedora $releasever - Updates Source failovermethod=priority #baseurl=http://download./pub/fedora/linux/updates/$releasever /SRPMS/ mirrorlist=https://mirrors./metalink?repo=updates-released-sou rce-f$releasever&arch=$basearch enabled=0 gpgcheck=1 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-fedora-$basearch YUM 和 RPM 使用本地数据库判断安装的包。本地数据库中存储的包元数据是从启用的存储库获取的。尽管很少需要为本地数据库操心,但是可以使用 删除 RPM 包如果要删除包,可以使用 清单 5. 试删除 gcl[root@echidna ~]# rpm -e --test gcl 与使用 与安装包不同,当使用 清单 6. 用 rpm 删除依赖包[root@echidna ~]# rpm -e gcl-selinux error: Failed dependencies: gcl-selinux is needed by (installed) gcl-2.6.8-0.7.20100201cvs.fc12.x86_64 如果使用 清单 7. 用 yum 删除依赖包[root@echidna ~]# yum remove gcl-selinux Loaded plugins: presto, refresh-packagekit Setting up Remove Process Resolving Dependencies --> Running transaction check ---> Package gcl-selinux.x86_64 0:2.6.8-0.7.20100201cvs.fc12 set to be erased --> Processing Dependency: gcl-selinux for package: gcl-2.6.8-0.7.20100201cvs.fc12.x86_64 --> Running transaction check ---> Package gcl.x86_64 0:2.6.8-0.7.20100201cvs.fc12 set to be erased --> Finished Dependency Resolution Dependencies Resolved ===================================================================================== Package Arch Version Repository Size ===================================================================================== Removing: gcl-selinux x86_64 2.6.8-0.7.20100201cvs.fc12 @updates 90 k Removing for dependencies: gcl x86_64 2.6.8-0.7.20100201cvs.fc12 @updates 40 M Transaction Summary ===================================================================================== Remove 2 Package(s) Reinstall 0 Package(s) Downgrade 0 Package(s) Is this ok [y/N]: n Exiting on user Command Complete! 升级 RPM 包既然已经了解了如何安装和删除 RPM,我们来看看如何把 RPM 包升级到更高级别。可以使用 清单 8. 使用 yum update 执行更新[root@echidna ~]# yum update 'gr*' Loaded plugins: presto, refresh-packagekit Setting up Update Process Resolving Dependencies --> Running transaction check ---> Package grep.x86_64 0:2.6.3-1.fc12 set to be updated ---> Package groff.x86_64 0:1.18.1.4-20.fc12 set to be updated --> Finished Dependency Resolution Dependencies Resolved ===================================================================================== Package Arch Version Repository Size ===================================================================================== Updating: grep x86_64 2.6.3-1.fc12 updates 228 k groff x86_64 1.18.1.4-20.fc12 updates 1.5 M Transaction Summary ===================================================================================== Install 0 Package(s) Upgrade 2 Package(s) Total download size: 1.7 M Is this ok [y/N]: y Downloading Packages: Setting up and reading Presto delta metadata Processing delta metadata Download delta size: 854 k http://fedora./pub/linux/fedora/linux/updates/12/x86_64/drpms/grep-2.5.3- 6.fc12_2.6.3-1.fc12.x86_64.drpm: [Errno 14] HTTP Error 404 : http://fedora.fastsoft.n et/pub/linux/fedora/linux/updates/12/x86_64/drpms/grep-2.5.3-6.fc12_2.6.3-1.fc12.x86_ 64.drpm Trying other mirror. (1/2): grep-2.5.3-6.fc12_2.6.3-1.fc12.x86_64.drpm | 214 kB 00:00 (2/2): groff-1.18.1.4-18.fc12_1.18.1.4-20.fc12.x86_64.drpm | 640 kB 00:00 Finishing rebuild of rpms, from deltarpms <delta rebuild> | 1.7 MB 00:02 Presto reduced the update size by 52% (from 1.7 M to 854 k). Running rpm_check_debug Running Transaction Test Transaction Test Succeeded Running Transaction Updating : grep-2.6.3-1.fc12.x86_64 1/4 Updating : groff-1.18.1.4-20.fc12.x86_64 2/4 Cleanup : grep-2.5.3-6.fc12.x86_64 3/4 Cleanup : groff-1.18.1.4-18.fc12.x86_64 4/4 Updated: grep.x86_64 0:2.6.3-1.fc12 groff.x86_64 0:1.18.1.4-20.fc12 Complete! 如果知道 RPM 文件的位置,或者已经下载了它们,那么也可以使用 清单 9. 用 rpm 更新包[root@echidna ~]# ls *.rpm vim-common-7.2.411-1.fc12.x86_64.rpm vim-enhanced-7.2.411-1.fc12.x86_64.rpm [root@echidna ~]# rpm -Uvh *.rpm http://mirrors./pub/linux/distributions\ > /fedora/linux/updates/12/x86_64/vim-minimal-7.2.411-1.fc12.x86_64.rpm Retrieving http://mirrors./pub/linux/distributions/fedora/linux/updates/12/x86 _64/vim-minimal-7.2.411-1.fc12.x86_64.rpm Preparing... ########################################### [100%] 1:vim-common ########################################### [ 33%] 2:vim-enhanced ########################################### [ 67%] 3:vim-minimal ########################################### [100%] 查询 RPM 包您在前面的示例中看到,用 基本查询只检查包是否已经安装了,如果安装了,就查询版本。增加 清单 10. 显示 gcl 的相关信息[ian@echidna ~]$ yum list gcl Loaded plugins: presto, refresh-packagekit Installed Packages gcl.x86_64 2.6.8-0.7.20100201cvs.fc12 @updates [ian@echidna ~]$ rpm -q gcl gcl-2.6.8-0.7.20100201cvs.fc12.x86_64 [ian@echidna ~]$ yum info gcl Loaded plugins: presto, refresh-packagekit Installed Packages Name : gcl Arch : x86_64 Version : 2.6.8 Release : 0.7.20100201cvs.fc12 Size : 40 M Repo : installed From repo : updates Summary : GNU Common Lisp URL : http://www./software/gcl/ License : GPL+ and LGPLv2+ Description: GCL is a Common Lisp currently compliant with the ANSI standard. : Lisp compilation produces native code through the intermediary of : the system's C compiler, from which GCL derives efficient : performance and facile portability. Currently uses TCL/Tk as GUI. [ian@echidna ~]$ rpm -qi gcl Name : gcl Relocations: (not relocatable) Version : 2.6.8 Vendor: Fedora Project Release : 0.7.20100201cvs.fc12 Build Date: Tue 23 Mar 2010 03:20:36 PM EDT Install Date: Wed 05 May 2010 01:01:34 PM EDT Build Host: x86-02.phx2.fedoraproject. org Group : Development/Languages Source RPM: gcl-2.6.8-0.7.20100201cvs.fc12.sr c.rpm Size : 41667750 License: GPL+ and LGPLv2+ Signature : RSA/8, Tue 23 Mar 2010 04:14:06 PM EDT, Key ID 9d1cc34857bbccba Packager : Fedora Project URL : http://www./software/gcl/ Summary : GNU Common Lisp Description : GCL is a Common Lisp currently compliant with the ANSI standard. Lisp compilation produces native code through the intermediary of the system's C compiler, from which GCL derives efficient performance and facile portability. Currently uses TCL/Tk as GUI. 详细的清单显示与 RPM 包相关联的一些标记。注意, 如清单 10 所示,可以使用 清单 11. 搜索 "texmacs"[ian@echidna ~]$ yum list texmacs Loaded plugins: presto, refresh-packagekit Available Packages TeXmacs.x86_64 1.0.7.2-2.fc12 fedora [ian@echidna ~]$ yum search texmacs Loaded plugins: presto, refresh-packagekit ================================= Matched: texmacs ================================== TeXmacs-devel.i686 : Development files for TeXmacs TeXmacs-devel.x86_64 : Development files for TeXmacs TeXmacs.x86_64 : Structured wysiwyg scientific text editor pydot.noarch : Python interface to Graphviz's Dot language 对于后面的查询示例,我们主要使用 RPM 包和其中的文件用户常常希望知道一个包中有哪些文件,或者某个文件来自哪个包。使用 清单 12. 显示 gcl 包中的文件[ian@echidna ~]$ rpm -ql gcl /usr/bin/gcl /usr/lib/gcl-2.6.8 /usr/lib/gcl-2.6.8/clcs /usr/lib/gcl-2.6.8/clcs/sys-proclaim.lisp /usr/lib/gcl-2.6.8/cmpnew /usr/lib/gcl-2.6.8/cmpnew/gcl_cmpmain.lsp /usr/lib/gcl-2.6.8/cmpnew/gcl_cmpopt.lsp /usr/lib/gcl-2.6.8/cmpnew/gcl_collectfn.lsp . . . /usr/share/info/gcl-tk.info.gz /usr/share/info/gcl.info-1.gz /usr/share/info/gcl.info-2.gz /usr/share/info/gcl.info-3.gz /usr/share/info/gcl.info-4.gz /usr/share/info/gcl.info-5.gz /usr/share/info/gcl.info-6.gz /usr/share/info/gcl.info-7.gz /usr/share/info/gcl.info-8.gz /usr/share/info/gcl.info-9.gz /usr/share/info/gcl.info.gz /usr/share/man/man1/gcl.1.gz 通过在查询中添加 查询包文件上面的包查询命令在 RPM 数据库中查询已经安装的包。如果刚下载了一个包,想获取同类信息,可以在查询中使用 清单 13. 显示两个 vim 包的包文件信息[root@echidna ~]# rpm -qp *.rpm vim-common-7.2.411-1.fc12.x86_64 vim-enhanced-7.2.411-1.fc12.x86_64 查询安装的所有包
清单 14. 对所有包执行查询[ian@echidna ~]$ rpm -qa | sort | more aalib-libs-1.4.0-0.18.rc5.fc12.x86_64 abrt-1.0.8-2.fc12.x86_64 abrt-addon-ccpp-1.0.8-2.fc12.x86_64 abrt-addon-kerneloops-1.0.8-2.fc12.x86_64 abrt-addon-python-1.0.8-2.fc12.x86_64 abrt-desktop-1.0.8-2.fc12.x86_64 abrt-gui-1.0.8-2.fc12.x86_64 abrt-libs-1.0.8-2.fc12.x86_64 abrt-plugin-bugzilla-1.0.8-2.fc12.x86_64 abrt-plugin-logger-1.0.8-2.fc12.x86_64 abrt-plugin-runapp-1.0.8-2.fc12.x86_64 abyssinica-fonts-1.0-5.fc12.noarch acl-2.2.49-2.fc12.x86_64 ... [ian@echidna ~]$ rpm -qa | wc -l 1792 [ian@echidna ~]$ rpm -qal | wc -l 281052 [ian@echidna ~]$ rpm -qad | wc -l 45686 [ian@echidna ~]$ rpm -qa | grep -i gcl gcl-selinux-2.6.8-0.7.20100201cvs.fc12.x86_64 gcl-2.6.8-0.7.20100201cvs.fc12.x86_64 使用 哪个包包含某一文件?既然可以列出所有包和一个包中的所有文件,现在就掌握了查明哪个包包含某一文件所需的所有信息。但是, 清单 15. 哪个包提供 vim 可执行文件[ian@echidna ~]$ which vim /usr/bin/vim [ian@echidna ~]$ rpm -qf `which vim` vim-enhanced-7.2.411-1.fc12.x86_64 [ian@echidna ~]$ rpm -qf $(which vim) vim-enhanced-7.2.411-1.fc12.x86_64 RPM 依赖关系在前面看到删除 gcl-selinux 包的操作失败了,这是因为存在依赖关系。除了文件之外,RPM 包可能包含其他包所依赖的任意功能。 如您所见,依赖关系通常会正常发挥作用。如果需要同时安装几个包,其中一些依赖于其他包,那么只需使用 除了在安装或删除包时产生的错误消息之外,还可以通过几种方法查明包需要或依赖的文件或功能。
清单 16. gcl 需要什么[ian@echidna ~]$ rpm -qR gcl /bin/sh /bin/sh /bin/sh /sbin/install-info /sbin/install-info gcl-selinux libX11.so.6()(64bit) libc.so.6()(64bit) libc.so.6(GLIBC_2.11)(64bit) libc.so.6(GLIBC_2.2.5)(64bit) libc.so.6(GLIBC_2.3)(64bit) libc.so.6(GLIBC_2.3.4)(64bit) libc.so.6(GLIBC_2.4)(64bit) libc.so.6(GLIBC_2.7)(64bit) libc.so.6(GLIBC_2.8)(64bit) libdl.so.2()(64bit) libgmp.so.3()(64bit) libm.so.6()(64bit) libm.so.6(GLIBC_2.2.5)(64bit) libreadline.so.6()(64bit) libtcl8.5.so()(64bit) libtk8.5.so()(64bit) libz.so.1()(64bit) rpmlib(CompressedFileNames) <= 3.0.4-1 rpmlib(FileDigests) <= 4.6.0-1 rpmlib(PayloadFilesHavePrefix) <= 4.0-1 rtld(GNU_HASH) rpmlib(PayloadIsXz) <= 5.2-1 把功能与提供它们的包联系起来不太容易。带 清单 17. 使用 yum deplist 查明 gcl 需要什么[ian@echidna ~]$ yum deplist $(rpm -q gcl) Loaded plugins: presto, refresh-packagekit Finding dependencies: package: gcl.x86_64 2.6.8-0.7.20100201cvs.fc12 dependency: libc.so.6(GLIBC_2.3.4)(64bit) provider: glibc.x86_64 2.11-2 provider: glibc.x86_64 2.11.1-6 dependency: gcl-selinux provider: gcl-selinux.x86_64 2.6.8-0.6.20090701cvs.fc12 provider: gcl-selinux.x86_64 2.6.8-0.7.20100201cvs.fc12 dependency: libgmp.so.3()(64bit) provider: gmp.x86_64 4.3.1-5.fc12 dependency: libc.so.6(GLIBC_2.8)(64bit) provider: glibc.x86_64 2.11-2 provider: glibc.x86_64 2.11.1-6 dependency: libc.so.6(GLIBC_2.4)(64bit) provider: glibc.x86_64 2.11-2 provider: glibc.x86_64 2.11.1-6 dependency: libc.so.6()(64bit) provider: glibc.x86_64 2.11-2 provider: glibc.x86_64 2.11.1-6 dependency: /sbin/install-info provider: info.x86_64 4.13a-7.fc12 provider: info.x86_64 4.13a-9.fc12 dependency: libX11.so.6()(64bit) provider: libX11.x86_64 1.3-1.fc12 dependency: libc.so.6(GLIBC_2.7)(64bit) provider: glibc.x86_64 2.11-2 provider: glibc.x86_64 2.11.1-6 dependency: libtcl8.5.so()(64bit) provider: tcl.x86_64 1:8.5.7-4.fc12 provider: tcl.x86_64 1:8.5.7-5.fc12 dependency: libc.so.6(GLIBC_2.11)(64bit) provider: glibc.x86_64 2.11-2 provider: glibc.x86_64 2.11.1-6 dependency: libtk8.5.so()(64bit) provider: tk.x86_64 1:8.5.7-2.fc12 provider: tk.x86_64 1:8.5.7-3.fc12 dependency: libc.so.6(GLIBC_2.3)(64bit) provider: glibc.x86_64 2.11-2 provider: glibc.x86_64 2.11.1-6 dependency: libm.so.6()(64bit) provider: glibc.x86_64 2.11-2 provider: glibc.x86_64 2.11.1-6 dependency: libz.so.1()(64bit) provider: zlib.x86_64 1.2.3-23.fc12 dependency: rtld(GNU_HASH) provider: glibc.i686 2.11-2 provider: glibc.x86_64 2.11-2 provider: glibc.x86_64 2.11.1-6 provider: glibc.i686 2.11.1-6 dependency: libdl.so.2()(64bit) provider: glibc.x86_64 2.11-2 provider: glibc.x86_64 2.11.1-6 dependency: libreadline.so.6()(64bit) provider: readline.x86_64 6.0-3.fc12 dependency: /bin/sh provider: bash.x86_64 4.0.33-1.fc12 provider: bash.x86_64 4.0.35-3.fc12 dependency: libc.so.6(GLIBC_2.2.5)(64bit) provider: glibc.x86_64 2.11-2 provider: glibc.x86_64 2.11.1-6 dependency: libm.so.6(GLIBC_2.2.5)(64bit) provider: glibc.x86_64 2.11-2 provider: glibc.x86_64 2.11.1-6 这个列表还显示每个功能可能的提供者。可以看到大多数依赖功能可以由多个包级别提供。例如,/bin/sh 可以来自 bash 的两个级别之一。通过使用创造性的筛选,可以把输出缩减为清单 18 所示的包名列表。 清单 18. 把 yum deplist 的输出缩减为只列出包名[ian@echidna ~]$ yum deplist $(rpm -q gcl) | grep "provider:" | \ > awk '{ print $2 }'|sort|uniq bash.x86_64 gcl-selinux.x86_64 glibc.i686 glibc.x86_64 gmp.x86_64 info.x86_64 libX11.x86_64 readline.x86_64 tcl.x86_64 tk.x86_64 zlib.x86_64 如果只想知道需要安装哪些包,可以运行 除了查明包需要的功能之外,还可能需要了解哪个包提供某一功能。前面演示了如何查明哪个包包含某一文件。清单 19 说明如何使用 清单 19. 哪个包提供 gcl-selinux(x86-64) 功能[ian@echidna ~]$ rpm -q --whatprovides 'gcl-selinux(x86-64)' gcl-selinux-2.6.8-0.7.20100201cvs.fc12.x86_64 [ian@echidna ~]$ yum whatprovides 'gcl-selinux(x86-64)' Loaded plugins: presto, refresh-packagekit gcl-selinux-2.6.8-0.6.20090701cvs.fc12.x86_64 : SELinux policy for GCL images Repo : fedora Matched from: Other : gcl-selinux(x86-64) gcl-selinux-2.6.8-0.7.20100201cvs.fc12.x86_64 : SELinux policy for GCL images Repo : updates Matched from: Other : gcl-selinux(x86-64) gcl-selinux-2.6.8-0.7.20100201cvs.fc12.x86_64 : SELinux policy for GCL images Repo : installed Matched from: Other : Provides-match: gcl-selinux(x86-64) RPM 包文件完整性为了确保完整性,RPM 包包含一个摘要(比如 MD5 或 SHA1),常常经过数字签名。数字签名的包需要用公共密钥进行检验。使用 清单 20. 检查 vim-enhanced 包文件的完整性[root@echidna ~]# rpm -vK vim-enhanced-7.2.411-1.fc12.x86_64.rpm vim-enhanced-7.2.411-1.fc12.x86_64.rpm: Header V3 RSA/SHA256 signature: OK, key ID 57bbccba Header SHA1 digest: OK (f9a199545a515f7ff0716729768b41eb68fe29a8) V3 RSA/SHA256 signature: OK, key ID 57bbccba MD5 digest: OK (d4045f1f72d48073e3f401ee9d1f71cf) 可能会产生下面的输出:
这意味着这个包是经过签名的,但是您的 RPM 数据库中没有所需的公共密钥。注意,以前版本的 RPM 可能以不同的方式提供检验。 如果包是经过签名的,您希望根据签名检验它,就需要找到适当的签名文件并把它导入 RPM 数据库。应该首先下载密钥,然后检查它的指纹,最后使用 检验安装的包与检查 rpm 的完整性一样,还可以使用 清单 21. 检验已安装的 vim-common 包[ian@echidna ~]$ rpm -V vim-common 现在,我们作为根用户删除 /usr/bin/xxd 并把 /usr/share/vim/vim72/syntax/bindzone.vim 替换为 /bin/bash。然后再次检查。结果见清单 22。 清单 22. 篡改 vim-common 包[root@echidna ~]# rpm -qf /usr/bin/xxd /usr/share/vim/vim72/syntax/bindzone.vim vim-common-7.2.411-1.fc12.x86_64 vim-common-7.2.411-1.fc12.x86_64 [root@echidna ~]# rm /usr/bin/xxd rm: remove regular file `/usr/bin/xxd'? y [root@echidna ~]# cp /bin/bash /usr/share/vim/vim72/syntax/bindzone.vim cp: overwrite `/usr/share/vim/vim72/syntax/bindzone.vim'? y [root@echidna ~]# rpm -V vim-common missing /usr/bin/xxd S.5....T. /usr/share/vim/vim72/syntax/bindzone.vim 输出表明对 /usr/share/vim/vim72/syntax/bindzone.vim 文件的 MD5 和、文件大小和 mtime 检查失败了。解决这个问题的一种方法是删除这个包,然后重新安装,依赖于 vim-common 的其他已安装包仍然可以正常运行。这个解决方案使用 清单 23. 重新安装 vim-common 包[root@echidna ~]# yum reinstall vim-common Loaded plugins: presto, refresh-packagekit Setting up Reinstall Process Resolving Dependencies --> Running transaction check ---> Package vim-common.x86_64 2:7.2.411-1.fc12 set to be updated --> Finished Dependency Resolution Dependencies Resolved ===================================================================================== Package Arch Version Repository Size ===================================================================================== Reinstalling: vim-common x86_64 2:7.2.411-1.fc12 updates 6.0 M Transaction Summary ===================================================================================== Remove 0 Package(s) Reinstall 1 Package(s) Downgrade 0 Package(s) Total download size: 6.0 M Installed size: 17 M Is this ok [y/N]: y Downloading Packages: Setting up and reading Presto delta metadata updates/prestodelta | 969 kB 00:00 Processing delta metadata Package(s) data still to download: 6.0 M vim-common-7.2.411-1.fc12.x86_64.rpm | 6.0 MB 00:01 Running rpm_check_debug Running Transaction Test Transaction Test Succeeded Running Transaction Warning: RPMDB altered outside of yum. Installing : 2:vim-common-7.2.411-1.fc12.x86_64 1/1 Installed: vim-common.x86_64 2:7.2.411-1.fc12 Complete! [root@echidna ~]# rpm -V vim-common [root@echidna ~]# ls /usr/bin/xxd /usr/bin/xxd 如果需要更有力的措施包管理系统通常可以恢复包。但是,如果删除了包中的重要文件,重新安装包但不删除无法解决问题,那么可能需要在重新安装之前删除包。对于这种情况,可能希望删除现有的拷贝并重新安装,但是不希望卸载和重新安装依赖它的所有包。为此,在删除包时,可以使用 清单 24. 用 rpm 更新包[root@echidna ~]# rm /usr/bin/xxd rm: remove regular file `/usr/bin/xxd'? y [root@echidna ~]# # Oops! we needed that file [root@echidna ~]# rpm -Fvh vim-common-7.2.411-1.fc12.x86_64.rpm [root@echidna ~]# ls /usr/bin/xxd ls: cannot access /usr/bin/xxd: No such file or directory [root@echidna ~]# # Oh! Freshening the package didn't replace the missing file [root@echidna ~]# rpm -e vim-common error: Failed dependencies: vim-common = 2:7.2.411-1.fc12 is needed by (installed) vim-enhanced-2:7.2.411-1.f c12.x86_64 [root@echidna ~]# # Can't remove vim-common because vim-enhanced needs it [root@echidna ~]# rpm -e --nodeps vim-common [root@echidna ~]# # Bypassing the dependency check allowed removal [root@echidna ~]# rpm -Uvh vim-common-7.2.411-1.fc12.x86_64.rpm Preparing... ########################################### [100%] 1:vim-common ########################################### [100%] [root@echidna ~]# # Update (or install) vim-common again [root@echidna ~]# ls /usr/bin/xxd /usr/bin/xxd [root@echidna ~]# # And /usr/bin/xxd is back 现在,如果发生意外或一般的更新失败,您可以以几种方法更新或修复。注意,在安装 RPM 时也可以绕过依赖关系检查,但是这通常不是好做法。 从存储库下载 RPM尽管 清单 25. 下载 gcl 包[ian@echidna ~]$ yumdownloader --resolve gcl Loaded plugins: presto, refresh-packagekit adobe-linux-i386 17/17 --> Running transaction check ---> Package gcl.x86_64 0:2.6.8-0.7.20100201cvs.fc12 set to be updated --> Finished Dependency Resolution gcl-2.6.8-0.7.20100201cvs.fc12.x86_64.rpm | 6.3 MB 00:01 使用 rpm2cpio如果下载一个 RPM,需要检查它的内容而不是安装它,可以使用 清单 26. 用 rpm2cpio 提取 gcl-selinux 包[ian@echidna ~]$ yumdownloader gcl-selinux Loaded plugins: presto, refresh-packagekit gcl-selinux-2.6.8-0.7.20100201cvs.fc12.x86_64.rpm | 17 kB 00:00 [ian@echidna ~]$ mkdir gcl-selinux [ian@echidna ~]$ cd gcl-selinux [ian@echidna gcl-selinux]$ rpm2cpio ../gcl-selinux*.rpm | cpio -idv ./usr/share/selinux/packages/gcl ./usr/share/selinux/packages/gcl/gcl.pp 182 blocks [ian@echidna gcl-selinux]$ find . . ./usr ./usr/share ./usr/share/selinux ./usr/share/selinux/packages ./usr/share/selinux/packages/gcl ./usr/share/selinux/packages/gcl/gcl.pp 寻找 RPM我们在前面看到 YUM 提供了搜索功能,可以搜索包描述和包名。如果需要查明哪个包包含某个还没有安装的程序,还有几种方法:
如果通过系统工具无法找到某个 RPM,可以通过 Rpmfind.Net 服务器寻找 RPM(见 参考资料 中的链接)。 命令未找到如果 Bash shell 搜索一个命令,但是没有找到,那么 shell 就搜索 shell 函数 清单 27. 寻找并安装 command-not-found 功能[root@echidna ~]# yum search command-not-found Loaded plugins: presto, refresh-packagekit ========================== Matched: command-not-found ========================== PackageKit-command-not-found.x86_64 : Ask the user to install command line : programs automatically You have new mail in /var/spool/mail/root [root@echidna ~]# yum install PackageKit-command-not-found.x86_64 Loaded plugins: presto, refresh-packagekit Setting up Install Process Resolving Dependencies --> Running transaction check ---> Package PackageKit-command-not-found.x86_64 0:0.5.7-2.fc12 set to be updated --> Finished Dependency Resolution Dependencies Resolved ================================================================================ Package Arch Version Repository Size ================================================================================ Installing: PackageKit-command-not-found x86_64 0.5.7-2.fc12 updates 102 k Transaction Summary ================================================================================ Install 1 Package(s) Upgrade 0 Package(s) Total download size: 102 k Installed size: 262 k Is this ok [y/N]: y Downloading Packages: Setting up and reading Presto delta metadata Processing delta metadata Package(s) data still to download: 102 k PackageKit-command-not-found-0.5.7-2.fc12.x86_64.rpm | 102 kB 00:00 Running rpm_check_debug Running Transaction Test Transaction Test Succeeded Running Transaction Installing : PackageKit-command-not-found-0.5.7-2.fc12.x86_64 1/1 Installed: PackageKit-command-not-found.x86_64 0:0.5.7-2.fc12 Complete! 清单 28 说明在安装 PackageKit-command-not-found 之后如何定义这个函数。如果函数无法执行搜索,那么它模拟标准的系统行为,返回 127。 清单 28. command_not_found_handle[ian@echidna ~]$ type command_not_found_handle command_not_found_handle is a function command_not_found_handle () { runcnf=1; retval=127; [ ! -S /var/run/dbus/system_bus_socket ] && runcnf=0; [ ! -x /usr/sbin/packagekitd ] && runcnf=0; if [ $runcnf -eq 1 ]; then /usr/libexec/pk-command-not-found $1; retval=$?; else echo "bash: $1: command not found"; fi; return $retval } 如果在 清单 1 中运行 gcl 之前安装了这个功能,可能会看到清单 29 所示的输出。 清单 29. 安装 command_not_found_handle 之后尝试运行 gcl[ian@echidna ~]$ gcl Command not found. Install package 'gcl' to provide command 'gcl'? [N/y] 其他工具除了
通常,这些工具以自动或半自动方式处理多个包更新。它们还可能提供显示存储库内容或搜索包的功能。更多信息参见发行版的文档。 PackageKit讨论包安装就不能不提到 PackageKit,这是一个为更方便地安装和更新软件而设计的系统。它的意图是把不同发行版中使用的所有软件图形化工具统一起来。PackageKit 使用一个由系统激活的守护进程,这意味着这个守护进程只在需要时激活。Packagekit 有适用于 Gnome (gnome-packagekit) 和 KDE (KPackageKit) 的版本。上面介绍的 command-not-found 功能也是 PackageKit 的组成部分。它包括命令 图 1. Fedora 12 (Gnome) 上的 Software Update 图形界面![]() 除了这里讨论的内容,RPM 和 YUM 包管理系统还有许多特性。更多信息参见 参考资料 中的链接。 |
|