CentOS/Rocky Linux中,yum在7及更早版是原生工具,8+版中仅为dnf的符号链接;生产环境必须用dnf install而非rpm -ivh,以保障依赖完整性与事务一致性。

在 CentOS/Rocky Linux 中,yum 和 dnf 都是管理 RPM 软件包的上层工具,但它们所处的系统阶段和实际行为有本质区别——不能简单当作“两个可互换的命令”来用。
先搞清 yum 和 dnf 在当前系统中的真实角色
CentOS 7 及更早版本默认使用 yum(Python 2 写成),而 CentOS 8+、Rocky Linux 8/9、AlmaLinux 8/9 等已将 dnf 设为默认包管理器。值得注意的是:在这些新系统中,yum 命令只是 dnf 的符号链接或别名,执行 yum install httpd 实际调用的是 dnf 引擎。这意味着你看到的“yum”命令背后已是 libsolv 依赖求解、模块化仓库支持等现代能力。
所以运维中真正要区分的不是“用 yum 还是 dnf”,而是:
– 若系统是 CentOS 7 / RHEL 7:只用 yum(且不可卸载,它是系统核心依赖);
– 若系统是 Rocky Linux 8+ 或 RHEL 8+:优先用 dnf,避免依赖 yum 的旧脚本陷阱;
– 不要试图在新系统中降级安装旧版 yum 工具链,这会破坏系统一致性。
安装软件:用 dnf install,别碰 rpm -ivh
生产环境必须通过仓库安装,而非直接安装本地 .rpm 文件。原因很实在:单个 rpm 包不含依赖信息的实时解析能力,硬装极易导致系统半瘫痪。
-
dnf install nginx—— 自动拉取 nginx 及其所有运行时依赖(如 openssl、pcre),按顺序安装 -
dnf install --assumeno nginx—— 先看要装什么、下载多大、影响哪些已装包,确认无误再执行 -
dnf localinstall ./package.rpm—— 唯一可接受的本地安装方式,dnf 会主动检查该包依赖是否能在已有仓库中满足,缺则报错中止 - 绝对避免:
rpm -ivh package.rpm—— 它跳过依赖检查,也不更新事务历史,后续 dnf update 可能无法识别冲突
查包、找文件、定位问题:查询命令要分清对象
查询分两类:查“已安装的包”用 rpm -q,查“仓库里有什么”用 dnf。
- 查某个服务由哪个包提供:
dnf provides /usr/bin/python3 - 查已装包的配置文件在哪:
rpm -qc nginx - 查某 rpm 包里有哪些文件(未安装时):
rpm -qpl package.rpm - 查包是否被修改过:
rpm -V nginx(对比原始校验和) - 查包签名是否可信:
rpm -K package.rpm(验证 GPG 和摘要)
注意:dnf list installed 和 rpm -qa 结果基本一致,但前者带仓库来源信息,后者更轻量,适合脚本调用。
仓库配置:别只改 .repo 文件,还要管优先级和密钥
/etc/yum.repos.d/ 下的每个 .repo 文件不只是 URL 列表,它控制着软件来源的可信度与权重。
- 添加 EPEL 仓库:
dnf install epel-release—— 这条命令不只是装一个包,还会自动导入 GPG 密钥、生成 repo 配置、刷新缓存 - 手动配置第三方仓库时,务必加
priority=10(数字越小优先级越高),防止它覆盖 baseos 或 appstream 中的关键系统包 - 禁用某个仓库临时生效:
dnf --disablerepo=epel install foo - 清理元数据缓存后重载:
dnf clean metadata && dnf makecache,尤其在更换镜像源或网络异常后很有用
不复杂但容易忽略


















