RPM(RPM 程序包管理器)用于管理软件包。其主要程命令为 rpm 和 rpmbuild。用户、系统管理员和包构建人员可以查询强大的 RPM 数据库以获得有关已安装软件的详细信息。
本质上,rpm 有五种模式:安装、卸装(或更新)软件包、重构建 RPM 数据库、查询 RPM 库或独立 RPM 存档、包的完整性检查以及对包签名。rpmbuild 可用于从原始源构建可安装的包。
用特殊的二进制格式对可安装 RPM 存档进行打包。这些存档由要安装的程序文件和某些元信息组成,这些元信息供 rpm 在安装过程中配置软件包使用或者储存在 RPM 数据库中进行存档。RPM 存档通常具有扩展名 .rpm。
![]() | 软件开发包 |
|---|---|
对于许多包,已将软件开发所需的部件(库、标题、包含文件等)放入单独的包中。只有当您要自己编译软件时才需要这些开发包(例如最新的 GNOME 包)。可以通过名称扩展 | |
RPM 包具有 GnuPG 签名。命令 rpm --checksig package-1.2.3.rpm 可用于校验 RPM 包的签名,从而确定它来自 SUSE 还是其他可信工具。特别建议对来自因特网的更新包使用此命令。
通常,RPM 存档的安装十分简单:rpm -i package.rpm。使用此命令可以安装包,但前提是满足其依赖性并且不与其他包冲突。如果出现错误消息,rpm 将请求那些需要安装的包以满足依赖性要求。在后台,RPM 数据库确保不出现冲突 - 一个特定文件只能属于一个包。通过选择不同的选项,您可以强制 rpm 忽略这些默认设置,但这只供专家用户使用。否则,将影响系统的完整性并可能使系统无法更新。
选项 -U 或 --upgrade 以及 -F 或 --freshen 可用于更新包(例如,rpm -F package.rpm)。此命令将删除旧版本的文件并立即安装新文件。两个版本之间的差别是 -U 安装系统中以前不存在的包,但 -F 只更新以前安装的包。更新时,rpm 使用以下策略小心更新配置文件:
如果配置文件未被系统管理员更改,则 rpm 将安装适当文件的新版本。系统管理员无需执行任何操作。
如果配置文件在更新前已由系统管理员更改,则 rpm 将以扩展名 .rpmorig 或 .rpmsave(备份文件)保存更改的文件并安装新包中的版本(但前提是原先安装的文件和较新的版本不同)。如果是这种情况,则将备份文件(.rpmorig 或 .rpmsave)与新安装的文件进行比较,并在新文件中再次进行更改。随后,确保删除所有 .rpmorig 和 .rpmsave 文件以避免以后的更新出现问题。
如果配置文件已存在并且 .spec 文件中指定了 noreplace 标签,则出现 .rpmnew 文件。
更新后,在使用 .rpmsave 和 .rpmnew 文件进行比较后应将它们删除,从而防止它们阻碍以后的更新。如果 RPM 数据库以前未能识别文件,则将为其指派扩展名 .rpmorig。
否则,将使用 .rpmsave。换句话说,.rpmorig 是从异系统格式更新为 RPM 的结果。而 .rpmsave 是从较早的 RPM 更新为较新的 RPM 的结果。.rpmnew 不提供任何有关系统管理员是否对配置文件进行了任何更改的信息。/var/adm/rpmconfigcheck 中提供这些文件的列表。不覆盖某些配置文件(如 /etc/httpd/httpd.conf)以允许继续进行操作。
-U 开关不仅仅是使用 -e 选项进行卸载并使用 -i 选项进行安装的等效项。只要可能,就可以使用 -U。
要删除包,请输入 rpm -e package.rpm,仅删除包含未解析依赖性的包。例如,只要有其他程序需要 Tcl/Tk,理论上就不能删除它。即使是在这种情况下,RPM 也会向数据库寻求帮助。如果出于任何原因无法进行此删除操作(即使不存在其他依赖性),则最好使用选项 --rebuilddb 重构建 RPM 数据库。
为了确保系统的操作安全性,必须时常在系统中安装更新包。以前,包中的 bug 只能通过替换整个包来解决。小文件中带 bug 的大型包容易导致这种情况的发生。不过 SUSE RPM 提供了一项功能,支持在包中安装增补程序。
以下使用 pine 的示例中对最重要的考虑事项进行了说明:
要对此进行检查,请先查询包的已安装版本。对于 pine,可以通过以下命令完成:
rpm -q pine pine-4.44-188
然后检查增补程序 RPM 是否适合此版本的 pine:
rpm -qp --basedon pine-4.44-224.i586.patch.rpm pine = 4.44-188 pine = 4.44-195 pine = 4.44-207
此增补程序适用于 pine 的三个不同的版本。还列出示例中已安装的版本,从而可以安装增补程序。
在增补程序 RPM 中可以方便地找到受增补程序影响的文件。rpm 参数 -P 允许选择特殊的增补程序功能。使用以下命令显示文件列表:
rpm -qpPl pine-4.44-224.i586.patch.rpm /etc/pine.conf /etc/pine.conf.fixed /usr/bin/pine
或者,如果已安装增补程序,则使用以下命令:
rpm -qPl pine /etc/pine.conf /etc/pine.conf.fixed /usr/bin/pine
增补程序 RPM 的使用与普通 RPM 相同。唯一的区别就是必须已安装合适的 RPM。
使用命令 rpm -qPa 可以显示系统中已安装的所有增补程序的列表。如果新系统中只安装了一个增补程序(如本示例中),则列表如下:
rpm -qPa pine-4.44-224
如果以后要了解最初安装了哪个包版本,则可以在 RPM 数据库中获得此信息。对于 pine,可以通过以下命令显示此信息:
rpm -q --basedon pine pine = 4.44-188
rpm 和 rpmbuild 的手册页中提供了详细信息(包括有关 RPM 的增补程序功能的信息)。
![]() | SUSE Linux Enterprise Desktop 的官方更新 |
|---|---|
为了使更新的下载大小尽可能小,SUSE Linux Enterprise Desktop 的官方更新未以增补程序 RPM 的形式提供,而是作为增量 RPM 包(请参见第 5.2.4 节 “增量 RPM 包”了解细节)提供。 | |
增量 RPM 包包含旧版本和新版本的 RPM 包之间的差别。在旧 RPM 上应用增量 RPM 将得到全新的 RPM。不需要旧 RPM 的副本,因为增量 RPM 也可以与已安装的 RPM 一起工作。增量 RPM 包的大小甚至比增补程序 RPM 小,这有利于通过因特网传送更新包。缺点是,涉及增量 RPM 的更新操作与使用纯粹 RPM 或增补程序 RPM 进行更新的情况相比,占用的 CPU 周期要长得多。
prepdeltarpm、writedeltarpm 和 applydeltarpm 二进制文件是增量 RPM 套件(包 deltarpm)的一部分并帮助您创建和应用增量 RPM 包。使用以下命令,创建名为 new.delta.rpm 的增量 RPM。以下命令假设 old.rpm 和 new.rpm 是存在的:
prepdeltarpm -s seq -i info old.rpm > old.cpio prepdeltarpm -f new.rpm > new.cpio xdelta delta -0 old.cpio new.cpio delta writedeltarpm new.rpm delta info new.delta.rpm
最后,删除临时工作文件 old.cpio、new.cpio 和 delta。
如果旧包已经安装,则使用 applydeltarpm 可以从文件系统重新构建新的 RPM:
applydeltarpm new.delta.rpm new.rpm
如果不访问文件系统而从旧 RPM 得到它,请使用 -r 选项:
applydeltarpm -r old.rpm new.delta.rpm new.rpm
关于技术详细信息,请参见 /usr/share/doc/packages/deltarpm/README"。
使用 -q 选项,rpm 将启动查询,从而能够查看 RPM 存档(通过添加选项 -p)并查询已安装包的 RPM 数据库。可以使用多个开关指定所需信息的类型。请参见表 5.1 “最重要的 RPM 查询选项”。
表 5.1. 最重要的 RPM 查询选项
|
|
包信息 |
|
|
文件列表 |
|
|
查询包含文件 |
|
|
带有状态信息的文件列表(间接指定 |
|
|
仅列出文档文件(间接指定 |
|
|
仅列出配置文件(间接指定 |
|
|
带有完整详细信息的文件列表(将用于 |
|
|
列出包中可被另一个包通过 |
|
|
包需要的功能 |
|
|
安装脚本(预安装、后安装、卸载) |
例如,命令 rpm -q -i wget 显示 例 5.1 “rpm -q -i wget” 中所示的信息。
例 5.1. rpm -q -i wget
Name : wget Relocations: (not relocatable) Version : 1.11.4 Vendor: openSUSE Release : 1.70 Build Date: Sat 01 Aug 2009 09:49:48 CEST Install Date: Thu 06 Aug 2009 14:53:24 CEST Build Host: build18 Group : Productivity/Networking/Web/Utilities Source RPM: wget-1.11.4-1.70.src.rpm Size : 1525431 License: GPL v3 or later Signature : RSA/8, Sat 01 Aug 2009 09:50:04 CEST, Key ID b88b2fd43dbdc284 Packager : http://bugs.opensuse.org URL : http://www.gnu.org/software/wget/ Summary : A Tool for Mirroring FTP and HTTP Servers Description : Wget enables you to retrieve WWW documents or FTP files from a server. This can be done in script files or via the command line. [...]
只有当您指定带有完整路径的完整文件名时,选项 -f 才起作用。根据需要提供任意多个文件名。例如,以下命令
rpm -q -f /bin/rpm /usr/bin/wget
产生:
rpm-4.4.2.3-45.5 wget-1.11.4-1.70
如果只知道部分文件名,则可以使用壳层脚本,如例 5.2 “搜索包的脚本”所示。当运行所显示的脚本时,将部分文件名以参数的形式传递给该脚本。
例 5.2. 搜索包的脚本
#! /bin/sh
for i in $(rpm -q -a -l | grep $1); do
echo "\"$i\" is in package:"
rpm -q -f $i
echo ""
done命令 rpm -q --changelog rpm 按照日期显示有关特定包更改信息的详细列表。
借助已安装的 RPM 数据库,可以进行校验检查。使用 -V、-y 或 --verify 启动此操作。使用此选项,rpm 显示安装后已被更改的包中的所有文件。rpm 使用 8 个字符符号给出有关以下更改的一些提示:
对于配置文件,将输出字母 c。例如,对于 /etc/wgetrc (wget) 的更改:
rpm -V wget S.5....T c /etc/wgetrc
RPM 数据库的文件被放置在 /var/lib/rpm 中。如果分区 /usr 的大小为 1 GB,则此数据库可能会占用将近 30 MB,特别是在完全更新之后。如果数据库比预期大得多,则最好使用选项 --rebuilddb 重构建数据库。在执行此操作之前,制作旧数据库的备份。cron 脚本 cron.daily 每天制作数据库的副本(用 gzip 打包)并将这些副本储存在 /var/adm/backup/rpmdb 中。副本的数目是由 /etc/sysconfig/backup 中的变量 MAX_RPMDB_BACKUPS(默认值为 5)控制的。对于 1 GB 的 /usr,单个备份的大小大约为 1 MB。
所有源包都带有 .src.rpm 扩展名(源 RPM)。
![]() | |
源包可以从安装媒体复制到硬盘并使用 YaST 解压缩。但是,在包管理器中它们不会被标记为已安装 ( | |
以下目录必须可用于 /usr/src/packages 中的 rpm 和 rpmbuild(除非在诸如 /etc/rpmrc 这样的文件中指定自定义设置):
通过 YaST 安装源包时,所有必需的组件都安装在 /usr/src/packages 中:源和调整项在 SOURCES 中,相关 .spec 文件在 SPECS 中。
![]() | |
不要对系统组件( | |
下面的示例使用 wget.src.rpm 包。安装源包后,应具有类似以下列表中的文件:
/usr/src/packages/SOURCES/wget-1.11.4.tar.bz2 /usr/src/packages/SOURCES/wgetrc.patch /usr/src/packages/SPECS/wget.spec
rpmbuild -b X /usr/src/packages/SPECS/wget.spec 启动编译。X 是通配符,代表构建进程的不同阶段(有关详细信息,请参见 --help 的输出或 RPM 文档)。以下内容只是简要描述:
-bp
在 /usr/src/packages/BUILD 中准备源:解压和打增补程序。
-bc
执行与 -bp 相同的操作,但还进行编译。
-bi
执行与 -bp 相同的操作,但还安装生成的软件。注意:如果包不支持 BuildRoot 功能,则可能会重写配置文件。
-bb
执行与 -bi 相同的操作,但还创建二进制包。如果编译成功,二进制包应该在 /usr/src/packages/RPMS 中。
-ba
执行与 -bb 相同的操作,但还创建源 RPM。如果编译成功,二进制包应该在 /usr/src/packages/SRPMS 中。
--short-circuit
跳过某些步骤。
现在可以使用 rpm -i 或最好使用 rpm -U 来安装创建的二进制 RPM。使用 rpm 进行安装使它显示在 RPM 数据库中。
许多包存在的风险是构建进程中会将许多不需要的文件添加到正在运行的系统中。为防止发生这种情况,请使用 build,它将创建构建包的已定义环境。要建立这一 chroot 环境,build 脚本必须和完整的包树结构一起提供。可以通过 NFS 或从 DVD 使用硬盘上的此树。使用 build --rpms directory 设置位置。与 rpm 不同,build 命令在源目录中查找 SPEC 文件。要用系统中 /media/dvd 下装入的 DVD 构建 wget(如上面的示例中),请以 root 用户的身份使用以下命令:
cd /usr/src/packages/SOURCES/ mv ../SPECS/wget.spec . build --rpms /media/dvd/suse/ wget.spec
随后,将在 /var/tmp/build-root 建立一个最小的环境。在此环境中构建包。完成后,生成的包位于 /var/tmp/build-root/usr/src/packages/RPMS 中。
build 脚本提供多个附加选项。例如,使脚本优先选择您自己的 RPM、忽略构建环境的初始化或者将 rpm 命令限制在上述阶段之一。使用 build --help 并通过阅读 build 手册页来访问更多信息。