CentOS 中 rpm 与 yum 的关系及依赖查看 以及卸载等常用命令
一. 引言在 CentOS以及 Red Hat 系 Linux 发行版中rpm和yum是两个最核心的包管理工具。很多初学者常常混淆二者的角色也不知道如何查看一个软件包的依赖关系或者如何干净地卸载软件包。本文将深入浅出地解释 rpm 与 yum 的关系并通过实例演示如何用它们查看安装包的依赖包以及执行卸载操作。二. rpm 与 yum 的关系2.1 rpm底层的包管理器rpmRed Hat Package Manager是一种底层的包管理工具它直接操作.rpm包文件。你可以把它理解为“手动挡”汽车——你需要自己处理依赖关系。日常常见的 rpm 操作包括安装单个包rpm -ivh package.rpm升级包rpm -Uvh package.rpm卸载包rpm -e package_name查询已安装包rpm -qa但 rpm 有一个致命弱点无法自动解决依赖关系。如果你尝试安装一个缺少依赖的包rpm 会直接报错并终止安装。2.2 yum上层智能依赖管理工具yumYellowdog Updater Modified则是一种更高级的包管理工具它基于 rpm 构建并提供了自动依赖解析的能力。你可以把它比作“自动挡”汽车——你只需要告诉它要安装哪个包yum 会自动从配置的软件仓库repository中下载所需的依赖包并按正确顺序安装。yum 并不是 rpm 的替代品而是对 rpm 的增强和自动化。所有通过 yum 的安装、更新、卸载操作最终仍然是调用 rpm 来完成底层的包管理事务。2.3 关键区别总结特性rpmyum依赖解析无需手动处理自动从仓库解析依赖网络依赖通常操作本地 .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 不兼容而失败即使名字相同也不行。三 常见的架构标识archarch说明x86_64或amd6464 位 Intel/AMD 处理器i686、i38632 位 Intel/AMD 处理器aarch64或arm64ARM 64 位如麒麟、鲲鹏noarch平台无关纯脚本/配置文件/文档ppc64leIBM POWER 小端架构src源码包.src.rpm3.1 使用 rpm 命令查询包名规则当使用rpm命令操作已安装的包时不需要提供完整的.rpm文件名而是使用包名即 name 字段# 查看 nginx 包的完整标识名称-版本-发行版.架构rpm-qnginx可能的输出nginx-1.20.1-9.el7.x86_64这个字符串称为NVRName-Version-Release加上架构就是NVRA。日常卸载、查询等操作只需用到包名namerpm-enginx# 正确只需包名rpm-enginx-1.20.1# 错误卸载时必须用包名不是 NVR3.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可以列出某个已安装包运行所需要的依赖即“这个包依赖哪些库/包”rpm-qRhttpd输出示例部分libc.so.6()(64bit) libpcre2-8.so.0()(64bit) /bin/sh ...4.2 查看未安装的 .rpm 包的依赖如果你有一个下载好的 .rpm 文件可以用-qpR查看它需要什么依赖rpm-qpRsome-package.rpm4.3 查看哪些包依赖了指定包反向查询——想知道系统中哪些包依赖了某个组件例如某个库——可以使用rpm -q --whatrequiresrpm-q--whatrequireslibc.so.64.4 使用 rpm 卸载包卸载一个已安装的包rpm-epackage_name⚠️注意如果该包被其他包依赖rpm 将拒绝卸载并提示依赖错误。此时你有两种选择先手动卸载那些依赖它的包可能导致连锁反应。使用--nodeps参数强制忽略依赖危险可能导致系统不稳定rpm-e--nodepspackage_name4.5. 处理依赖冲突特殊情况**如果卸载时系统提示存在依赖冲突如error: Failed dependencies在确保不会影响其他软件正常运行的前提下可以使用--nodeps选项忽略依赖关系进行强制卸载请谨慎使用sudorpm-e--nodepsnginx websourcesource_group_web_4/websource#### . 清理残留文件可选RPM 卸载命令通常不会删除用户修改过的配置文件。如果希望彻底清除可以手动删除相关的配置和日志目录bashsudorm-rf/etc/nginx/sudorm-rf/var/log/nginx#### . 验证卸载结果最后可以通过查询命令确认 Nginx 是否已被成功卸载。如果命令没有返回任何结果说明卸载已完成bashrpm-qa|grepnginx### 五、 rpm 常用命令#### 一、安装类bash运行# 安装rpm包bashrpm-ivh软件包.rpm# 忽略依赖强制安装不推荐容易出问题rpm-ivh--nodeps软件包.rpm# 升级软件rpm-Uvh软件包.rpm# 只安装新版本旧版本不存在就不装rpm-Fvh软件包.rpm参数说明-i install 安装-U update 升级-F freshen 更新-v 显示详细信息-h 打印进度条二、查询类最常用bash运行# 查询本机所有已安装软件rpm-qa# 过滤查找某个软件rpm-qa|grephttpd# 查询某个软件是否安装rpm-qhttpd# 查看软件安装到哪些目录rpm-qlhttpd# 查看软件配置文件位置rpm-qchttpd# 查看软件文档路径rpm-qdhttpd# 查看软件依赖关系rpm-qRhttpd# 查看某个文件属于哪个rpm包rpm-qf/usr/bin/ls三、校验类bash运行# 校验文件是否被篡改、丢失rpm-V软件名出现字母代表文件被改动。四、卸载类bash运行# 正常卸载rpm-e软件名# 忽略依赖强制卸载rpm-e--nodeps软件名五、对未安装的 rpm 包进行查询本地文件bash运行# 查看离线rpm包里的文件列表rpm-qlpxxx.rpm# 查看离线包的依赖rpm-qRpxxx.rpm# 查看离线包信息rpm-qipxxx.rpm速记口诀-qa 查所有-ql 查路径-qf 查归属-qR 查依赖-ivh 安装-e 卸载带 p 就是操作未安装的 rpm 文件。# 4. 安装所有 RPM 包rpm-ivh*.rpm--force--nodeps六. 使用 yum 查看依赖包和卸载yum 在处理依赖关系时更为人性化它不仅会自动管理依赖还能清晰地展示依赖树。熟练掌握 yum 的依赖查询与卸载命令是每个 CentOS 用户必备的技能。6.1 查看包的依赖信息yum deplist命令可以展示一个包的依赖列表及其提供者yum deplist httpd输出会按 “provider” 分组告诉你该依赖应该由哪个包来满足。对于头绪复杂的依赖链这个命令能帮你快速理清运行环境要求。6.2 查看包的依赖关系树更直观在较新的 yum 实现CentOS 7 及以后或使用dnf替换中可使用repoquery工具以树状形式显示依赖结构一目了然repoquery--requires--treehttpd如果系统默认未安装yum-utils需要先执行yuminstallyum-utils-yrepoquery是排查依赖冲突、评估升级影响时的利器强烈建议安装。6.3 反向查询哪些包依赖了某个组件同样使用repoquery的--whatrequires参数可以查看到底有哪些包直接依赖了特定包或库repoquery--whatrequireshttpd这会列出所有将httpd作为依赖项的包方便你评估删除某个组件可能带来的连锁影响。6.4 使用 yum 卸载包yum 的卸载命令是yum remove它会自动处理依赖关系yum remove package_nameyum 会先分析依赖树列出所有将被删除的包其中包括目标包本身以及那些只被目标包依赖、不再被其他包需要的依赖即“依赖清理”。确认无误后输入y即可。示例卸载 httpdyum remove httpd典型输出中会包含httpd、httpd-tools、mod_ssl等这些包原本随 httpd 安装且无其他包依赖yum 便自动将它们一并清除。与 rpm 不同yum 会尽量不留孤立的依赖包因此比直接使用rpm -e更安全、更干净。6.5 yum 卸载的高级技巧模拟卸载不真正执行在不确定影响范围时先用--assumeno进行模拟查看 yum 即将执行的操作列表yum remove--assumenopackage_name或者使用yum remove --setopttsflagstest也不会真正删除任何包。回滚卸载如果误删了包可以通过 yum 事务历史进行回滚。首先查看历史yumhistory找到对应的卸载事务 ID通常带有 “Erase” 标记然后执行yumhistoryundoID这样 yum 会反向操作把删除的包及其依赖重新安装回来是运维过程中非常实用的保险。七. 实战案例查看与卸载 Nginx 及其依赖下面以 Nginx 为例演示一套完整的依赖查看与卸载流程。假设你的 CentOS 服务器上已经通过 yum 安装了 Nginx现在需要评估它的运行依赖、理解连锁影响并最终干净卸载。7.1 场景确认检查 Nginx 安装状态首先确认 Nginx 是否已安装以及当前版本rpm-qnginx典型输出nginx-1.20.1-10.el7.x86_64可以看到这是一份针对 CentOS 7el7、架构为x86_64的 Nginx 包。如果命令报错package nginx is not installed则说明系统上并未安装 Nginx无需继续后续卸载步骤。7.2 使用 rpm 查看 Nginx 的依赖用rpm -qR查看 Nginx 运行所需的核心依赖rpm-qRnginx输出示例节选/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.6glibc、/bin/shshell属于系统基础组件几乎所有包都依赖它们而libcrypto.so.10、libssl.so.10来自 OpenSSL和libpcre2-8.so.0正则表达式库则是 Nginx 特有的运行依赖在卸载时需要留意它们是否还被其他包使用。7.3 使用 yum 查看 Nginx 的依赖关系树yum 提供了比 rpm 更直观的依赖视图。先确保安装了yum-utilsyuminstallyum-utils-y然后生成依赖树repoquery--requires--treenginx输出大致如下简化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 面板可能依赖 Nginxrpm-q--whatrequiresnginx如果输出为空说明 Nginx 是独立包没有被其他组件依赖卸载不会引发连锁问题。如果出现了其他包名则需要先评估这些依赖方的状态再决定是否继续卸载。repoquery--whatrequiresnginxrepoquery的查询范围更广涵盖仓库中的包可以帮你提前发现潜在冲突。7.5 正式卸载 Nginx推荐使用 yum确认无误后使用 yum 执行安全卸载yum remove nginxyum 会列出所有将随 Nginx 一同被删除的包例如nginx-all-modules、nginx-filesystem等等待你确认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 直接卸载rpm-enginx若 Nginx 被其他包依赖rpm 会拒绝卸载并报错。此时切勿贸然使用--nodeps除非你完全清楚自己在做什么——强制忽略依赖可能导致依赖方崩溃。6.7 验证卸载结果卸载完成后确认 Nginx 已彻底清除rpm-qnginx期望输出package nginx is not installed再检查是否残留无用的依赖包yum autoremove这一步会清除那些原本随 Nginx 安装、现在已无其他包使用的孤立依赖保持系统整洁。通过这个实战案例可以看到yum 贯穿始终从依赖分析到安全卸载一气呵成而 rpm 更适用于快速查询和底层的精细操作。两者各司其职配合使用才是 CentOS 运维的正确姿态。7. 总结