Linux DNF 命令详解:从入门到精通

在 RPM 包管理的 Linux 发行版(如 Fedora、RHEL、CentOS Stream、AlmaLinux、Rocky Linux 等)中,dnf(Dandified YUM)是一款功能强大的包管理工具。它作为 yum(Yellowdog Updater, Modified)的继任者,凭借更高效的依赖解析算法、模块化支持、事务历史管理等特性,成为现代 Linux 系统中包管理的首选工具。本文将全面介绍 dnf 的核心功能、常用命令、高级用法、最佳实践及故障排查,帮助读者轻松掌握其使用技巧。

目录#

  1. 什么是 DNF?
  2. DNF 基本语法
  3. 常用 DNF 命令
  4. 高级用法
  5. 最佳实践
  6. 常见故障排查
  7. 总结
  8. 参考资料

1. 什么是 DNF?#

dnf(Dandified YUM)是一款开源的 RPM 包管理器,由 Fedora 社区主导开发,首次在 Fedora 22(2015 年)中替代 yum 成为默认包管理器。它基于 libsolv 库实现高效的依赖解析,支持事务回滚、模块化包管理、插件扩展等高级特性,旨在解决 yum 的性能瓶颈和功能局限。

核心特性#

  • 高效依赖解析:采用 libsolv 算法,比 yum 更快解决复杂依赖关系。
  • 事务历史:记录所有包操作(安装/卸载/升级),支持回滚(undo)和重做(redo)。
  • 模块化支持:通过“模块”(Module)管理同一软件的多版本(如 nodejs:18python:3.11),适用于 RHEL 8+ 等发行版。
  • 插件生态:支持通过插件扩展功能(如 fastestmirror 自动选择最快镜像、langpacks 管理语言包)。
  • 仓库管理:灵活配置、启用/禁用第三方仓库,支持 GPG 密钥验证。

支持的发行版#

  • Fedora 22+
  • RHEL 8+、CentOS Stream 8+
  • AlmaLinux、Rocky Linux(RHEL 衍生版)
  • Oracle Linux 8+

2. DNF 基本语法#

dnf 命令的基本结构如下:

dnf [全局选项] 命令 [命令参数] [包/组/模块名称]

常用全局选项#

  • -y:自动回答“是”(无需手动确认操作),适用于脚本或批量操作。
  • -q:静默模式(减少输出信息)。
  • --refresh:强制刷新仓库元数据(忽略本地缓存)。
  • --disableplugin=<插件名>:临时禁用指定插件(如 --disableplugin=fastestmirror)。
  • --enablerepo=<仓库名>:临时启用指定仓库(即使仓库配置中 enabled=0)。

3. 常用 DNF 命令#

3.1 系统更新与升级#

更新仓库元数据#

刷新本地缓存的仓库元数据(获取最新包列表):

dnf check-update  # 检查可更新的包(仅显示,不执行更新)
dnf clean expire-cache  # 清理过期缓存,下次操作自动刷新

升级所有包#

升级系统中所有可更新的包(包括内核):

dnf update  # 等价于 dnf upgrade(dnf 中两者为别名)
dnf update -y  # 自动确认升级(无需手动输入 y)

升级指定包#

仅升级单个或多个特定包:

dnf update firefox  # 升级 Firefox 浏览器
dnf update kernel kernel-devel  # 升级内核及开发工具包

3.2 包管理(安装/卸载/升级/降级)#

安装包#

dnf install <>  # 安装指定包(自动解决依赖)
dnf install -y <>  # 自动确认安装
 
# 示例:安装 nginx 和其依赖
dnf install nginx

卸载包#

dnf remove <>  # 卸载包(保留配置文件)
dnf erase <>  # 等价于 remove(dnf 中两者为别名)
 
# 示例:卸载 nginx
dnf remove nginx

降级包#

将包回退到旧版本(需仓库中存在旧版本):

dnf downgrade <>  # 降级到上一个可用版本
dnf downgrade <>-<版本>  # 降级到指定版本(如 dnf downgrade python3-3.9.6)

3.3 包查询(搜索/信息/列表)#

搜索包#

根据关键词搜索包名或描述:

dnf search <关键>  # 模糊搜索(如 dnf search "text editor")
dnf search --name <关键>  # 仅匹配包名(更精确,如 dnf search --name vim)

查看包详情#

获取包的版本、依赖、描述等信息:

dnf info <>  # 如 dnf info nginx

列出已安装/可用包#

dnf list installed  # 列出所有已安装的包
dnf list installed "kernel*"  # 列出已安装的内核相关包(支持通配符 *)
 
dnf list available  # 列出仓库中所有可用但未安装的包
dnf list available python3*  # 列出所有 python3 相关的可用包

检查包是否安装#

dnf list installed <>  # 若输出为空,则未安装
# 或使用 rpm 命令(更直接):rpm -q <包名>

3.4 仓库管理#

列出所有仓库#

查看系统中已配置的仓库(包括启用/禁用状态):

dnf repolist  # 仅显示启用的仓库
dnf repolist all  # 显示所有仓库(包括禁用的)
dnf repolist enabled  # 等价于 repolist

启用/禁用仓库#

临时或永久启用/禁用仓库:

# 临时启用(仅本次操作生效)
dnf --enablerepo=epel install <>
 
# 永久启用/禁用(修改仓库配置文件)
dnf config-manager --set-enabled <仓库>  # 启用
dnf config-manager --set-disabled <仓库>  # 禁用

添加第三方仓库#

通过 dnf config-manager 添加仓库(需先安装 dnf-plugins-core):

# 安装 dnf 配置工具(部分系统默认已安装)
dnf install -y dnf-plugins-core
 
# 添加 EPEL 仓库(适用于 RHEL/CentOS 系统)
dnf config-manager --add-repo=https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.repo

3.5 缓存清理与系统优化#

清理缓存#

DNF 会缓存下载的包和仓库元数据,可定期清理以释放空间:

dnf clean all  # 清理所有缓存(包、元数据、过期文件)
dnf clean packages  # 仅清理已下载的包文件(保留元数据)

移除无用依赖(orphans)#

卸载不再被任何包依赖的“孤立包”(如手动安装后被其他包替代的依赖):

dnf autoremove  # 移除孤立包(需手动确认)
dnf autoremove -y  # 自动移除

3.6 事务历史管理#

DNF 记录所有包操作(安装/卸载/升级),可通过历史记录追踪或回滚操作。

查看事务历史#

dnf history  # 列出所有事务(ID、操作时间、命令)
dnf history list  # 等价于 dnf history
dnf history info <事务ID>  # 查看指定事务的详细信息(如安装了哪些包)

回滚/重做事务#

dnf history undo <事务ID>  # 回滚指定事务(如卸载已安装的包)
dnf history redo <事务ID>  # 重做指定事务(如重新安装已卸载的包)

示例:回滚 ID 为 10 的事务(假设该事务是安装了 nginx):

dnf history undo 10 -y  # 自动回滚,卸载 nginx 及相关依赖

4. 高级用法#

4.1 模块化管理(Modularity)#

RHEL 8+ 引入“模块”(Module)概念,用于管理同一软件的多版本(如 nodejs141618 等模块流)。

列出可用模块#

dnf module list  # 列出所有模块
dnf module list nodejs  # 仅列出 nodejs 相关模块

安装指定模块版本#

dnf module install nodejs:18  # 安装 nodejs 18 模块(:18 为模块流版本)
dnf module install nodejs:18/devel  # 安装带 "devel" 配置文件的模块(含开发工具)

切换模块版本#

dnf module switch-to nodejs:20  # 将 nodejs 从当前版本切换到 20

4.2 包组管理#

“包组”(Group)是预定义的包集合(如“开发工具”“Web 服务器”),方便批量安装相关组件。

列出所有包组#

dnf group list  # 列出所有包组(默认显示已安装和可用)
dnf group list --hidden  # 显示隐藏的包组(如调试工具组)

安装包组#

dnf group install "Development Tools"  # 安装“开发工具”组(含 gcc、make 等)
dnf group install "Web Server" -y  # 自动安装“Web 服务器”组(含 httpd、mod_ssl 等)

查看包组内容#

dnf group info "Development Tools"  # 显示“开发工具”组包含的具体包

4.3 指定仓库操作#

临时从指定仓库安装/升级包(忽略默认仓库配置):

# 仅从 epel 仓库安装包(禁用其他仓库)
dnf --disablerepo="*" --enablerepo="epel" install <>
 
# 从本地目录安装 RPM 包(需提前下载 .rpm 文件)
dnf install /path/to/package.rpm

4.4 插件扩展#

DNF 支持通过插件增强功能,常用插件如下:

fastestmirror(默认启用)#

自动选择下载速度最快的仓库镜像:

# 检查是否启用
grep -i enabled /etc/dnf/plugins/fastestmirror.conf  # 应显示 enabled=1

langpacks(语言包管理)#

仅安装用户指定语言的软件包(减少冗余语言文件):

dnf install langpacks-zh_CN  # 安装中文语言支持

安装插件#

dnf install dnf-plugins-core  # 基础插件集(含 config-manager 等工具)
dnf install dnf-plugin-system-upgrade  # 系统升级插件(如 Fedora 版本升级)

5. 最佳实践#

1. 定期更新系统#

保持系统更新是安全的基础:

# 每周执行一次更新(可通过 crontab 自动化)
dnf update -y && dnf clean all

2. 谨慎使用 -y 选项#

-y 会自动确认所有操作,不建议在交互式场景中使用(可能误删关键包)。仅在脚本或明确确认操作安全时使用。

3. 启用可信仓库#

第三方仓库(如 EPEL、RPM Fusion)可能带来兼容性问题,建议:

  • 仅启用官方或知名社区维护的仓库(如 EPEL 适用于 RHEL 衍生版)。
  • 安装第三方包时,优先检查是否有官方模块或包组。

4. 清理缓存与孤立包#

定期清理缓存释放磁盘空间,移除孤立包减少系统冗余:

dnf clean all && dnf autoremove -y  # 每月执行一次

5. 验证包完整性#

若怀疑包文件被篡改,可通过 rpm 验证:

rpm -V <>  # 验证包的文件大小、权限、校验和等(无输出则正常)

6. 避免混合仓库版本#

例如,Fedora 38 系统不要添加 Fedora 39 的仓库,可能导致依赖冲突。

6. 常见故障排查#

问题 1:仓库元数据错误(如 404 Not Found)#

原因:仓库 URL 失效或本地缓存损坏。
解决

dnf clean all  # 清理所有缓存
dnf --refresh check-update  # 强制刷新仓库元数据

若仍报错,检查 /etc/yum.repos.d/ 目录下的仓库配置文件(.repo),确保 baseurlmirrorlist 有效。

问题 2:依赖冲突(Dependency Resolution Error)#

原因:多仓库包版本冲突,或手动安装了不兼容的 RPM 包。
解决

  • 临时跳过冲突包:dnf update --skip-broken
  • 检查第三方仓库:禁用非官方仓库后重试(--disablerepo=<仓库名>
  • 卸载冲突包:dnf remove <冲突包名>

问题 3:事务锁错误(Transaction Lock)#

原因:另一个 dnf/yum 进程正在运行(如后台更新),导致文件锁占用。
解决

rm -f /var/run/dnf.pid  # 删除锁文件(需确认无其他 dnf 进程运行)

问题 4:下载速度慢#

原因:默认镜像服务器速度慢。
解决

  • 启用 fastestmirror 插件(默认启用):dnf install dnf-plugins-core
  • 手动指定国内镜像(如阿里云、网易镜像,需修改 .repo 文件中的 baseurl)。

7. 总结#

dnf 作为现代 RPM 包管理器,凭借高效的依赖解析、模块化支持和事务历史管理,成为 Fedora、RHEL 等发行版的核心工具。掌握 dnf 的日常操作(更新、安装、卸载)、高级功能(模块、包组)及最佳实践(安全更新、仓库管理),能显著提升 Linux 系统的维护效率。建议定期查阅官方文档,关注插件生态和新特性,进一步优化包管理流程。

8. 参考资料#