RPM包管理器(RPM Package Manager)只能在RPM格式的包上使用。RPM本身有一个事先装好的rpm包。对于终端用户,RPM可以很轻松的更新系统。使用简短的命令就能下载,卸载,更新RPM包。RPM维护已安装的软件包及其文件的数据库,因此您可以在系统上进行查询并验证已安装的文件。有几个应用程序,例如DNF或PackageKit,它们可以使RPM格式的软件包更容易使用。
WARNING
尽可能使用DNF而不是RPM
对于大多数包管理任务,DNF包管理器和RPM相同,且提供更强的功能和效用。DNF还能执行并跟踪解决复杂的系统依赖。DNF维护系统完整性,强制系统完整性检查是否使用其他应用程序(例如RPM)而不是DNF安装或删除了软件包。由于这些原因,强烈建议您在有可能执行包管理任务时使用DNF而不是RPM。见DNF.
如果您更喜欢图形界面,则可以使用PackageKit GUI 应用程序,该应用程序使用DNF作为其后端,以管理系统的软件包。
在升级期间,RPM处理配置文件细节,以便您永远不会丢失自定义项,这是通常的.tar.gz文件无法做到的。对于开发人员,RPM使软件源代码能够打包到最终用户的源和二进制包中。此过程非常简单,并从您创建的单个文件和可选修补程序驱动。在发布新版本软件时,对原始代码和补丁构建说明的清晰描述可以简化软件包的维护。
NOTE
因为RPM可以对系统本身进行更改,所以在系统范围内执行安装、升级、降级和卸载二进制包等操作在大多数情况下都需要root权限。
RPM Design Goals
要理解如何使用RPM,了解RPM的设计目标是有帮助的:
Upgradability
使用RPM,您可以升级系统的单个组件,而不需要完全重新安装。当您获得基于RPM操作系统(比如Fedora)的新版本时,不需要在您的机器上重新安装操作系统的新副本(对于基于其他打包系统的操作系统,可能需要这样做)。RPM允许对系统进行智能、全自动、就地升级。此外,包中的配置文件会在各个升级之间保存,因此您不会丢失您的自定义配置。升级包不需要特殊的升级文件,因为在系统上安装和升级包都使用相同的RPM文件。
Powerful Querying
RPM旨在提供强大的查询选项。您可以在数据库的副本上执行包搜索,甚至只是某些文件。您还可以很容易地找到一个文件属于哪个包以及该包来自哪里。RPM包包含的文件在压缩的归档文件中,有一个定制的二进制头,其中包含关于包及其内容的有用信息,允许您快速、轻松地查询单个包。
System Verification
另一个强大的RPM特性是验证包的能力。它允许您验证安装在系统上的文件是否与给定包提供的文件相同。如果检测到不一致,RPM会通知您,如果需要,您可以重新安装软件包。在重新安装期间,您所修改的任何配置文件都会被保留。
Pristine Sources
一个关键的设计目标是允许使用原始的软件源代码,因为这些源代码是由软件的原始作者发布的。使用RPM,您可以获得原始的源代码以及所使用的任何补丁,以及完整的构建指令。这是一个重要的优势,原因有几个。例如,如果发布了一个新版本的程序,您不必从头开始编译它。您可以查看补丁,看看您可能需要做什么。使用这种技术,可以很容易地看到所有编译中的默认值,以及为正确构建软件而做出的所有更改。
保持源代码原始的目标似乎只对开发人员很重要,但它会为最终用户带来更高质量的软件。
Using RPM
RPM有五种基本的操作模式(不包括构建包):安装、卸载、升级、查询和验证。本节包含每种模式的概述。要了解完整的详细信息和选项,请尝试rpm --help
或查看rpm(8)。另外,请参阅其他参考资料(Additional Resources)以获得关于RPM的更多信息。
Installing and Upgrading Packages
RPM包的文件名通常如下所示:
package_name-version-release-operating_system-CPU_architecture.rpm
例如:tree-1.7.0-3.34.x86_64
。文件名包括包名(tree
)、版本号(1.7.0
)、版本号(3
)、操作系统主版本号(34
)和CPU架构号(x86_64
)。
IMPORTANT
在安装软件包时,确保它与您的操作系统和处理器体系结构兼容。这通常可以通过检查包名来确定。例如,为AMD64/Intel 64计算机体系结构编译的RPM包的文件名以x86_64.rpm结尾。
-u
(或 --upgrade
)选项有两个功能,可以用来:
-
将系统上现有的包升级到较新的版本
-
如果还没有安装旧版本的软件包,请安装该软件包
rpm -U package.rpm 命令可以升级或安装,这取决于系统上是否存在较旧版本的包。
假定tree-1.7.0-3.34.x86_64.rpm
包在当前目录下,以root
身份登录并在shell提示符下输入以下命令来升级或安装tree包:
~]$ sudo rpm -Uvh tree-1.7.0-3.34.x86_64.rpm
NOTE
-v和-h选项(与-U结合使用)导致rpm打印
更详细的输出
,并使用散列符号显示进度条
。
如果升级或安装成功,系统回显如下:
Preparing... ########################################### [100%]
1:tree ########################################### [100%]
WARNING
总是使用-i (install)选项来安装新的内核包!
rpm为安装包提供了两个不同的选项:前面提到的
-U
选项(以前代表升级)和-i
选项(以前代表安装)。因为-U
选项包括安装和升级功能,所以建议对除内核包外的所有包使用rpm -Uvh。您应该始终使用
-i
选项来安装新的内核包,而不是升级它。是因为使用-U
选项来升级内核包会删除以前的(旧的)内核包,如果新内核有问题,这会导致系统无法引导。因此,可以使用rpm -i kernel_package命令安装新的内核,而不替换任何旧的内核包。有关安装内核包的更多信息,请参见手动升级内核(Manually Upgrading the Kernel)。
安装或升级软件包时,会自动检查软件包的签名。该签名确认包已由授权方签署。如果签名验证失败,则返回错误提示。
如果您没有安装适当的密钥来验证签名,则消息包含单词 NOKEY
:
warning: tree-1.7.0-3.34.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID 431d51: NOKEY
有关检查包签名的更多信息,请参见检查包签名(Checking Package Signatures)。
Replacing Already-Installed Packages
如果已经安装了相同名称和版本的软件包,回显信息如下所示:
Preparing... ########################################### [100%]
package tree-1.7.0-3.34.x86_64 is already installed
如果无论如何都要安装这个包,使用 --replacepkgs
选项,它告诉RPM忽略这个错误:
~]$ sudo rpm -Uvh --replacepkgs tree-1.7.0-3.34.x86_64.rpm
如果从包中安装的文件已被删除,或者希望 安装原始配置文件
,则此选项很有用。
Resolving File Conflicts
如果试图安装的包中包含的文件已经被其他包安装,则会显示冲突消息。要让RPM忽略这个错误,请使用 --replacefiles
选项:
~]$ sudo rpm -Uvh --replacefiles package.rpm
Satisfying Unresolved Dependencies
RPM包有时依赖于其他包,这意味着它们需要安装其他包才能正常运行。如果试图安装具有无法解析依赖项的包,则会显示有关失败依赖项的消息。
在Fedora安装介质或某个活动Fedora镜像上找到建议的包,并将其添加到安装命令中。要确定哪个包包含所需的文件,使用 --whatprovides
选项:
~]$ sudo rpm -q --whatprovides "required_file"
如果包含required_file的软件包在RPM数据库中,则显示软件包名称。
WARNING
尽管您可以强制rpm安装具有无法解决的依赖关系的包(使用
--nodeps
选项),但不建议这样做,通常会导致安装的软件无法运行。使用--nodeps
安装包可能导致应用程序行为不当或意外终止。它还可能导致严重的包管理问题或系统故障。由于这些原因,请注意有关丢失依赖项的警告。DNF包管理器执行自动依赖关系解析,并从在线存储库获取依赖关系。
Preserving Changes in Configuration Files
因为RPM使用配置文件对包进行智能升级,所以您可能会看到以下消息:
saving /etc/configuration_file.conf as /etc/configuration_file.conf.rpmsave
这条消息意味着您对配置文件所做的更改可能与包中的新配置文件 不正向兼容
,因此RPM保存了您的原始文件并安装了一个新文件。您应该研究这两个配置文件之间的差异,并尽快解决它们,以确保您的系统继续正常运行。
或者,RPM可以将包的新配置文件保存为configuration_file.conf.rpmnew并保持所修改的配置文件不变。您仍然应该解决已修改的配置文件与新配置文件之间的任何冲突,通常是通过将旧配置文件的更改合并为新配置文件,例如使用diff程序。
Uninstalling Packages
卸载一个软件包和安装一个软件包一样简单。在shell提示符中以root身份输入以下命令:
~]$ sudo rpm -e package
NOTE
rpm -e and package name errors
注意,该命令只需要包名,而不是原始包文件的名称。如果试图使用rpm -e命令卸载软件包并提供原始的完整文件名,则会收到package-name错误。
如果另一个已安装的包依赖于您要删除的包,那么在卸载一个包时可能会遇到依赖项错误。例如:
~]$ sudo rpm -e ghostscripterror: Failed dependencies: ghostscript is needed by (installed) ghostscript-cups-9.07-16.34.x86_64 ghostscript is needed by (installed) foomatic-4.0.9-6.34.x86_64 libgs.so.9()(64bit) is needed by (installed) libspectre-0.2.7-4.34.x86_64 libijs-0.35.so()(64bit) is needed by (installed) gutenprint-5.2.9-15.34.x86_64 libijs-0.35.so()(64bit) is needed by (installed) cups-filters-1.0.35-15.34.x86_64
WARNING
尽管您可以强制rpm卸载具有无法解析依赖关系的包(使用
--nodeps
选项),但不建议这样做。使用nodeps
删除包可能导致依赖该包的应用程序行为不当或意外终止。它还可能导致严重的包管理问题或系统故障。由于这些原因,请注意有关失败依赖项的警告。
Freshening Packages
刷新与升级类似,只是只升级已安装的包。在shell提示符中以root身份输入以下命令:
~]$ sudo rpm -Fvh package.rpm
-F
(或 --freshen
)选项将命令行上指定的软件包版本与系统上已经安装的软件包版本进行比较。当使用 freshen
选项处理比已安装包的新版本更新的版本时时,该包将被升级到新版本。但是,如果以前没有安装过同名的包,则 --freshen
选项不会安装包。这与常规升级不同,因为升级将安装所有指定的包,而不管是否已经安装了旧版本的包。
刷新工作为单个软件包或软件包组。例如,如果您下载了大量不同的包,并且只希望升级系统上已经安装的那些包,那么刷新可以有所帮助。在本例中,使用下面的*.rpm通式:
~]$ sudo rpm -Fvh *.rpm
然后,RPM只自动升级那些已经安装的软件包。
Querying Packages
RPM数据库存储系统上已安装的所有RPM包的信息。它存储在 /var/lib/rpm/
目录中,用于许多事情,包括查询安装了什么包,每个包的版本,以及计算自安装以来包中的文件的变化。要查询这个数据库,使用带 -q
(或 --query
)选项的rpm命令:
~]$ sudo rpm -q package_name
该命令显示已安装包package_name的包名、版本和版本号。例如:
~]$ sudo rpm -q treetree-1.7.0-3.34.x86_64
请参阅rpm(8)手册页面中的 Package Selection Options
子标题,以获得可用于进一步优化或限定查询的选项列表。使用Package Query options子标题下面列出的选项来指定要显示关于查询的包的哪些信息。
Verifying Packages
验证一个包是比较系统上从一个包中安装的文件的信息和从原始包中安装的相同信息。在其他参数中,校验比较文件大小、MD5和、权限、类型、所有者和每个文件的组。
使用rpm命令和-V(或——verify)选项来验证包。例如:
~]$ sudo rpm -V tree
请参阅rpm(8)手册页面中的 Package Selection Options
子标题,以获得可用于进一步优化或限定查询的选项列表。使用 Verify options
子标题下面列出的选项来指定要在查询的包中验证哪些特征。
如果一切都验证正确,就不会有输出。如果有任何不符之处,就会显示出来。输出由类似以下的行组成:
~]$ sudo rpm -V abrtS.5....T. c /etc/abrt/abrt.conf.M....... /var/spool/abrt-upload
输出的格式是一个由9个字符组成的字符串,后面跟着一个可选的属性标记和已处理文件的名称。
前9个字符是对文件执行的测试结果。每个测试都是将文件的一个属性与RPM数据库中记录的该属性的值进行比较。单个句点( .
)表示测试通过,问号字符( ?
)表示测试不能执行。下表列出了表示具体差异的符号:
RPM验证符号
Symbol | Description |
---|---|
S |
文件大小不同 |
M |
模式不同(包括权限和文件类型) |
5 |
摘要(以前的MD5和)不同 |
D |
设备主号/副号不匹配 |
L |
路径不匹配 |
U |
用户所有权不同 |
G |
组所有权不同 |
T |
mtime 不同 |
P |
能力不同 |
属性标记(如果存在)描述了给定文件的用途。下表列出了可用的属性标记:
RPM验证符号
Marker | Description |
---|---|
c |
配置文件 |
d |
文档文件 |
l |
许可文件 |
r |
自述文件 |
如果您看到任何输出,请使用您最好的判断来确定是应该删除该包、重新安装它,还是以其他方式修复该问题。
Finding and Verifying RPM Packages
在使用任何RPM包之前,您必须知道在哪里可以找到它们,并能够验证是否可以信任它们。
Finding RPM Packages
尽管Internet上有许多RPM存储库,但是出于安全和兼容性的原因,您应该考虑只安装官方的fedora提供的RPM包。下面是RPM包的源代码列表:
- 官方Fedora安装媒体。
- DNF包管理器附带的官方RPM存储库。有关如何使用官方Fedora包存储库的详细信息,请参阅DNF。
- 非正式的、与Fedora Project无关的第三方存储库也提供RPM包。
IMPORTANT
重要的
当考虑将第三方存储库与Fedora系统一起使用时,在将存储库作为包源添加之前,请密切关注存储库的网站上有关包兼容性的内容。替代的包存储库可能提供相同软件的不同的、不兼容的版本,包括已经包含在Fedora存储库中的包。
Checking Package Signatures
可以使用GNU Privacy Guard(或GPG)对RPM包进行签名,这可以帮助您确保下载的包是可信的。使用GPG,您可以验证文档的有效性,并对数据进行加密或解密。
要验证一个包没有被破坏或篡改,使用rpmkeys命令和 -K
(或--checksig
)选项检查它的GPG签名:
~]$ rpmkeys -K package.rpm
注意,DNF包管理器在安装和升级期间自动检查GPG签名。
GPG是默认安装的,还有一组用于验证包的红帽密钥。要导入其他密钥以与RPM一起使用,请参见导入GPG密钥(Importing GPG Keys)。
Importing GPG Keys
验证Red Hat软件包时,需要安装Red Hat GPG密钥。默认情况下会安装一组基本密钥。要查看已安装密钥的列表,请在shell提示符下执行以下命令:
~]$ rpm -qa gpg-pubkey*
要显示特定键的详细信息,请使用rpm -qi,后面跟着前面命令的输出。例如:
~]$ rpm -qi gpg-pubkey-fd431d51-4ae0493b
使用rpmkeys命令和 --import
选项安装一个用于RPM的新密钥。RPM GPG密钥的默认存放路径为 “/etc/pki/rpm-gpg/”
。要导入新的密钥,以 root
身份使用如下命令:
~]$ sudo rpmkeys --import /etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release
有关Red Hat包签名实践的更多信息,请参阅Red Hat客户门户上的产品签名(GPG)密钥(Product Signing (GPG) Keys)文章。
Common Examples of RPM Usage
RPM对于管理系统以及诊断和修复问题都是一个有用的工具。有关一些最常用选项的概述,请参阅以下示例。
-
要验证整个系统并查看丢失了哪些文件,以root身份发出以下命令:
rpm -Va
如果一些文件丢失或损坏,请考虑重新安装相关的包。
-
要确定哪个包拥有一个文件,输入:
rpm -qf file
-
要验证拥有特定文件的包,请以
root
身份输入:rpm -Vf file
-
要定位文件所属包中的文档文件,请输入:
rpm -qdf file
-
要查找有关(非安装的)包文件的信息,使用以下命令:
rpm -qip package.rpm
-
要列出包中包含的文件,请使用:
rpm -qlp package.rpm
查看rpm(8)手册页了解更多选项。
Additional Resources
RPM是一个复杂的实用程序,有许多用于查询、安装、升级和删除包的选项和方法。请参阅以下参考资料以了解有关RPM的更多信息。
安装文档
- rpm——help -该命令显示rpm参数的快速引用。
- rpm(8)—rpm手册页面提供了所有可用rpm参数的概述。
在线文档
- RPM网站- http://www.rpm.org/
- RPM邮件列表- http://lists.rpm.org/mailman/listinfo/rpm-list
另请参阅
- DNF介绍了如何使用DNF包管理器在命令行中搜索、安装、更新和卸载软件包。