查询 RPM 包

您在前面的示例中看到,用 rpm 命令安装 rpm 需要包文件的完整名称或 URL),比如 gcl-2.6.8-0.6.20090701cvs.fc12.x86_64.rpm。另一方面,用 yum 安装或用这两个命令删除 rpm 只需要包名,比如 gcl。与 APT 一样,RPM 在内部数据库中维护安装的包的信息,因此允许使用包名操作安装的包。在本节中,看看可以使用 rpm 的 -q代表查询)选项或相关联的 yum 查询从数据库获取的一些信息。

基本查询只检查包是否已经安装了,如果安装了,就查询版本。增加 -i 选项会得到包的相关信息。注意,安装、升级或删除包需要根权力,但是非根用户也可以查询 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.gnu.org/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.gnu.org/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 包相关联的一些标记。注意,rpm 和 yum 以不同的格式显示不同的信息。在本文中,我们都使用标准命令选项提供的基本输出。如果希望使用 rpm --queryformat 选项定制查询输出,请参考手册页。如果希望了解您的 rpm 版本支持的所有标记,应该运行 rpm --querytags。

如清单 10 所示,可以使用 yum 列出安装的包。还可以用它列出有更新可用的包、可以安装的包以及具有其他性质的包,比如废弃的包或存储库中最近添加的包。甚至可以使用 yum 搜索包。在清单 11 中可以看到,texmacs 包还没有安装,但是可以从 fedora 存储库获取它。如果搜索 “texmacs”,会看到提到它的四个包。很容易看出为什么会找到 TeXmacs* 包。使用 yum info pydot 查明为什么也会找到 pydot 包。

清单 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,因为它的选项更丰富。许多示例也可以使用 yum 完成,yum 有一些基本 rpm 选项不具备的功能。

RPM 包和其中的文件

用户常常希望知道一个包中有哪些文件,或者某个文件来自哪个包。使用 -ql 选项列出 gcl 包中的文件,见清单 12。这个包中有许多文件,所以这里只给出部分输出。

清单 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

通过在查询中添加 -c 选项,可以把列出的文件限制为配置文件。-d 选项把输出限制为文档文件。

查询包文件

上面的包查询命令在 RPM 数据库中查询已经安装的包。如果刚下载了一个包,想获取同类信息,可以在查询中使用 -p代表包文件)选项并指定包的文件 名与安装包时一样)。清单 13 显示前面下载的两个 vim 包的信息。我们只作为根用户运行它,因为文件在根用户的主目录中。可以添加其他查询选项,比如用 -l 列出文件,用 -i 列出信息。

清单 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

查询安装的所有包

-a 选项把查询应用于安装的所有包。这会生成许多输出,所以通常同时使用一个或多个筛选器,比如用 sort 进行排序,用 more 或 less 进行分页输出,用 wc 获取包或文件内容,用 grep 搜索您不确定名称的包。清单 14 给出以下查询:

清单 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

使用 rpm -qa 可以简化对多个系统的管理。如果把排序的输出重定向到一台机器上的文件,然后在另一台机器上也这么做,就可以使用 diff 程序寻找差异。

哪个包包含某一文件?

既然可以列出所有包和一个包中的所有文件,现在就掌握了查明哪个包包含某一文件所需的所有信息。但是,rpm 命令的 -f或 --file)选项可以帮助找到包含某一文件的包。假设您想知道前面看到的哪个 vim 包提供 vim 命令。您需要文件的完整路径。清单 15 说明如何使用 which 命令得到 vim 命令的完整路径,可以使用这个输出作为 rpm -qf 命令的输入。注意,`which guile-config` 前后的符号是反撇号。在 Bash shell 中,另一种使用方法是 $(which vim)。

清单 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 包可能包含其他包所依赖的任意功能。

如您所见,依赖关系通常会正常发挥作用。如果需要同时安装几个包,其中一些依赖于其他包,那么只需使用 yum,或者向 rpm -Uvh 命令提供完整的列表,它会分析依赖关系并按正确的次序执行安装。

除了在安装或删除包时产生的错误消息之外,还可以通过几种方法查明包需要或依赖的文件或功能。

rpm 命令提供的一个选项可以查询安装的包或包文件,从而查明它们依赖或需要 什么功能。这个选项是 --requires,它可以简写为 -R。清单 16 显示 gcl 需要的功能。如果要查询包文件而不是 RPM 数据库,那么添加 -p 选项并使用完整的 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

把功能与提供它们的包联系起来不太容易。带 deplist 选项的 yum 命令可以提供帮助。如果只指定包名,没有版本号,可能会得到其他已知版本的列表。清单 17 说明如何获得安装的 gcl 版本的依赖列表。

清单 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

如果只想知道需要安装哪些包,可以运行 yum install,查看在提示接受安装提议之前显示的列表。

除了查明包需要的功能之外,还可能需要了解哪个包提供某一功能。前面演示了如何查明哪个包包含某一文件。清单 19 说明如何使用 rpm 或 yum 查明哪个包提供 gcl-selinux(x86-64) 功能。除了显示提供此功能的已安装包的信息之外,YUM 还显示存储库中可用的包或版本。可以看到,原来的 2.6.8-0.6 版来自 fedora 存储库,而 updates 存储库中有更新的 2.6.8-0.7 版。

清单 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)


相关内容