一. 引言
在 CentOS(以及 Red Hat 系 Linux 发行版)中,rpm 和 yum 是两个最核心的包管理工具。很多初学者常常混淆二者的角色,也不知道如何查看一个软件包的依赖关系,或者如何干净地卸载软件包。本文将深入浅出地解释 rpm 与 yum 的关系,并通过实例演示如何用它们查看安装包的依赖包以及执行卸载操作。
二. rpm 与 yum 的关系
2.1 rpm:底层的包管理器
rpm (Red Hat Package Manager)是一种底层的包管理工具,它直接操作 .rpm 包文件。你可以把它理解为"手动挡"汽车------你需要自己处理依赖关系。日常常见的 rpm 操作包括:
- 安装单个包:
rpm -ivh package.rpm - 升级包:
rpm -Uvh package.rpm - 卸载包:
rpm -e package_name - 查询已安装包:
rpm -qa
但 rpm 有一个致命弱点:无法自动解决依赖关系。如果你尝试安装一个缺少依赖的包,rpm 会直接报错并终止安装。
2.2 yum:上层智能依赖管理工具
yum (Yellowdog Updater Modified)则是一种更高级的包管理工具,它基于 rpm 构建,并提供了自动依赖解析的能力。你可以把它比作"自动挡"汽车------你只需要告诉它要安装哪个包,yum 会自动从配置的软件仓库(repository)中下载所需的依赖包,并按正确顺序安装。
yum 并不是 rpm 的替代品,而是对 rpm 的增强和自动化。 所有通过 yum 的安装、更新、卸载操作,最终仍然是调用 rpm 来完成底层的包管理事务。
2.3 关键区别总结
| 特性 | rpm | yum |
|---|---|---|
| 依赖解析 | 无,需手动处理 | 自动从仓库解析依赖 |
| 网络依赖 | 通常操作本地 .rpm 文件 | 需要连接软件仓库 |
| 仓库管理 | 不支持 | 支持添加/启用/禁用仓库 |
| 事务回滚 | 无 | 支持(yum history undo) |
| 适用场景 | 离线环境、单个包安装 | 日常在线安装、系统更新 |
2.4. 使用 rpm 查看依赖包和卸载
| amzn2、amzn2023 | Amazon Linux 2 / 2023 |
| oc8、oc9 | Oracle Linux 8 / 9 |
因此 nginx-1.20.1-9.el7.x86_64.rpm 中的 el7 表示:该包是专为 RHEL / CentOS 7 编译的。
重要提醒 :混用不同发行版的 rpm 包(例如在 CentOS 7 上强制安装标记为
fc36的包)极大概率因底层库 ABI 不兼容而失败,即使名字相同也不行。
三 常见的架构标识(arch)
| arch | 说明 |
|---|---|
x86_64(或 amd64) |
64 位 Intel/AMD 处理器 |
i686、i386 |
32 位 Intel/AMD 处理器 |
aarch64(或 arm64) |
ARM 64 位(如麒麟、鲲鹏) |
noarch |
平台无关(纯脚本/配置文件/文档) |
ppc64le |
IBM POWER 小端架构 |
src |
源码包(.src.rpm) |
3.1 使用 rpm 命令查询包名规则
当使用 rpm 命令操作已安装的包时,不需要提供完整的 .rpm 文件名 ,而是使用 包名(即 name 字段):
bash
# 查看 nginx 包的完整标识(名称-版本-发行版.架构)
rpm -q nginx
可能的输出:
txt
nginx-1.20.1-9.el7.x86_64
这个字符串称为 NVR (Name-Version-Release),加上架构就是 NVRA。日常卸载、查询等操作只需用到包名(name):
bash
rpm -e nginx # 正确:只需包名
rpm -e nginx-1.20.1 # 错误:卸载时必须用包名,不是 NVR
3.2 快速判断包的适用平台
面对一个 .rpm 文件,三步即可判断能否安全安装:
- 看 arch ------是否与当前系统架构一致?不确定时执行
uname -m查看。 - 看 dist tag ------是否匹配当前系统?执行
cat /etc/os-release辅助判断。 - 如果不完全匹配 ------优先查找同一包名且对应正确 dist tag / arch 的包;没有时再谨慎尝试
rpm -ivh --nodeps,并准备手动处理潜在冲突。
四. 使用 rpm 查看依赖包和卸载
尽管 rpm 不擅长解决依赖,但它提供了强大的查询功能来查看包的依赖关系。
4.1 查看已安装包的依赖
使用 rpm -qR 或 rpm -q --requires 可以列出某个已安装包运行所需要的依赖(即"这个包依赖哪些库/包"):
bash
rpm -qR httpd
输出示例(部分):
libc.so.6()(64bit)
libpcre2-8.so.0()(64bit)
/bin/sh
...
4.2 查看未安装的 .rpm 包的依赖
如果你有一个下载好的 .rpm 文件,可以用 -qpR 查看它需要什么依赖:
bash
rpm -qpR some-package.rpm
4.3 查看哪些包依赖了指定包
反向查询------想知道系统中哪些包依赖了某个组件(例如某个库)------可以使用 rpm -q --whatrequires:
bash
rpm -q --whatrequires libc.so.6
4.4 使用 rpm 卸载包
卸载一个已安装的包:
bash
rpm -e package_name
⚠️ 注意:如果该包被其他包依赖,rpm 将拒绝卸载并提示依赖错误。此时你有两种选择:
- 先手动卸载那些依赖它的包(可能导致连锁反应)。
- 使用
--nodeps参数强制忽略依赖(危险,可能导致系统不稳定):
bash
rpm -e --nodeps package_name
4.5. 处理依赖冲突(特殊情况)**
如果卸载时系统提示存在依赖冲突(如 error: Failed dependencies),在确保不会影响其他软件正常运行的前提下,可以使用 --nodeps 选项忽略依赖关系进行强制卸载(请谨慎使用):
bash
sudo rpm -e --nodeps nginx
```<websource>source_group_web_4</websource>
#### . 清理残留文件(可选)
RPM 卸载命令通常不会删除用户修改过的配置文件。如果希望彻底清除,可以手动删除相关的配置和日志目录:
```bash
sudo rm -rf /etc/nginx/
sudo rm -rf /var/log/nginx
```<
#### . 验证卸载结果
最后,可以通过查询命令确认 Nginx 是否已被成功卸载。如果命令没有返回任何结果,说明卸载已完成:
```bash
rpm -qa | grep nginx
``
### 五、 rpm 常用命令
#### 一、安装类
bash
运行
# 安装rpm包
```bash
rpm -ivh 软件包.rpm
bash
# 忽略依赖强制安装(不推荐,容易出问题)
rpm -ivh --nodeps 软件包.rpm
bash
# 升级软件
rpm -Uvh 软件包.rpm
bash
# 只安装新版本,旧版本不存在就不装
rpm -Fvh 软件包.rpm
参数说明:
-i install 安装
-U update 升级
-F freshen 更新
-v 显示详细信息
-h 打印进度条
二、查询类(最常用)
bash
运行
bash
# 查询本机所有已安装软件
rpm -qa
bash
# 过滤查找某个软件
rpm -qa | grep httpd
bash
# 查询某个软件是否安装
rpm -q httpd
bash
# 查看软件安装到哪些目录
rpm -ql httpd
bash
# 查看软件配置文件位置
rpm -qc httpd
bash
# 查看软件文档路径
rpm -qd httpd
bash
# 查看软件依赖关系
rpm -qR httpd
bash
# 查看某个文件属于哪个rpm包
rpm -qf /usr/bin/ls
三、校验类
bash
运行
bash
# 校验文件是否被篡改、丢失
rpm -V 软件名
出现字母代表文件被改动。
四、卸载类
bash
运行
bash
# 正常卸载
rpm -e 软件名
bash
# 忽略依赖强制卸载
rpm -e --nodeps 软件名
五、对未安装的 rpm 包进行查询(本地文件)
bash
运行
bash
# 查看离线rpm包里的文件列表
rpm -qlp xxx.rpm
bash
# 查看离线包的依赖
rpm -qRp xxx.rpm
bash
# 查看离线包信息
rpm -qip xxx.rpm
速记口诀
-qa 查所有
-ql 查路径
-qf 查归属
-qR 查依赖
-ivh 安装
-e 卸载
带 p 就是操作未安装的 rpm 文件。
bash
# 4. 安装所有 RPM 包
rpm -ivh *.rpm --force --nodeps
六. 使用 yum 查看依赖包和卸载
yum 在处理依赖关系时更为人性化,它不仅会自动管理依赖,还能清晰地展示依赖树。熟练掌握 yum 的依赖查询与卸载命令,是每个 CentOS 用户必备的技能。
6.1 查看包的依赖信息
yum deplist 命令可以展示一个包的依赖列表及其提供者:
bash
yum deplist httpd
输出会按 "provider" 分组,告诉你该依赖应该由哪个包来满足。对于头绪复杂的依赖链,这个命令能帮你快速理清运行环境要求。
6.2 查看包的依赖关系树(更直观)
在较新的 yum 实现(CentOS 7 及以后,或使用 dnf 替换)中,可使用 repoquery 工具以树状形式显示依赖结构,一目了然:
bash
repoquery --requires --tree httpd
如果系统默认未安装 yum-utils,需要先执行:
bash
yum install yum-utils -y
repoquery 是排查依赖冲突、评估升级影响时的利器,强烈建议安装。
6.3 反向查询:哪些包依赖了某个组件
同样使用 repoquery 的 --whatrequires 参数,可以查看到底有哪些包直接依赖了特定包或库:
bash
repoquery --whatrequires httpd
这会列出所有将 httpd 作为依赖项的包,方便你评估删除某个组件可能带来的连锁影响。
6.4 使用 yum 卸载包
yum 的卸载命令是 yum remove,它会自动处理依赖关系:
bash
yum remove package_name
yum 会先分析依赖树,列出所有将被删除的包,其中包括目标包本身,以及那些只被目标包依赖、不再被其他包需要的依赖(即"依赖清理")。确认无误后输入 y 即可。
示例:卸载 httpd
bash
yum remove httpd
典型输出中会包含 httpd、httpd-tools、mod_ssl 等,这些包原本随 httpd 安装且无其他包依赖,yum 便自动将它们一并清除。
与 rpm 不同,yum 会尽量不留孤立的依赖包,因此比直接使用 rpm -e 更安全、更干净。
6.5 yum 卸载的高级技巧
-
模拟卸载(不真正执行) :在不确定影响范围时,先用
--assumeno进行模拟,查看 yum 即将执行的操作列表:bashyum remove --assumeno package_name或者使用
yum remove --setopt=tsflags=test,也不会真正删除任何包。 -
回滚卸载:如果误删了包,可以通过 yum 事务历史进行回滚。首先查看历史:
bashyum history找到对应的卸载事务 ID(通常带有 "Erase" 标记),然后执行:
bashyum history undo <ID>这样 yum 会反向操作,把删除的包及其依赖重新安装回来,是运维过程中非常实用的保险。
七. 实战案例:查看与卸载 Nginx 及其依赖
下面以 Nginx 为例,演示一套完整的依赖查看与卸载流程。假设你的 CentOS 服务器上已经通过 yum 安装了 Nginx,现在需要评估它的运行依赖、理解连锁影响,并最终干净卸载。
7.1 场景确认:检查 Nginx 安装状态
首先确认 Nginx 是否已安装,以及当前版本:
bash
rpm -q nginx
典型输出:
text
nginx-1.20.1-10.el7.x86_64
可以看到这是一份针对 CentOS 7(el7)、架构为 x86_64 的 Nginx 包。如果命令报错 package nginx is not installed,则说明系统上并未安装 Nginx,无需继续后续卸载步骤。
7.2 使用 rpm 查看 Nginx 的依赖
用 rpm -qR 查看 Nginx 运行所需的核心依赖:
bash
rpm -qR nginx
输出示例(节选):
text
/bin/sh
libc.so.6()(64bit)
libcrypto.so.10()(64bit)
libpcre2-8.so.0()(64bit)
libssl.so.10()(64bit)
libz.so.1()(64bit)
...
这些依赖中,libc.so.6(glibc)、/bin/sh(shell)属于系统基础组件,几乎所有包都依赖它们;而 libcrypto.so.10、libssl.so.10(来自 OpenSSL)和 libpcre2-8.so.0(正则表达式库)则是 Nginx 特有的运行依赖,在卸载时需要留意它们是否还被其他包使用。
7.3 使用 yum 查看 Nginx 的依赖关系树
yum 提供了比 rpm 更直观的依赖视图。先确保安装了 yum-utils:
bash
yum install yum-utils -y
然后生成依赖树:
bash
repoquery --requires --tree nginx
输出大致如下(简化):
text
nginx-1.20.1-10.el7.x86_64
├── systemd
├── libc.so.6()(64bit)
│ └── glibc-2.17-326.el7.x86_64
├── libpcre2-8.so.0()(64bit)
│ └── pcre2-10.23-2.el7.x86_64
├── libssl.so.10()(64bit)
│ └── openssl-libs-1.0.2k-26.el7.x86_64
└── libcrypto.so.10()(64bit)
└── openssl-libs-1.0.2k-26.el7.x86_64
树状图能让你清晰看到:pcre2 和 openssl-libs 是 Nginx 的关键下层依赖。如果卸载 Nginx 时这些库没有其他包在使用,yum 会一并清理它们。
7.4 反向查询:哪些包依赖了 Nginx
在卸载之前,需要确认 Nginx 自身没有被其他包所依赖(比如某些监控插件或 Web 面板可能依赖 Nginx):
bash
rpm -q --whatrequires nginx
如果输出为空,说明 Nginx 是独立包,没有被其他组件依赖,卸载不会引发连锁问题。如果出现了其他包名,则需要先评估这些依赖方的状态,再决定是否继续卸载。
bash
repoquery --whatrequires nginx
repoquery 的查询范围更广(涵盖仓库中的包),可以帮你提前发现潜在冲突。
7.5 正式卸载 Nginx(推荐使用 yum)
确认无误后,使用 yum 执行安全卸载:
bash
yum remove nginx
yum 会列出所有将随 Nginx 一同被删除的包(例如 nginx-all-modules、nginx-filesystem 等),等待你确认:
text
Dependencies Resolved
================================================================================
Package Arch Version Repository Size
================================================================================
Removing:
nginx x86_64 1.20.1-10.el7 @epel 1.2 M
Removing dependent packages:
nginx-all-modules noarch 1.20.1-10.el7 @epel 0.0
nginx-filesystem noarch 1.20.1-10.el7 @epel 0.0
Transaction Summary
================================================================================
Remove 3 Packages
输入 y 确认后,yum 会自动清理这些包以及不再被其他包需要的依赖。
建议 :在不确定影响范围时,先用
yum remove --assumeno nginx模拟执行,查看操作列表但不会真正删除任何包。
7.6 使用 rpm 卸载 Nginx(不推荐日常使用)
如果出于某些原因必须用 rpm 直接卸载:
bash
rpm -e nginx
若 Nginx 被其他包依赖,rpm 会拒绝卸载并报错。此时切勿 贸然使用 --nodeps,除非你完全清楚自己在做什么------强制忽略依赖可能导致依赖方崩溃。
6.7 验证卸载结果
卸载完成后,确认 Nginx 已彻底清除:
bash
rpm -q nginx
期望输出:
text
package nginx is not installed
再检查是否残留无用的依赖包:
bash
yum autoremove
这一步会清除那些原本随 Nginx 安装、现在已无其他包使用的孤立依赖,保持系统整洁。
通过这个实战案例可以看到:yum 贯穿始终,从依赖分析到安全卸载一气呵成,而 rpm 更适用于快速查询和底层的精细操作。两者各司其职,配合使用才是 CentOS 运维的正确姿态。
7. 总结

