当前系统应优先使用dnf(fedora 36+/rhel 9+/centos stream 9+已全面替代yum),判断依据是rpm -q yum dnf结果及/usr/bin/yum是否指向dnf;混用命令或仓库配置会导致元数据冲突。

dnf 已全面替代 yum(尤其在 Fedora 36+、RHEL 9+、CentOS Stream 9+),但多数 CentOS 7/8 和旧版 RHEL 仍默认用 yum —— 关键不是“选哪个”,而是“别混用命令和仓库配置”。
如何判断当前系统该用 yum 还是 dnf
运行 rpm -q yum dnf 查看已安装的包;再执行 ls -l /usr/bin/yum,如果它是个指向 dnf 的软链接(常见于 RHEL 8+/Fedora),说明 yum 只是兼容入口,实际走的是 dnf 引擎。
- 输出含
dnf-*.noarch且无yum-*.noarch→ 强制用dnf,yum可能根本不可用 -
/usr/bin/yum指向/usr/bin/dnf→ 用yum也行,但行为=dnf,日志和历史记录都归入 dnf - CentOS 7 默认只有 yum,强行装 dnf 后两个工具共存 → 切勿交叉执行
yum install和dnf remove,元数据会冲突
安装特定版本软件包时的写法差异
想装老版本的 nginx(比如 1.20.1)?yum 和 dnf 对版本号格式要求不同,写错就报“no package found”。
- dnf 要求完整 NVR 格式:
dnf install nginx-1.20.1-10.el9(必须带 release 字段,可用dnf --showduplicates list nginx查) - yum 支持简写:
yum install nginx-1.20.1(自动匹配最高 release) - 两者都不接受
nginx=1.20.1(那是 apt/deb 体系的写法,RPM 体系用短横线) - 若提示 “package not available”,先确认对应版本是否在启用仓库中:
dnf repoquery --latest-limit=0 --qf "%{version}-%{release}" nginx
清理缓存前务必确认仓库状态
dnf clean all 或 yum clean all 看似安全,但可能让后续 dnf update 失败——尤其当仓库元数据损坏或网络临时不可达时,clean 会删掉本地副本,而新元数据又拉不下来。
- 日常建议只清包缓存:
dnf clean packages(保留 repodata,更新快且安全) - 换源后才需清元数据:
dnf clean metadata或dnf clean dbcache - 执行前先检查仓库是否 enable:
dnf repolist --enabled,若为空,clean 后连dnf makecache都会卡住 - CentOS 7 用户注意:
yum makecache在某些镜像源下极慢,可加--setopt=skip_if_unavailable=True跳过失效源
搜索不到包?先查 provides 和仓库范围
用 dnf search vim 找不到 vim-enhanced?这不是命令问题,而是默认只搜 name 和 summary 字段,且不跨禁用仓库。
- 按文件找包:
dnf provides /usr/bin/vim(比 search 更准,绕过命名差异) - 扩大搜索范围:
dnf search --all vim(包含 description 字段) - 确认目标包在哪个仓库:
dnf list available | grep vim,若结果为空,可能是仓库未启用或 arch 不匹配(如 x86_64 系统搜 aarch64 包) - 某些包(如 kernel-devel)需启用
baseos+appstream双仓库才能列出全版本
最常被忽略的一点:dnf 的事务历史(dnf history)虽支持回滚,但仅对 *已提交* 的事务有效;若中途 Ctrl+C 中断安装,残留的半成品状态不会被记录,此时手动清理 rpmdb(rpm --rebuilddb)反而可能破坏依赖图。










