Red Hat Linux 系统上的所有软件都被分成可被安装、升级、或删除的 RPM 软件包。这个部分描述了如何使用图形化和命令行工具来管理 Red Hat Linux 系统上的 RPM 软件包。
32. 使用 RPM 来管理软件包
RPM 软件包管理器(RPM)是开放打包系统,任何人都可以使用。它在 Red Hat Linux,以及其它 Linux 和 UNIX 系统上运行。Red Hat, Inc. 鼓励其它销售商在他们自己的产品上使用 RPM 技术。RPM 按照 GPL 条款被发行。
对于终端用户来说,RPM 简化了系统更新。安装、删除安装、升级 RPM 软件包可以使用简短的命令就可完成。RPM 维护一个已安装软件包和它们的文件的数据库,因此,你可以在系统上使用功能强大的查询和校验。如果你更喜欢图形化界面,你可以使用 软件包管理工具 来执行许多 RPM 命令。详情请参阅 第33章 。
在升级中,RPM 处理配置文件时非常谨慎,因此你决不会丢失你定制的配置 — 这是你用普通的 .tar.gz 文件所无法达到的。
对于开发者来说,RPM允许你把软件编码和程序打包,然后提供给终端用户。这个进程非常简单,它能从你创建的单个文件或补丁中驱动。这种对你的“纯净”源码、补丁和建构指令的清晰描述减轻了发行软件新版本所带来的维护负担。
注记:因为 RPM 要对你的系统做适当改变,你必须是根用户才能安装、删除、或升级某个 RPM 软件包。
32.1. RPM 的设计目标
为了理解如何使用 RPM,我们应该先来了解 RPM 的设计目标:
可升级性
使用 RPM,你可以不必全盘重装就可以在系统上升级个别组件。当你得到一个基于 RPM 的操作系统的新发行版本(如 Red Hat Linux),你不必重新安装你的系统(基于其它打包系统的操作系统需要重装)。RPM 允许智能化、自动化地就地升级你的系统。软件包中的配置文件在升级中被保留,因此你不会丢失定制的设置。你不需要特殊的升级文件来升级某软件包,因为在系统上安装和升级软件包使用同样的 RPM 文件。
强大的查询功能
RPM 被设计来提供强大的查询功能。你可以在整个数据库中搜索软件包或某些特定文件。你还可以轻易地了解到哪个文件属于哪个软件包,软件包来自哪里。RPM 软件包的文件包括在被压缩的归档中,其中有定制的二进制档头,该档头内包含关于软件包及其内容的信息,允许你快速简捷地查询个体软件包。
系统校验
另一项强大的功能是软件包校验。如果你担心你可能删除了某软件包上的一个重要文件,只需校验该软件包即可。任何异常情况都会向你通知。到时,你可以在必要时重装该软件包。你修改过的配置文件在重装中会被保留。
纯净源码
一个重要的设计目标是允许使用与软件的原创者所发行源码一致的“纯净”软件源码。使用 RPM,你会有纯净源码、使用过的补丁、以及完整的建构指令。这是一个重要的优越性。首先,如果程序的新版本被推出,你不必从头开始编译。你可以看一看补丁来判定你 可能 需要做什么。使用这种技术,所有内编译的默认值,以及为正确建构软件而进行的任何改变都一目了然。
保持源码纯净的目的似乎只对开发者来说是重要的,但是它也会给终端用户带来高质量的软件。我们想在此感谢 BOGUS 的发行人员,感谢他们最先开创了纯净源码这一概念。
32.2. 使用 RPM
RPM 有五种基本操作模式(不包括软件包建构):安装、删除安装、升级、查询和校验。本章节包括对每一模式的总览。想了解完整的选项和细节,请使用 rpm --help 命令,或阅读 第 32.5 节 中关于 RPM 的信息。
32.2.1. 寻找 RPM 软件包
在使用 RPM 之前,你必须知道要到哪里去寻找它们。在互联网上搜索会返回许多 RPM 仓库,但是如果你要找的是由 Red Hat 建构的 RPM 软件包,你可以在下面几个地方找到它们:
Red Hat Linux 光盘
Red Hat 勘误网页: http://www.redhat.com/apps/support/errata/
Red Hat FTP 镜像网站: http://www.redhat.com/download/mirror.html
Red Hat 网络 — 关于 Red Hat 网络的详情,请参阅第34章。
32.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
关于校验软件包签名的详细信息,请参阅第 32.3 节。
注记:如果你要安装内核软件包,你应该使用 rpm -ivh 。详情请参阅第30章。
虽然安装软件包旨在简单易行,但是你有时也会看到错误。
32.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 中的最初配置文件,该选项就会很有用。
32.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
32.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
如果你安装的是 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 软件包的安装了的数据库中,该软件包的名称就会被显示:
bar-2.0.20-3.i386.rpm
如果你想强制安装(不是好办法,因为软件包可能不能够正确运行),使用 --nodeps 选项。
32.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 选项。
32.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
32.2.5.刷新
刷新软件包和升级软件包相似。在 shell 提示下键入以下命令:
rpm -Fvh foo-1.2-1.i386.rpm
RPM 的刷新选项比较在命令行上指定的软件包的版本和你的系统上已安装的版本。当 RPM 的刷新选项处理的版本比你已安装的版本更新,它就会被升级到更新的版本。然而,如果某软件包先前没有安装,RPM 的刷新选项将不会安装该软件包。这和 RPM 的升级选项不同,因为不管该软件包的老版本是否已被安装,升级选项 都会 安装该软件包。
RPM 的刷新选项可以用于单个软件包或一组软件包。如果你刚刚下载了大量不同的软件包,你只想升级那些已安装在你的系统上的软件包,刷新即可达到目的。如果使用刷新,你不必在使用 RPM 前从下载的软件包组中删除不必要的软件包。
在这种情况下,你单使用下面的命令就可以了:
rpm -Fvh *.rpm
RPM 将只会自动升级那些已经在系统上安装的软件包。
32.2.6.查询
使用 rpm -q 命令来查询安装的软件包的数据库。 rpm -q foo 命令会显示安装的软件包 foo 的名称、版本、和发行号码:
foo-2.0-1
注记:注意,我们使用的是软件包 名称 foo 。要查询软件包,你需要把 foo 换成实际软件包名称。
与其指定软件包名称,你可以和 -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 格式来显示文件列表。
32.2.7.校验
校验软件包比较从某软件包安装的文件和原始软件包中的同一文件的信息。它校验每个文件的大小、MD5 值、权限、类型、所有者、以及组群。
rpm -V 命令校验软件包。你可以查询任何 软件包选择选项 列举的条目来指定要校验的软件包。校验的最简单用法是 rpm -V foo ,它校验所有在 foo 软件包内的文件是否和最初安装时一样。例如:
要校验包含某一特定文件的软件包:
rpm -Vf /bin/vi
要校验所有安装了的软件包:
rpm -Va
要根据 RPM 软件包文件来校验安装了的软件包:
rpm -Vp foo-1.0-1.i386.rpm
如果你怀疑 RPM 数据库已被损坏,该命令就会很有用。
如果一切都被校验正确,就不会有输出。如果出现矛盾,它们就会被显示。输出的格式为包括八个字符的字符串( c 代表配置文件),然后是文件名称。这八个字符的每个字符都代表一种文件属性的比较结果,所比较的是文件的属性和 RPM 数据库中记录的属性。单用一个 . (点)意味着测试通过。下列字符代表某类测试失败:
5 — MD5 校验和
S — 文件大小
L — 符号链接
T — 文件修改时间
D — 设备
U — 用户
G — 组群
M — 模式(包括权限和文件类型)
? — 不可读文件
如果你看到任何输出,最好开动脑筋来判断是应该删除还是重新安装该软件包,或用另一种方法来解决这个问题。
32.3.检查软件包的签名
如果你想校验某软件包是否被损坏或篡改过,只需检查 md5sum。在 shell 提示下键入下面的命令(把 coolapp 换成 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 的公钥。
32.3.1.导入钥匙
要校验 Red Hat 软件包,你必须导入 Red Hat GPG 公钥。要导入公钥,在 shell 提示下执行以下命令:
rpm --import /usr/share/rhn/RPM-GPG-KEY
要显示用来校验 RPM 而安装的钥匙列表,执行以下命令:
rpm -qa gpg-pubkey*
对于 Red Hat 公钥而言,其输出应包括:
gpg-pubkey-db42a60e-37ea5438
要显示关于某一指定钥匙的细节,使用 rpm -qi ,其后跟随前一命令的输出:
rpm -qi gpg-pubkey-db42a60e-37ea5438
32.3.2.校验软件包的签名
导入了建构者的 GnuPG 公钥后,要检查 RPM 文件的 GnuPG 签名,使用以下命令(把 <rpm-file> 换成 RPM 软件包的名称):
rpm -K <rpm-file>
如果一切顺利,你会看到这条消息: md5 gpg OK 。这意味着软件包的签名已被校验,该软件包没有被损坏。
窍门:关于 GnuPG 的详细信息,请参阅附录 B。
32.4.用 RPM 在朋友面前大显身手
RPM 对于管理系统、诊断和修正问题都极有用途。要理解它的选项的最佳途径是通过示范。
可能你不小心删除了一些文件,却不能肯定删除了哪些文件。如果你想校验整个系统来看一看缺少哪些文件,你可以试一试下面的命令:
rpm -Va
如果缺少某些文件或它们似乎被损坏,你可能应该重新安装该软件包或删除安装然后再重新安装该软件包。
有时候,你可能会看到不认识的文件。要发现哪个软件包拥有它,你可以输入:
rpm -qf /usr/X11R6/bin/ghostview
它的输出和以下相似:
gv-3.5.8-22
我们可以在以下的假想情况下组合以上的两个例子。假设你的 /usr/bin/paste 出了问题,你想校验拥有该程序的软件包,但是你不知道哪个软件包拥有 paste 。你只需输入以下命令就可以了:
rpm -Vf /usr/bin/paste
这样,适当的软件包就会被校验。
你想知道关于某一特定的程序的详细信息吗?你可以试用下面的命令来查找拥有该程序的软件包所附带的文档:
rpm -qdf /usr/bin/free
它的输出和以下相似:
/usr/share/doc/procps-2.0.11/BUGS
/usr/share/doc/procps-2.0.11/NEWS
/usr/share/doc/procps-2.0.11/TODO
/usr/share/man/man1/free.1.gz
/usr/share/man/man1/oldps.1.gz
/usr/share/man/man1/pgrep.1.gz
/usr/share/man/man1/pkill.1.gz
/usr/share/man/man1/ps.1.gz
/usr/share/man/man1/skill.1.gz
/usr/share/man/man1/snice.1.gz
/usr/share/man/man1/tload.1.gz
/usr/share/man/man1/top.1.gz
/usr/share/man/man1/uptime.1.gz
/usr/share/man/man1/w.1.gz
/usr/share/man/man1/watch.1.gz
/usr/share/man/man5/sysctl.conf.5.gz
/usr/share/man/man8/sysctl.8.gz
/usr/share/man/man8/vmstat.8.gz
你可能会发现一个新的 RPM,但是你不知道它的用途。要寻找关于它的信息,使用下面的命令:
rpm -qip crontabs-1.10-5.noarch.rpm
它的输出看起来和以下相似:
Name : crontabs Relocations: (not relocateable)
Version : 1.10 Vendor: Red Hat, Inc.
Release : 5 Build Date: Fri 07 Feb 2003 04:07:32 PM EST
Install date: (not installed) Build Host: porky.devel.redhat.com
Group : System Environment/Base Source RPM: crontabs-1.10-5.src.rpm
Size : 1004 License: Public Domain
Signature : DSA/SHA1, Tue 11 Feb 2003 01:46:46 PM EST, Key ID fd372689897da07a
Packager : Red Hat, Inc. <http://bugzilla.redhat.com/bugzilla>
Summary : Root crontab files used to schedule the execution of programs.
Description :
The crontabs package contains root crontab files. Crontab is the
program used to install, uninstall, or list the tables used to drive the
cron daemon. The cron daemon checks the crontab files to see when
particular commands are scheduled to be executed. If commands are
scheduled, then it executes them.
也许你想指定 crontabs RPM 会安装哪些文件。你可以输入下面的命令:
rpm -qlp crontabs-1.10-5.noarch.rpm
它的输出看起来和下面相似:
Name : crontabs Relocations: (not relocateable)
Version : 1.10 Vendor: Red Hat, Inc.
Release : 5 Build Date: Fri 07 Feb 2003 04:07:32 PM EST
Install date: (not installed) Build Host: porky.devel.redhat.com
Group : System Environment/Base Source RPM: crontabs-1.10-5.src.rpm
Size : 1004 License: Public Domain
Signature : DSA/SHA1, Tue 11 Feb 2003 01:46:46 PM EST, Key ID fd372689897da07a
Packager : Red Hat, Inc. <http://bugzilla.redhat.com/bugzilla>
Summary : Root crontab files used to schedule the execution of programs.
Description :
The crontabs package contains root crontab files. Crontab is the
program used to install, uninstall, or list the tables used to drive the
cron daemon. The cron daemon checks the crontab files to see when
particular commands are scheduled to be executed. If commands are
scheduled, then it executes them.
以上不过是几个例子。随着你的使用经验的增加,你会发现更多 RPM 的用途。
======
更多LINUX技术文章,教程等下载尽在www.linuxdiyf.com
[ 本帖最后由 diyf 于 2006-9-7 11:07 编辑 ] |