12.1 使用 RPM 来管理软件包 12.1.1 RPM 的设计目标。
RPM 的设计目标是: 可升级性,强大的查询功能,系统校验,纯净源码。
- 可升级性
- 基于 RPM 的操作系统的新版本(如 Red Hat
Linux),不必重新安装你的系统。RPM
允许智能化、自动化地就地升级系统。软件包中的配置文件在升级中被保留,因此不会丢失定制的设置。
- 强大的查询功能
- 在整个数据库中搜索软件包或某些特定文件,以及文件所属的RPM包等。RPM
软件包的文件包括在被压缩的文件中,其中有定制的二进制文件头,该文件头内包含关于软件包及其内容的信息,允许你快速简捷地查询某个软件包。
- 系统校验
-
若担心可能删除了某软件包上的一个重要文件,只需校验该软件包即可查明。可以在必要时重装该软件包。配置文件在重装中会被保留。
- 纯净源码
- 与软件的原创者所发行源码一致的“纯净”软件源码。使用
RPM,你会有纯净源码、使用过的补丁、以及完整的建构指令。如果程序的新版本被推出,你不必从头开始编译。你可以看一看补丁来判定你可能需要做什么。使用这种技术,所有内编译的默认值,以及为正确建构软件而进行的任何改变都一目了然。
12.1.2 使用RPM
RPM有五种基本操作模式:安装(-i)、删除(-e)、升级(-U)、查询(-q)和校验(-V)。想了解完整选项和细节,使用
rpm --help 命令。
- 安装:典型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
|
如果某软件包的同一版本已经安装,你就会看到:
Preparing... ########################################### [100%]
package foo-1.0-1 is already installed
|
如果你在软件包已安装的情况下仍打算安装同一版本的软件包,你可以使用 --replacepkgs
选项,它告诉 RPM 来忽略这个错误:
rpm -ivh --replacepkgs foo-1.0-1.i386.rpm
|
如果从 RPM 安装的文件被删除了,或者你想安装 RPM 中的最初配置文件,该选项就会很有用。
如果你试图安装的软件包中包含已被另一个软件包或同一软件包的早期版本安装了的文件,你会看到:
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
|
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
|
如果你安装的是 Red Hat,它通常会向你建议解决依赖关系所需的软件包。在 Red Hat Linux 光盘或 Red Hat
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 软件包的安装了的数据库中,该软件包的名称就会被显示:
如果你想强制安装(不是好办法,因为软件包可能不能够正确运行),使用 --nodeps
选项。
-
删除:在 shell 提示下键入下面的命令来删除RPM软件包。
你在删除安装某软件包时也会遇到依赖关系错误,当另一个已安装的软件包依赖于你试图删除的软件包时,依赖关系错误就会发生。例如:
Preparing... ########################################### [100%]
error: removing these packages would break dependencies:
foo is needed by bar-2.0.20-3.i386.rpm
|
要使 RPM 忽略这个错误,并强制删除该软件包(不是个好办法,因为依赖于它的软件包可能无法正常运行),使用
--nodeps 选项。
- 升级:在 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
|
- 查询:
与其指定软件包名称,你可以和 -q
一起使用下列选项来指定你要查询的软件包。它们叫做软件包指定选项。
- -a 查询所有已安装的软件包。
- -f
<file> 会查询拥有
<file>
的软件包。当指定文件时,你必须指定文件的完整路径(如 /usr/bin/ls )。
- -p
<packagefile> 查询软件包
<packagefile> 。
指定被查询的软件包要显示哪些信息的方法多种多样。以下选项用来选择你要搜索的信息类型。它们叫做信息选择选项。
- -i 显示软件包信息,包括名称、描述、发行版本、大小、制造日期、生产商,以及其它杂项。
- -l 显示软件包所含的文件列表。
- -s 显示软件包中所有文件的状态。
- -d 显示被标记为文档(man 页、info 页、README 等等)的文件列表。
- -c
显示被标记为配置文件的文件列表。你在安装后改变这些文件来使软件包适用于你的系统(譬如, sendmail.cf 、 passwd 、 inittab
等等)。
对于用来显示文件列表的选项,你可以在命令后添加 -v 来用你熟悉的
ls -l 格式来显示文件列表。
- 检验:
它校验每个文件的大小、MD5 值、权限、类型、所有者、以及组群。 rpm -V 命令校验软件包。你可以查询任何软件包选择选项列举的条目来指定要校验的软件包。校验的最简单用法是
rpm -V foo ,它校验所有在 foo 软件包内的文件是否和最初安装时一样。例如:
如果一切都被校验正确,就不会有输出。如果出现矛盾,它们就会被显示。输出的格式为包括八个字符的字符串(c
代表配置文件),然后是文件名称。这八个字符的每个字符都代表一种文件属性的比较结果,所比较的是文件的属性和 RPM 数据库中记录的属性。单用一个
.(点)意味着测试通过。下列字符代表某类测试失败:
- 5 — MD5 校验和
- S — 文件大小
- L — 符号链接
- T — 文件修改时间
- D — 设备
- U — 用户
- G — 组群
- M — 模式(包括权限和文件类型)
- ? — 不可读文件
如果你看到任何输出,最好开动脑筋来判断是应该删除还是重新安装该软件包,或用另一种方法来解决这个问题。
12.1.3 检查软件包的签名
如果你想校验某软件包是否被损坏或篡改过,只需检查 md5sum。在 shell 提示下键入下面的命令(把
<rpm-file> 换成 RPM 软件包的文件名):
rpm -K --nogpg <rpm-file>
|
你会看到消息“<rpm-file> :
md5 OK ”。这条消息意味着文件在下载中没有被损坏。要看到更详细的消息,把命令中的 -K
换成 -Kvv 。
另一方面,创建软件包的开发者是不是值得信任?如果该软件包使用开发者的 GnuPG
钥匙(key)被签名(signed),你就会知道这位开发者的身份确实如他们所言。
RPM 软件包可以使用 Gnu 隐私卫士(或称
GnuPG)来签名,从而帮助你肯定下载软件包的可信任性。
GnuPG 是安全通讯工具;它是 PGP(一种电子隐私程序)加密技术的完全和免费的替换品。使用 GnuPG,你可以验证文档的有效性,在其它通讯者之间加密或解密数据。GnuPG
还具有解密和校验 PGP 5.x 文件的能力。
在 Red Hat Linux 的安装过程中,GnuPG 被默认安装。这样,你便可以立即开始使用 GnuPG 来校验你从 Red Hat
收到的软件包。首先,你需要导入 Red Hat 的公钥。
要校验 Red Hat 软件包,你必须导入 Red Hat GPG 公钥。要导入公钥,在 shell 提示下执行以下命令:
rpm --import /usr/share/rhn/RPM-GPG-KEY
|
要显示用来校验 RPM 而安装的钥匙列表,执行以下命令:
对于 Red Hat 公钥而言,其输出应包括:
gpg-pubkey-db42a60e-37ea5438
|
要显示关于某一指定钥匙的细节,使用 rpm -qi ,其后跟随前一命令的输出:
rpm -qi gpg-pubkey-db42a60e-37ea5438
|
导入了建构者的 GnuPG 公钥后,要检查 RPM 文件的 GnuPG 签名,使用以下命令(把
<rpm-file> 换成 RPM 软件包的名称):
如果一切顺利,你会看到这条消息:md5 gpg OK 。这意味着软件包的签名已被校验,该软件包没有被损坏。
12.1.4 RPM示范
RPM 对于管理系统、诊断和修正问题都极有用途。要理解它的选项的最佳途径是通过示范。
TOP |