CentOS 中 rpm 与 yum 的关系及依赖查看 以及卸载等常用命令

一. 引言

在 CentOS(以及 Red Hat 系 Linux 发行版)中,rpmyum 是两个最核心的包管理工具。很多初学者常常混淆二者的角色,也不知道如何查看一个软件包的依赖关系,或者如何干净地卸载软件包。本文将深入浅出地解释 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 查看依赖包和卸载

| amzn2amzn2023 | Amazon Linux 2 / 2023 |

| oc8oc9 | 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 处理器
i686i386 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 文件,三步即可判断能否安全安装:

  1. 看 arch ------是否与当前系统架构一致?不确定时执行 uname -m 查看。
  2. 看 dist tag ------是否匹配当前系统?执行 cat /etc/os-release 辅助判断。
  3. 如果不完全匹配 ------优先查找同一包名且对应正确 dist tag / arch 的包;没有时再谨慎尝试 rpm -ivh --nodeps,并准备手动处理潜在冲突。

四. 使用 rpm 查看依赖包和卸载

尽管 rpm 不擅长解决依赖,但它提供了强大的查询功能来查看包的依赖关系。

4.1 查看已安装包的依赖

使用 rpm -qRrpm -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

典型输出中会包含 httpdhttpd-toolsmod_ssl 等,这些包原本随 httpd 安装且无其他包依赖,yum 便自动将它们一并清除。

与 rpm 不同,yum 会尽量不留孤立的依赖包,因此比直接使用 rpm -e 更安全、更干净。

6.5 yum 卸载的高级技巧

  • 模拟卸载(不真正执行) :在不确定影响范围时,先用 --assumeno 进行模拟,查看 yum 即将执行的操作列表:

    bash 复制代码
    yum remove --assumeno package_name

    或者使用 yum remove --setopt=tsflags=test,也不会真正删除任何包。

  • 回滚卸载:如果误删了包,可以通过 yum 事务历史进行回滚。首先查看历史:

    bash 复制代码
    yum history

    找到对应的卸载事务 ID(通常带有 "Erase" 标记),然后执行:

    bash 复制代码
    yum 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.10libssl.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

树状图能让你清晰看到:pcre2openssl-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-modulesnginx-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. 总结