Linux命令-rpm(RedHat 包管理器 —— RPM 体系的基石命令)
📅 2026/7/13 13:04:41
👁️ 阅读次数
📝 编程学习
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 命令本身whichrpm# 输出:/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 包(基本操作)
# 标准安装(显示进度和详细信息)sudorpm-ivhnginx-1.20.1-10.el7.x86_64.rpm# 输出:# Preparing... ################################# [100%]# Updating / installing...# 1:nginx-1:1.20.1-10.el7 ################################# [100%]# 模拟安装(测试依赖,不实际安装)sudorpm-ivh--testpackage.rpm# 输出:# Preparing... ################################# [100%]# (如果依赖不满足会报错)# 从网络直接安装(结合 curl)curl-Ohttps://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpmsudorpm-ivhepel-release-latest-7.noarch.rpm示例 2:升级软件包
# === -U 升级(推荐!无论是否已安装都能工作)===# 情况1:之前没装过 nginx → 执行安装# 情况2:之前已装 nginx 1.18 → 升级到 1.20# 情况3:之前已装 nginx 1.20 → 重新安装sudorpm-Uvhnginx-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 仅升级(如果未安装则跳过)===sudorpm-Fvhhttpd-2.4.6-97.el7.x86_64.rpm# 输出(如果未安装):# (no output) # 静默跳过# 输出(如果已安装旧版本):# Updating: httpd-2.4.6-97.el7# === 降级安装(比当前版本更旧)===sudorpm-Uvh--oldpackageold-package.rpm# 输出:# Preparing... [100%]# Updating: old-package-1.0.0示例 3:查询操作(日常最频繁使用的功能)
# 查询所有已安装的包rpm-qa|wc-l# 输出:1423rpm-qa|head-10# 输出:# setup-2.8.71-11.el7.noarch# filesystem-3.2-25.el7.x86_64# basesystem-10.0-7.el7.noarch# ...# 按名称查询已安装的包rpm-qbash# 输出:bash-4.2.46-35.el7_9.x86_64rpm-qpython32>/dev/null# 输出:python3-3.6.8-18.el7.x86_64# 查询包的详细信息rpm-qibash# 输出:# 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-qlbash|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-qcbash# 输出:# /etc/skel/.bash_logout# /etc/skel/.bash_profile# /etc/skel/.bashrc# 查看文档文件rpm-qdbash|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_64rpm-qf/etc/ssh/sshd_config# 输出:openssh-server-7.4p1-22.el7_9.x86_64rpm-qf/lib64/libc.so.6# 输出:glibc-2.17-326.el7_9.x86_64# 查询包的依赖关系(Requires)rpm-qRbash# 输出:# /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--providesbash# 输出:# /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:卸载软件包
# 安全卸载sudorpm-enano# 输出(无错误 = 成功)# 带依赖检查的卸载sudorpm-ehttpd# 输出(有依赖时不成功):# error: Failed dependencies:# httpd >= 2.2.0 is needed by (installed) gnome-user-share-0.31-4.el7.x86_64# 模拟查看依赖关系后卸载sudorpm-e--testhttpd# 输出:同样的 Failed dependencies 信息# 查看依赖树,决定是否同时卸载rpm-q--whatrequireshttpd# 输出:# mod_ssl-2.4.6-97.el7.centos.x86_64# php-7.2.24-1.el7.x86_64# 逐步卸载sudorpm-emod_ssl phpsudorpm-ehttpd# 输出: (成功)示例 6:验证已安装包
# 验证单个包(检查文件是否被修改)rpm-Vbash# 无输出 = 所有文件完好# 输出示例(有改动时):# S.5....T. c /etc/bashrc# 标志含义:# S = 文件大小变化# . = 模式未变# 5 = MD5 校验和不匹配# . = 设备号未变# . = 用户未变# . = 组未变# T = 修改时间变化# c = 这是配置文件# 验证所有已安装包(耗时较长)sudorpm-Va2>/dev/null|head-10# 输出示例:# ..?...... /usr/bin/passwd# S.5....T. c /etc/ssh/sshd_config# ..?...... /usr/sbin/useradd# 验证 RPM 包文件本身的签名(安装前)rpm-Kpackage.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-linstalled-packages.txt# 输出:1423 installed-packages.txt⚠️ 注意
rpm vs yum vs dnf 对比
# === rpm(底层)===# 优点:完全控制、离线安装、速度快# 缺点:不自动处理依赖、需手动下载包sudorpm-ivhpackage.rpm# 输出(依赖不满足时):# error: Failed dependencies:# libfoo.so.1()(64bit) is needed by package-1.0.x86_64# 需要手动逐个下载安装依赖包# === yum(CentOS 7 及更早版本)===# 优点:自动解决依赖、从仓库下载# 缺点:速度较慢、需要网络sudoyuminstallpackage# 输出:# 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 命令兼容但内部完全不同sudodnfinstallpackage# 输出格式与 yum 类似,但底层性能更好包名 vs 包文件名
# 包文件名:包含完整版本信息,用于安装未安装的包# 格式:名称-版本-发行版.架构.rpm# 例:nginx-1.20.1-10.el7.x86_64.rpm# 包名:不含版本后缀,用于查询/卸载已安装的包# 格式:名称# 例:nginx# 安装时用文件名sudorpm-ivhnginx-1.20.1-10.el7.x86_64.rpm# 正确# 查询/卸载时用包名rpm-qnginx# 正确sudorpm-enginx# 正确GPG 签名验证
# 导入发行版官方 GPG 公钥sudorpm--import/etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7# 或从网络导入(CentOS 7)sudorpm--importhttps://www.centos.org/keys/RPM-GPG-KEY-CentOS-7# EPEL 仓库公钥sudorpm--importhttps://dl.fedoraproject.org/pub/epel/RPM-GPG-KEY-EPEL-7# 查看已导入的所有密钥rpm-qagpg-pubkey*# 输出:# gpg-pubkey-f4a80eb5-53a7ff4b# gpg-pubkey-352c64e5-52ae6884# 安装前验证 RPM 包签名rpm-K--nosignaturepackage.rpm# 输出:package.rpm: sha1 md5 OK数据库修复
# RPM 数据库损坏时(常见于非正常关机)sudorpm--rebuilddb# 输出(可能需要几分钟):# (无输出,后台重建数据库)# 恢复备份sudocp/var/lib/rpm.bak/* /var/lib/rpm/sudorpm--rebuilddb# 检查数据库一致性sudorpm-qa>/dev/null# 如果无错误输出 = 数据库正常📝 总结
rpm是 RedHat 生态包管理的基石,掌握它意味着能深度理解系统软件结构:
- 五大核心功能:安装(
-i)、升级(-U/-F)、卸载(-e)、查询(-q)、验证(-V) - 查询是日常最高频操作:
-qf找文件归属、-ql列文件列表、-qi查看信息、-qR看依赖 - 依赖管理短板:
rpm不自动解决依赖 → 日常安装用yum/dnf,仅在离线或特殊场景用rpm - 数据库位置:
/var/lib/rpm/,--rebuilddb可修复损坏的数据库
📚 相关命令
| 命令 | 说明 |
|---|---|
yum | CentOS 7 及更早的上层包管理器(自动依赖) |
dnf | 推荐CentOS 8+/Fedora/RHEL 8+ 新一代包管理器 |
rpmbuild | 构建 RPM 包 |
rpm2cpio | 将 RPM 包转换为 cpio 归档 |
rpmsign | RPM 包签名工具 |
rpmquery | 简化版 rpm 查询 |
rpmverify | 简化版 rpm 验证 |
rpmdb | RPM 数据库管理 |
编程学习
技术分享
实战经验