16.2. 使用 RPM

RPM 有五种基本操作模式(不包括软件包建构):安装、卸装、升级、查询和校验。本节包括对每一模式的总览。想了解完整的选项和细节,请使用 rpm --help 命令,或阅读 第 16.5 节中关于 RPM 的信息。

16.2.1. 寻找 RPM 软件包

在使用 RPM 之前,你必须知道要到哪里去找到它们。在互联网上搜索可能会返回许多 RPM 仓库,但是如果你要寻找的是被 Red Hat 建构的 RPM 软件包,它们可以在以下位置中找到:

16.2.2. 安装

典型的 RPM 软件包名称类似于 foo-1.0-1.i386.rpm。该文件名包括软件包名称(foo)、版本(1.0)、发行版本(1)、以及体系(i386)。安装软件包简单之极,登录为根用户,然后在 shell 提示下键入下面的命令:

rpm -Uvh foo-1.0-1.i386.rpm

如果安装成功,你会看到如下所示的输出:

Preparing...                ########################################### [100%]
   1:foo                    ########################################### [100%]

如上面所示,RPM 显示软件包的名称,然后在软件包被安装时在屏幕上打印井号来显示安装进度。

从 RPM 版本 4.1 开始,在安装或升级软件包时会自动检查软件包的签名。如果签名校验失败,你就会看到如下所示的错误消息:

error: V3 DSA signature: BAD, key ID 0352860f

如果它是只针对文件头的新签名,你会看到如下所示的错误消息:

error: Header V3 DSA signature: BAD, key ID 0352860f

如果你没有安装合适的钥匙来校验签名,消息中就会包含 NOKEY,如:

warning: V3 DSA signature: NOKEY, key ID 0352860f

关于校验软件包签名的详细信息,请参阅第 16.3 节

注记注记
 

如果你要安装内核软件包,你应该使用 rpm -ivh。详情请参阅第39章

虽然安装软件包旨在简单易行,但是有时你也会看到错误消息。

16.2.2.1. 软件包已安装

如果某软件包的同一版本已经安装,你就会看到:

Preparing...                ########################################### [100%]
package foo-1.0-1 is already installed

如果你在软件包已安装的情况下仍打算安装同一版本的软件包,你可以使用 --replacepkgs 选项,它告诉 RPM 忽略这个错误:

rpm -ivh --replacepkgs foo-1.0-1.i386.rpm

如果某个从 RPM 安装的文件被删除了,或者你想安装 RPM 中的最初配置文件,该选项就会很有用。

16.2.2.2. 文件冲突

如果试图安装的软件包中包含已被另一个软件包或同一软件包的早期版本安装了的文件,你会看到:

Preparing...                ########################################### [100%]
file /usr/bin/foo from install of foo-1.0-1 conflicts with file from package bar-2.0.20

要使 RPM 忽略这个错误,使用 --replacefiles 选项:

rpm -ivh --replacefiles foo-1.0-1.i386.rpm

16.2.2.3. 未解决的依赖关系

RPM 软件包可能“依赖”于其它软件包,这意味着它们需要安装其它软件包才能正确运行。如果你试图安装具有未解决依赖关系的软件包,你会看到:

Preparing...                ########################################### [100%]
error: Failed dependencies:
        bar.so.2 is needed by foo-1.0-1
    Suggested resolutions:
        bar-2.0.20-3.i386.rpm

如果从红帽企业 Linux 光盘集合中安装软件包,它通常会向你建议解决依赖关系所需的软件包。在红帽企业 Linux 光盘或红帽 FTP 站点(或镜像)上找到这个软件包,使用以下命令来添加:

rpm -ivh foo-1.0-1.i386.rpm bar-2.0.20-3.i386.rpm

如果这两个软件包都安装成功,你会看到:

Preparing...                ########################################### [100%]
   1:foo                    ########################################### [ 50%]
   2:bar                    ########################################### [100%]

如果它不向你建议解决依赖关系所需的软件包,你可以试用 --redhatprovides 选项来判定哪个软件包包含所需的文件。你需要安装 rpmdb-redhat 软件包才能使用这个选项。

rpm -q --redhatprovides bar.so.2

如果包含 bar.so.2 的软件包已经在 rpmdb-redhat 软件包的已安装数据库中,该软件包的名称就会被显示:

bar-2.0.20-3.i386.rpm

如果你想强制安装(不是好办法,因为软件包可能不能够正确运行),使用 --nodeps 选项。

16.2.3. 卸装

删除软件包和安装软件包一样简单。在 shell 提示下键入下面的命令:

rpm -e foo

注记注记
 

注意,我们使用软件包名称 foo,而不是原本的软件包文件名称 foo-1.0-1.i386.rpm。要删除某软件包,你需要把 foo 换成原本软件包的实际名称。

在卸装某软件包时也会遇到依赖关系错误。当另一个已安装的软件包依赖于你试图删除的软件包时,依赖关系错误就会发生。例如:

Preparing...                ########################################### [100%]
error: removing these packages would break dependencies:
        foo is needed by  bar-2.0.20-3.i386.rpm

要使 RPM 忽略这个错误,并强制删除该软件包(不是个好办法,因为依赖于它的软件包可能无法正常运行),使用 --nodeps 选项。

16.2.4. 升级

升级软件包和安装类似。在 shell 提示下键入以下命令:

rpm -Uvh foo-2.0-1.i386.rpm

你在上面的例子里看不到的是,RPM 自动删除所有 foo 软件包的早期版本。事实上,你可能想一直使用 -U 来安装软件包,因为即便你以前没有安装软件包的任何版本,这个选项也可以安装该软件包。

因为 RPM 对软件包和配置文件执行智能升级,你可能会看到和下面相似的消息:

saving /etc/foo.conf as /etc/foo.conf.rpmsave

这条消息意味着你对配置文件所作的改变可能不会和软件包中的新配置文件“前向兼容”,因此,RPM 保存了你的原始文件,并安装了一个新文件。你应该调查一下这两个配置文件的区别,然后尽快地解决这些区别来确保系统继续正确运行。

升级实际上是删除和安装的组合,因此,在 RPM 升级中,除了删除和安装中会遇到的错误外,你还会看到另一个错误。如果 RPM 认为你试图升级到软件包的早期版本,你会看到:

package foo-2.0-1 (which is newer than foo-1.0-1) is already installed

要使 RPM 强制“升级”,使用 --oldpackage 选项:

rpm -Uvh --oldpackage foo-1.0-1.i386.rpm

16.2.5. 刷新

刷新软件包和升级软件包相似。在 shell 提示下键入以下命令:

rpm -Fvh foo-1.2-1.i386.rpm

RPM 的刷新选项会比较在命令行上指定的软件包的版本和你的系统上已安装的版本。当 RPM 的刷新选项处理的版本比你已安装的版本更新,它就会升级到更新的版本。然而,如果某软件包先前没有安装,RPM 的刷新选项将不会安装该软件包。这和 RPM 的升级选项不同,因为不管该软件包的早期版本是否已被安装,升级选项都会安装该软件包。

RPM 的刷新选项可以用于单个软件包或一组软件包。如果你刚刚下载了大量不同的软件包,你只想升级那些已安装在你的系统上的软件包,刷新即可达到目的。如果使用刷新,你不必在使用 RPM 前把不必要的软件包从下载的软件包组中删除。

在这种情况下,使用以下命令:

rpm -Fvh *.rpm

RPM 将只会自动升级那些已经在系统上安装的软件包。

16.2.6. 查询

使用 rpm -q 命令来查询已安装软件包的数据库。rpm -q foo 命令会显示已安装软件包 foo 的名称、版本、和发行号码:

foo-2.0-1

注记注记
 

注意,我们使用的是软件包名称 foo。要查询软件包,你需要把 foo 换成实际软件包名称。

与其指定软件包名称,你可以和 -q 一起使用下列选项来指定你要查询的软件包。它们叫做“软件包指定选项”。

指定被查询的软件包要显示哪些信息的方法多种多样。以下选项用来选择你要搜索的信息类型。它们叫做“信息选择选项”。

对于用来显示文件列表的选项,你可以在命令后添加 -v 来用你熟悉的 ls -l 格式显示文件列表。

16.2.7. 校验

校验软件包比较从某软件包安装的文件和原始软件包中的同一文件的信息。它校验每个文件的大小、MD5 值、权限、类型、所有者、以及组群。

rpm -V 命令校验软件包。你可以查询任何软件包选择选项列举的条目来指定要校验的软件包。校验的最简单用法是 rpm -V foo,它校验所有在 foo 软件包内的文件是否和最初安装时一样。例如:

如果一切都被校验正确,屏幕上就不会显示输出。如果出现矛盾,它们就会被显示。输出的格式为包括八个字符的字符串(c 代表配置文件),然后是文件名称。这八个字符的每个字符都代表一种文件属性的比较结果,所比较的是文件的属性和 RPM 数据库中记录的属性。单用一个 .(点)意味着测试通过。下列字符代表某类测试失败:

如果你看到任何输出,最好开动脑筋来判断是应该删除还是重新安装该软件包,或用另一种方法来解决这个问题。