Linux命令-rpm(RedHat 包管理器 —— RPM 体系的基石命令) 🔰 简介 📖 语法 ⚙️ 选项 💡 示例 示例 1:安装 RPM 包(基本操作) 示例 2:升级软件包 示例 3:查询操作(日常最频繁使用的功能) 示例 4:查询文件来源和依赖关系 示例 5:卸载软件包 示例 6:验证已安装包 示例 7:实际运维场景 ⚠️ 注意 rpm vs yum vs dnf 对比 包名 vs 包文件名 GPG 签名验证 数据库修复 📝 总结 📚 相关命令 快速参考 :rpm(Red Hat Package Manager)是 RedHat 系 Linux 发行版(RHEL、CentOS、Fedora、Rocky Linux 等)最底层的软件包管理工具。它直接操作.rpm格式的二进制包文件和已安装的包数据库,提供安装、升级、卸载、查询、验证 五大核心功能。作为底层工具,rpm不会自动解决依赖关系——这一任务由上层工具yum(旧版)和dnf(新版)完成。
🔰 简介 RPM 诞生于 1997 年,经历了几十年的发展,如今 RPM v4 已经成为 RedHat 生态的软件分发标准。rpm命令是操作 RPM 包和数据库的通用接口,支持:
安装新的软件包(.rpm文件) 升级已有软件包 卸载软件包 查询包信息和文件归属 验证包的完整性和文件变更 rpm直接操作/var/lib/rpm/下的 Berkeley DB(或 SQLite,RHEL 9+)数据库。
安装位置与数据库 # rpm 命令本身 which rpm # 输出:/usr/bin/rpm # RPM 数据库位置 ls /var/lib/rpm/# 输出: # Basenames Conflictname Dirnames Group # Installtid Name Obsoletename Packages # Providename Requirename Sha1header Sigmd5 Triggername 📖 语法 rpm [选项] [包文件/包名...]操作模式分为五大类:
模式 选项特征 说明 安装/升级 -i,-U,-F安装或升级 RPM 包 卸载 -e删除已安装的包 查询 -q查询包信息和数据库 验证 -V验证已安装包的文件完整性 签名 -K验证 GPG 签名
⚙️ 选项 安装/升级选项 选项 说明 -i, --install安装新包 -U, --upgrade推荐 升级或安装(如果未装则安装,已装则升级)-F, --freshen仅升级已安装的包(未安装则跳过) -v, --verbose显示详细信息 -h, --hash显示进度条(#号) --force强制操作(覆盖已有文件/包) --nodeps危险 忽略依赖关系检查--test模拟运行,不实际安装 --replacepkgs重新安装已安装的包 --replacefiles覆盖属于其他包的文件 --oldpackage允许降级(安装比当前更旧的版本) --prefix 目录安装到指定的重定位目录
卸载选项 选项 说明 -e, --erase卸载包 --nodeps危险 忽略依赖,强制卸载--test模拟运行 --allmatches删除所有匹配版本
查询选项 选项 说明 -q, --query查询模式 -qa, --all列出所有已安装的包 -qi显示包的详细信息 -ql列出包安装的所有文件 -qc列出包的配置文件 -qd列出包的文档文件 -qf 文件查询某个文件属于哪个包 -qR查询包的依赖(Requires) -q --provides查询包提供的能力 --whatrequires 能力查询哪个包依赖了指定能力 -qp 包文件查询未安装的 .rpm 文件
验证选项 选项 说明 -V, --verify验证已安装的包 -Va验证所有已安装的包 -K, --checksig验证 RPM 包的 GPG 签名 --import 密钥文件导入 GPG 公钥
💡 示例 示例 1:安装 RPM 包(基本操作) # 标准安装(显示进度和详细信息) sudo rpm -ivh nginx-1.20.1-10.el7.x86_64.rpm# 输出: # Preparing... ################################# [100%] # Updating / installing... # 1:nginx-1:1.20.1-10.el7 ################################# [100%] # 模拟安装(测试依赖,不实际安装) sudo rpm -ivh --test package.rpm# 输出: # Preparing... ################################# [100%] # (如果依赖不满足会报错) # 从网络直接安装(结合 curl) curl -O https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpmsudo rpm -ivh epel-release-latest-7.noarch.rpm示例 2:升级软件包 # === -U 升级(推荐!无论是否已安装都能工作)=== # 情况1:之前没装过 nginx → 执行安装 # 情况2:之前已装 nginx 1.18 → 升级到 1.20 # 情况3:之前已装 nginx 1.20 → 重新安装 sudo rpm -Uvh nginx-1.20.1-10.el7.x86_64.rpm# 输出: # Preparing... ################################# [100%] # Updating / installing... # 1:nginx-1:1.20.1-10.el7 ################################# [100%] # Cleaning up / removing... # 2:nginx-1:1.18.0-2.el7 ################################# [100%] # === -F 仅升级(如果未安装则跳过)=== sudo rpm -Fvh httpd-2.4.6-97.el7.x86_64.rpm# 输出(如果未安装): # (no output) # 静默跳过 # 输出(如果已安装旧版本): # Updating: httpd-2.4.6-97.el7 # === 降级安装(比当前版本更旧)=== sudo rpm -Uvh --oldpackage old-package.rpm# 输出: # Preparing... [100%] # Updating: old-package-1.0.0 示例 3:查询操作(日常最频繁使用的功能) # 查询所有已安装的包 rpm -qa | wc -l # 输出:1423 rpm -qa | head -10 # 输出: # setup-2.8.71-11.el7.noarch # filesystem-3.2-25.el7.x86_64 # basesystem-10.0-7.el7.noarch # ... # 按名称查询已安装的包 rpm -q bash # 输出:bash-4.2.46-35.el7_9.x86_64 rpm -q python32 > /dev/null# 输出:python3-3.6.8-18.el7.x86_64 # 查询包的详细信息 rpm -qi bash # 输出: # Name : bash # Version : 4.2.46 # Release : 35.el7_9 # Architecture: x86_64 # Install Date: Mon 14 Jun 2026 10:22:33 AM CST # Group : System Environment/Shells # Size : 3656833 # License : GPLv3+ # Signature : RSA/SHA256, Wed 15 Apr 2026 08:00:00 AM CST # Source RPM : bash-4.2.46-35.el7_9.src.rpm # Build Date : Tue 14 Apr 2026 06:30:00 PM CST # Build Host : x86-01.bsys.centos.org # Relocations : (not relocatable) # Packager : CentOS BuildSystem <http://bugs.centos.org> # Vendor : CentOS # URL : http://www.gnu.org/software/bash # Summary : The GNU Bourne Again shell # Description : # The GNU Bourne Again shell (Bash) is a shell or command language # interpreter that is compatible with the Bourne shell (sh). # 列出包安装的所有文件 rpm -ql bash | head -10 # 输出: # /bin/bash # /bin/sh # /etc/skel/.bash_logout # /etc/skel/.bash_profile # /etc/skel/.bashrc # /usr/bin/bash # /usr/bin/bashbug-64 # /usr/share/doc/bash-4.2.46 # /usr/share/doc/bash-4.2.46/COPYING # /usr/share/info/bash.info.gz # 只查看配置文件 rpm -qc bash # 输出: # /etc/skel/.bash_logout # /etc/skel/.bash_profile # /etc/skel/.bashrc # 查看文档文件 rpm -qd bash | head -5 # 输出: # /usr/share/doc/bash-4.2.46/COPYING # /usr/share/info/bash.info.gz # /usr/share/man/man1/..1.gz # /usr/share/man/man1/bash.1.gz # /usr/share/man/man1/bashbug.1.gz 示例 4:查询文件来源和依赖关系 # 查询某个文件属于哪个包(反向查询) rpm -qf /usr/bin/vim# 输出:vim-enhanced-7.4.629-8.el7_9.x86_64 rpm -qf /etc/ssh/sshd_config# 输出:openssh-server-7.4p1-22.el7_9.x86_64 rpm -qf /lib64/libc.so.6# 输出:glibc-2.17-326.el7_9.x86_64 # 查询包的依赖关系(Requires) rpm -qR bash # 输出: # /bin/sh # config(bash) = 4.2.46-35.el7_9 # libc.so.6()(64bit) # libc.so.6(GLIBC_2.11)(64bit) # libdl.so.2()(64bit) # libtinfo.so.5()(64bit) # rpmlib(FileDigests) <= 4.6.0-1 # rpmlib(PayloadIsXz) <= 5.2-1 # 查询包提供的能力 rpm -q --provides bash # 输出: # /bin/bash # /bin/sh # bash = 4.2.46-35.el7_9 # bash(x86-64) = 4.2.46-35.el7_9 # config(bash) = 4.2.46-35.el7_9 # 查询谁依赖了指定能力 rpm -q --whatrequires "libcrypto.so.10()(64bit)" # 输出: # openssh-clients-7.4p1-22.el7_9.x86_64 # openssh-server-7.4p1-22.el7_9.x86_64 # wget-1.14-18.el7_6.1.x86_64 # ... (多个包) 示例 5:卸载软件包 # 安全卸载 sudo rpm -e nano # 输出(无错误 = 成功) # 带依赖检查的卸载 sudo rpm -e httpd# 输出(有依赖时不成功): # error: Failed dependencies: # httpd >= 2.2.0 is needed by (installed) gnome-user-share-0.31-4.el7.x86_64 # 模拟查看依赖关系后卸载 sudo rpm -e --test httpd# 输出:同样的 Failed dependencies 信息 # 查看依赖树,决定是否同时卸载 rpm -q --whatrequires httpd# 输出: # mod_ssl-2.4.6-97.el7.centos.x86_64 # php-7.2.24-1.el7.x86_64 # 逐步卸载 sudo rpm -e mod_ssl phpsudo rpm -e httpd# 输出: (成功) 示例 6:验证已安装包 # 验证单个包(检查文件是否被修改) rpm -V bash # 无输出 = 所有文件完好 # 输出示例(有改动时): # S.5....T. c /etc/bashrc # 标志含义: # S = 文件大小变化 # . = 模式未变 # 5 = MD5 校验和不匹配 # . = 设备号未变 # . = 用户未变 # . = 组未变 # T = 修改时间变化 # c = 这是配置文件 # 验证所有已安装包(耗时较长) sudo rpm -Va 2 > /dev/null| head -10 # 输出示例: # ..?...... /usr/bin/passwd # S.5....T. c /etc/ssh/sshd_config # ..?...... /usr/sbin/useradd # 验证 RPM 包文件本身的签名(安装前) rpm -K package.rpm# 输出: # package.rpm: rsa sha1 (md5) pgp md5 OK 示例 7:实际运维场景 # 场景1:查找最近安装的包 rpm -qa --last | head -10 # 输出: # kernel-3.10.0-1160.119.1.el7.x86_64 Sun 14 Jun 2026 03:12:45 AM CST # kernel-devel-3.10.0-1160.119.1.el7 Sun 14 Jun 2026 03:12:20 AM CST # docker-ce-20.10.24-3.el7.x86_64 Sat 13 Jun 2026 10:15:30 AM CST # ... # 场景2:查询包的总安装大小 rpm -qa --queryformat '%{SIZE} %{NAME}\n' | sort -rn | head -10 # 输出: # 311296000 kernel # 125829120 glibc-common # 83047232 kernel-devel # ... # 场景3:统计每个供应商的包数量 rpm -qa --queryformat '%{VENDOR}\n' | sort | uniq -c | sort -rn # 输出: # 789 CentOS # 45 Fedora Project # 12 (none) # 3 EPEL # ... # 场景4:导出已安装包列表(用于系统迁移) rpm -qa --queryformat '%{NAME}\n' > installed-packages.txtwc -l installed-packages.txt# 输出:1423 installed-packages.txt ⚠️ 注意 rpm vs yum vs dnf 对比 # === rpm(底层)=== # 优点:完全控制、离线安装、速度快 # 缺点:不自动处理依赖、需手动下载包 sudo rpm -ivh package.rpm# 输出(依赖不满足时): # error: Failed dependencies: # libfoo.so.1()(64bit) is needed by package-1.0.x86_64 # 需要手动逐个下载安装依赖包 # === yum(CentOS 7 及更早版本)=== # 优点:自动解决依赖、从仓库下载 # 缺点:速度较慢、需要网络 sudo yuminstall package# 输出: # Resolving Dependencies # --> Running transaction check # ---> Package package.x86_64 0:1.0-1.el7 will be installed # --> Processing Dependency: libfoo.so.1()(64bit) # ---> Package libfoo.x86_64 0:2.5-1.el7 will be installed # --> Finished Dependency Resolution # Dependencies Resolved # ======================================== # Package Arch Version Repository Size # ======================================== # Installing: # package x86_64 1.0-1.el7 epel 500k # Installing for dependencies: # libfoo x86_64 2.5-1.el7 base 200k # === dnf(CentOS 8+/Fedora/RHEL 8+)=== # 优点:yum 的现代替代,更快更准确 # 缺点:与 yum 命令兼容但内部完全不同 sudo dnfinstall package# 输出格式与 yum 类似,但底层性能更好 包名 vs 包文件名 # 包文件名:包含完整版本信息,用于安装未安装的包 # 格式:名称-版本-发行版.架构.rpm # 例:nginx-1.20.1-10.el7.x86_64.rpm # 包名:不含版本后缀,用于查询/卸载已安装的包 # 格式:名称 # 例:nginx # 安装时用文件名 sudo rpm -ivh nginx-1.20.1-10.el7.x86_64.rpm# 正确 # 查询/卸载时用包名 rpm -q nginx# 正确 sudo rpm -e nginx# 正确 GPG 签名验证 # 导入发行版官方 GPG 公钥 sudo rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7# 或从网络导入(CentOS 7) sudo rpm --import https://www.centos.org/keys/RPM-GPG-KEY-CentOS-7# EPEL 仓库公钥 sudo rpm --import https://dl.fedoraproject.org/pub/epel/RPM-GPG-KEY-EPEL-7# 查看已导入的所有密钥 rpm -qa gpg-pubkey*# 输出: # gpg-pubkey-f4a80eb5-53a7ff4b # gpg-pubkey-352c64e5-52ae6884 # 安装前验证 RPM 包签名 rpm -K --nosignature package.rpm# 输出:package.rpm: sha1 md5 OK 数据库修复 # RPM 数据库损坏时(常见于非正常关机) sudo rpm --rebuilddb # 输出(可能需要几分钟): # (无输出,后台重建数据库) # 恢复备份 sudo cp /var/lib/rpm.bak/* /var/lib/rpm/sudo rpm --rebuilddb # 检查数据库一致性 sudo rpm -qa > /dev/null# 如果无错误输出 = 数据库正常 📝 总结 rpm是 RedHat 生态包管理的基石,掌握它意味着能深度理解系统软件结构:
五大核心功能 :安装(-i)、升级(-U/-F)、卸载(-e)、查询(-q)、验证(-V)查询是日常最高频操作 :-qf找文件归属、-ql列文件列表、-qi查看信息、-qR看依赖依赖管理短板 :rpm不自动解决依赖 → 日常安装用yum/dnf,仅在离线或特殊场景用rpm数据库位置 :/var/lib/rpm/,--rebuilddb可修复损坏的数据库📚 相关命令 命令 说明 yumCentOS 7 及更早的上层包管理器(自动依赖) dnf推荐 CentOS 8+/Fedora/RHEL 8+ 新一代包管理器rpmbuild构建 RPM 包 rpm2cpio将 RPM 包转换为 cpio 归档 rpmsignRPM 包签名工具 rpmquery简化版 rpm 查询 rpmverify简化版 rpm 验证 rpmdbRPM 数据库管理