rpm命令

rpm 命令 #

rpm(RPM Package Manager)是 Red Hat、Fedora、CentOS 等 Linux 发行版的底层包管理工具,用于安装、验证、查询、更新和移除软件包。它是 YUM 和 DNF 等高级包管理工具的基础,但不像它们那样能自动处理依赖关系。

语法 #

rpm [选项] [包...]

常用选项 #

一般选项 #

选项 描述
-v 显示详细信息
-h, --hash 显示进度条(哈希标记)
--quiet 安静模式,最小输出
--test 不实际执行,只测试并报告
--root 目录 使用指定目录作为根目录
--dbpath 目录 使用指定目录作为 RPM 数据库路径
--nosignature 不验证包签名
--nodigest 不验证包摘要

安装、升级和刷新选项 #

选项 描述
-i, --install 安装包
-U, --upgrade 升级包(如果不存在则安装)
-F, --freshen 升级包(仅当已安装旧版本时)
--reinstall 重新安装包
--nodeps 不检查依赖关系
--force 强制安装,忽略文件冲突和 RPM 版本冲突
--oldpackage 允许降级包
--replacefiles 替换来自其他包的文件
--replacepkgs 替换已安装的包
--excludedocs 不安装文档文件
--includedocs 安装文档文件
--noscripts 不执行安装脚本
--notriggers 不执行触发器脚本
--ignoresize 忽略文件系统空间检查

卸载选项 #

选项 描述
-e, --erase 移除包
--allmatches 移除所有匹配的包(可能有多个版本)
--noscripts 不执行卸载脚本
--notriggers 不执行触发器脚本
--nodeps 不检查依赖关系

查询选项 #

选项 描述
-q, --query 查询模式
-a, --all 查询所有已安装的包
-f, --file 文件 查询拥有指定文件的包
-p, --package 查询包文件而不是已安装的包
-i, --info 显示包信息
-l, --list 列出包中的文件
-d, --docfiles 列出文档文件
-c, --configfiles 列出配置文件
--scripts 列出安装脚本
--provides 列出包提供的功能
--requires 列出包的依赖
--changelog 显示包的变更日志
--dump 显示文件信息(大小、修改时间等)
--queryformat 格式 使用自定义格式显示查询结果

验证选项 #

选项 描述
-V, --verify 验证包
--nofiles 不验证文件属性
--nodigest 不验证包摘要
--nosignature 不验证包签名
--nodeps 不验证依赖关系
--noscripts 不执行验证脚本

签名选项 #

选项 描述
--import 导入公钥
--checksig 检查包签名
--resign 重新签名包
--addsign 添加签名到包

常见用法 #

1. 安装包 #

rpm -ivh package.rpm

-i表示安装,-v表示详细输出,-h表示显示进度条。

2. 升级包 #

rpm -Uvh package.rpm

如果包未安装,则会安装它。

3. 刷新包 #

rpm -Fvh package.rpm

只有当已安装旧版本时才会升级。

4. 移除包 #

rpm -e package_name

注意:使用包名而不是文件名。

5. 查询已安装的所有包 #

rpm -qa

6. 查询特定包是否已安装 #

rpm -q package_name

7. 查询包信息 #

rpm -qi package_name

8. 查询包文件 #

rpm -ql package_name

9. 查询包配置文件 #

rpm -qc package_name

10. 查询包文档文件 #

rpm -qd package_name

11. 查询包依赖 #

rpm -qR package_name

12. 查询包提供的功能 #

rpm -q --provides package_name

13. 查询拥有特定文件的包 #

rpm -qf /path/to/file

14. 查询未安装包的信息 #

rpm -qip package.rpm

15. 查询未安装包的文件列表 #

rpm -qlp package.rpm

16. 验证包 #

rpm -V package_name

17. 验证所有已安装的包 #

rpm -Va

18. 导入 RPM GPG 密钥 #

rpm --import /path/to/key.asc

或者:

rpm --import https://example.com/key.asc

19. 检查包签名 #

rpm --checksig package.rpm

高级用法 #

1. 不检查依赖关系安装包 #

rpm -ivh --nodeps package.rpm

这将强制安装包,即使它有未满足的依赖关系(不推荐)。

2. 强制安装包 #

rpm -ivh --force package.rpm

这将覆盖冲突的文件。

3. 降级包 #

rpm -Uvh --oldpackage package.rpm

这将安装旧版本的包,替换较新的版本。

4. 重新安装包 #

rpm -ivh --replacepkgs package.rpm

5. 不执行安装脚本 #

rpm -ivh --noscripts package.rpm

6. 使用自定义查询格式 #

rpm -qa --queryformat "%{NAME}-%{VERSION}-%{RELEASE} %{INSTALLTIME:date}\n"

这将显示包名、版本、发布版本和安装日期。

7. 提取 RPM 包内容而不安装 #

rpm2cpio package.rpm | cpio -idmv

这将提取包内容到当前目录。

8. 在不同根目录下安装 #

rpm -ivh --root=/mnt/sysimage package.rpm

这对于修复另一个系统很有用。

9. 查询包的变更日志 #

rpm -q --changelog package_name

10. 查询包的安装脚本 #

rpm -q --scripts package_name

11. 验证文件的完整性 #

rpm -Vf /path/to/file

12. 重建 RPM 数据库 #

rpm --rebuilddb

这将重建损坏的 RPM 数据库。

13. 验证包组 #

rpm -Vg "System Environment/Base"

14. 查询包的安装日期 #

rpm -q --qf "%{INSTALLTIME:date}\n" package_name

15. 查询包的大小 #

rpm -q --qf "%{SIZE}\n" package_name

验证输出解释 #

当使用rpm -V验证包时,输出格式为:

SM5DLUGT c filename

每个字母代表一种检查,如果检查失败,则显示相应的字母;如果检查通过,则显示.

  • S:文件大小不匹配
  • M:文件权限或类型不匹配
  • 5:MD5 校验和不匹配
  • D:设备不匹配
  • L:符号链接不匹配
  • U:用户所有权不匹配
  • G:组所有权不匹配
  • T:修改时间不匹配
  • c:这是一个配置文件

包命名约定 #

RPM 包通常遵循以下命名约定:

name-version-release.architecture.rpm

例如:

httpd-2.4.6-97.el7.centos.x86_64.rpm
  • httpd:包名
  • 2.4.6:版本号
  • 97.el7.centos:发布版本
  • x86_64:架构
  • .rpm:文件扩展名

配置文件 #

rpm 的主要配置文件和目录:

  • /var/lib/rpm/:RPM 数据库目录
  • /etc/rpm/:RPM 配置目录
  • /usr/lib/rpm/:RPM 宏和脚本目录
  • /etc/rpm/macros:系统级 RPM 宏
  • ~/.rpmmacros:用户级 RPM 宏

与 YUM/DNF 的关系 #

rpm是底层包管理工具,而yumdnf是构建在rpm之上的高级工具:

  • rpm不自动解决依赖关系,而 YUM/DNF 会
  • rpm只处理本地 RPM 文件,而 YUM/DNF 可以从仓库下载
  • rpm提供更底层的控制,而 YUM/DNF 提供更方便的用户界面
  • 通常建议使用 YUM/DNF,除非需要rpm的特定功能

提示 #

  • 使用yumdnf而不是rpm来安装包,以自动处理依赖关系
  • 使用rpm -qa | grep pattern可以搜索已安装的包
  • 使用rpm -qf $(which command)可以找出提供特定命令的包
  • 在修复损坏的系统时,rpm --rebuilddb是一个重要的命令
  • 使用rpm -qp --scripts package.rpm可以在安装前检查包的脚本
  • 在安装新的 RPM 文件前,先用rpm -qpR检查其依赖关系
  • 使用rpm -qa --last可以查看最近安装的包
  • 使用rpm -V定期验证关键系统包的完整性
  • 使用rpm2cpiocpio可以从 RPM 包中提取单个文件而不安装整个包
  • 在生产环境中,避免使用--nodeps--force选项,除非你完全了解后果