首页/系统/Linux 运维命令速查/dnf 新一代 RPM 包管理器

dnf 新一代 RPM 包管理器

dnf 是 RHEL8+/Fedora/CentOS Stream 的标准包管理器,替代 yum:安装、更新、删除、历史回滚一条龙,依赖解析更稳。

Linux 运维命令速查系统更新于 2026-10-13

dnf 是什么

dnf 是 RHEL 8 及之后版本、CentOS Stream、Fedora 的默认包管理器,也是 yum 的继任者——在 RHEL 8+ 上执行 yum 实际就是调用 dnf。它用 libsolv 做依赖求解,把安装、升级、卸载组织成事务,并且每次事务都记录在 dnf history 里,可以按编号回滚。相比旧 yum,它在依赖冲突时的输出更明确,也支持模块流(module stream)这种同一软件多版本共存的机制。

基本信息

适用平台RHEL 8+、CentOS Stream 8/9/10、Rocky、AlmaLinux、Fedora;CentOS 7 默认仍是 yum,需要自行安装 dnf
命令语法dnf [选项] 子命令 包名...
常用子命令install、reinstall、update/upgrade、remove、autoremove、search、info、list、provides、repolist、clean、makecache、history、module、downgrade
配置文件/etc/dnf/dnf.conf 控制全局行为,仓库定义在 /etc/yum.repos.d/*.repo;缓存位于 /var/cache/dnf
权限要求安装与卸载需要 root 或 sudo;查询类子命令普通用户即可执行

典型使用场景

  • 装包与服务依赖:dnf install -y nginx,一次把依赖链解好
  • 由文件反查包名:dnf provides */ifconfig 找出某个命令来自哪个包
  • 安全更新:dnf update --security 只应用安全相关更新,缩小变更面
  • 回滚出问题的事务:dnf history 找到编号后 undo,整批恢复
  • 锁定版本:用 versionlock 插件或 dnf 配置排除,避免关键组件被意外升级
  • 清理与重建缓存:仓库元数据异常时先 dnf clean all 再 makecache

常用示例

常用示例
dnf install -y nginx
dnf update -y
dnf remove -y telnet
dnf list installed | grep nginx
dnf provides */ifconfig              # 由文件反查包
dnf info nginx                       # 版本、来源仓库与依赖
dnf --assumeno install nginx         # 只看事务方案,不真正执行
dnf history                          # 列出事务编号
dnf history info 12                  # 某次事务的详情
dnf history undo last                # 撤销上一次事务
dnf module list nginx                # RHEL 系查看可用的模块流

子命令对照

子命令作用注意
install安装包并解析依赖用 --assumeno 先看方案再执行
update / upgrade升级已安装包,处理过时替换关系在 dnf 中两者已基本等价
provides由文件或能力反查所属包找不到命令时最常用的定位手段
history查看与回滚事务undo 依赖仓库里仍有旧版本包
module管理模块流(同一软件的多个版本通道)RHEL 系特有机制,切换流会影响版本
clean / makecache清理与重建元数据缓存报 404 或依赖异常时先做这一步
dnf history undo 能回滚的前提是仓库里还能取到旧版本包,如果已从仓库撤下,回滚会失败。执行升级前先 dnf history 留个记录,或对关键包保留本地 rpm(dnf download 配合离线安装)作为退路。
模块流是 RHEL 8+ 引入的机制:同一个软件可以有多个并行版本通道,例如不同版本的 PHP 或 Node.js。切换流用 dnf module enable 名称:流 再 dnf module install,切换会改变已装版本,操作前先 dnf module list 看清可用流。
在业务机上直接 dnf update -y 是不受控变更:它会连带升级依赖、内核与库文件,可能触发重启或运行时兼容问题。生产环境应先在测试环境验证,或在 dnf.conf 里排除关键包(如 exclude=kernel*)并指定维护窗口。
dnf 与 yum 的关系:RHEL 8+ 上 yum 是指向 dnf 的软链接,老教程里的 yum 参数基本通用;CentOS 7 及更早版本默认只有 yum,看到 dnf 报 command not found 属于系统年代问题,不是配置错误。
本地与离线安装:dnf install ./package.rpm 可直接安装本地 rpm 并尝试解析依赖;从其他机器取包用 dnf download 包名(需要 dnf-plugins-core);把一批 rpm 用 createrepo_c 生成元数据后用 .repo 文件里的 baseurl 指向 file:// 路径,就构成了内网仓库,适合隔离网络环境。
事务失败的常见处理:依赖冲突时 dnf 会给出候选方案,逐个确认比直接加 --skip-broken 跳过更稳妥;确实卡在版本上可以用 dnf repoquery 的 --requires 与 --whatrequires 看依赖链,或临时用 --nobest 放宽版本选择。不要用 --nodeps 强行安装,那会留下 rpm 数据库与实际文件不一致的隐患,后续升级会持续报错。

易错点

  • 生产机上不加确认就 -y 一把梭,容易连带升级关键依赖甚至内核;先用 --assumeno 看事务方案
  • 把 update 与 upgrade 视为完全不同(在 dnf 中两者已基本等价)却忽略了它会处理过时替换关系,跨大版本前没有读输出
  • 仓库元数据过期导致报 404 或版本找不到,应先 dnf clean all 再 dnf makecache 而不是怀疑包不存在
  • 安装过程中断会残留未完成事务与锁文件(通常在 /var/lib/dnf 下),重试前先确认没有正在运行的 dnf 进程
  • 卸载时被连带删除的包往往比预期多,remove 前用 dnf repoquery --whatrequires 确认依赖该包的其他组件

数据来源与参考

  • man 8 dnf(DNF)
  • Red Hat 文档:管理软件包

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌