Linux yum / dnf 管理软件包技巧

8次阅读

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

Linux 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 → 强制用 dnfyum 可能根本不可用
  • /usr/bin/yum 指向 /usr/bin/dnf → 用 yum 也行,但行为 =dnf,日志和历史记录都归入 dnf
  • CentOS 7 默认只有 yum,强行装 dnf 后两个工具共存 → 切勿交叉执行 yum installdnf 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 allyum clean all 看似安全,但可能让后续 dnf update 失败——尤其当仓库元数据损坏或网络临时不可达时,clean 会删掉本地副本,而新元数据又拉不下来。

  • 日常建议只清包缓存:dnf clean packages(保留 repodata,更新快且安全)
  • 换源后才需清元数据:dnf clean metadatadnf 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)反而可能破坏依赖图。

text=ZqhQzanResources