说实话,我刚入手 Fedora 38 的时候,面对那一长串命令差点想退坑。yum 是以前用过的,但 dnf 这东西看起来更复杂,花里胡哨的参数多得让人头疼。但用了半年后,我真香了。dnf 的速度和依赖解析能力确实比老 yumm 强太多,尤其是你现在用的 Fedora 40+ 版本,那速度简直飞起。
今天我就把自己踩过的坑、摸透的技巧,一股脑儿全倒出来。不管你是刚转 Linux 的小白,还是想优化工作流的进阶用户,这篇指南都能帮你把 dnf 玩得溜溜的。咱们不整那些虚头巴脑的,直接上干货。
一、为什么是 dnf?先搞懂它的“辈分”
你可能听过 yum,那是红帽系的老祖宗。dnf 是它的下一代,全称 Dandified YUM。核心区别就俩字:快和准。
dnf 用 Python 3 重写的,依赖解析用的是 libsolv 库(之前是 solv),这玩意儿解析依赖的速度是指数级提升的。以前 yum 装个大型软件包,转圈转半天;现在 dnf 几乎是秒级反馈。而且 dnf 更智能,它会自动清理没用的依赖,还内置了自动修复功能。
在 Fedora 里,你其实不用太纠结 yum 和 dnf 的区别。因为系统早就把 yum 做成了 dnf 的软链接。你在终端输入 yum install firefox,系统后台实际调用的是 dnf install firefox。这是为了兼容老用户的手感。但如果你想发挥 dnf 的全部威力,建议直接学 dnf 的命令。
二、基础操作:从“安装”到“删除”的最简路径
咱们先从最实用的开始。别一上来就搞复杂查询,先把能装、能卸、能更新搞明白。
1. 安装软件包:别再只敲 install 了
最基础的命令你肯定知道:
sudo dnf install firefox
但这里有个新手常犯的错:别在 install 后面不加任何选项就狂按回车。尤其是对于大软件包,比如 KDE Plasma 桌面环境或者大型开发套件,dnf 会先计算依赖,这个过程可能让你以为卡死了。
其实你可以加个 -y 参数,让它默认回答“是”:
sudo dnf install -y firefox
不过我个人不喜欢用 -y,因为那样会跳过确认步骤,万一装错了东西也停不下来。我更喜欢看依赖树,确认没问题再回车。
进阶技巧:同时安装多个包
你不需要连续敲三次命令,一行搞定:
sudo dnf install firefox chromium gcc make cmake
dnd 会自动去重,并解析所有包的共同依赖,一次性下载,一次性安装,效率极高。
2. 更新系统:三种姿势任你选
更新是 Fedora 用户最高频的操作。很多人以为 sudo dnf upgrade 就够了,其实这里有讲究。
姿势一:全面更新(推荐日常用)
sudo dnf upgrade
这个命令会更新所有已安装的软件包,包括内核。如果新内核更新了,你需要重启才能生效。
姿势二:安全更新(服务器运维必备)
sudo dnf upgrade --security
这个命令只更新与安全相关的包。如果你的服务器对稳定性要求极高,不想随便动其他组件,这个命令就是你的救星。它只拉取那些修复了漏洞的包,其他无关紧要的包不动。
姿势三:带预检的更新(强迫症友好)
sudo dnf upgrade --refresh
--refresh 会让 dnf 在下载元数据前先刷新本地缓存,确保你拿到的是最新的仓库信息。对于刚装完系统或者很久没更新的用户,这一步很重要,否则可能会因为缓存过期而装不到最新包。
3. 移除软件包:装容易卸难?
很多人以为 sudo dnf remove firefox 就完事了。确实,包本身会被删除,但它的依赖可能还留在那儿,成为“孤儿包”。
只删除包本身:
sudo dnf remove firefox
删除包及其无人使用的依赖(推荐):
sudo dnf autoremove
这招特别管用。比如你之前装了 gcc,顺便装了一堆 gcc 的依赖库。后来你觉得 GCC 没用了,把它删了,那些依赖库就孤零零躺在那儿占空间。autoremove 就是干这个的——它会扫描并清理掉那些因为不再被任何包依赖而成为“孤儿”的包。
清理残留配置文件:
有些软件删除后,会在 /etc 或者用户主目录下留下配置文件。如果你确定永远不用这个软件了,可以结合 --removed 选项:
sudo dnf autoremove --removed
这会连那些已经删除但配置文件还存在的包一起清掉(谨慎使用,别误删重要配置)。
三、查询艺术:像侦探一样挖掘信息
dnf 的查询功能强大到你不敢相信。很多人只用 dnf search 找软件名,其实它能告诉你远比“有没有这个包”更多的信息。
1. 搜索软件:别只搜名字
基本搜索:
dnf search vim
这会列出所有描述或名称中包含 “vim” 的包。但结果可能很多,而且不够精准。
精确搜索名称:
dnf search --name vim
这只会匹配包名,不会匹配描述。速度更快,结果更准。
搜索提供某个功能的包:
这是 dnf 最牛的地方之一。比如你需要一个能播放 MP3 的工具,你不用知道具体哪个包,直接搜功能:
dnf provides "*/mp3"
或者更具体点:
dnf provides "application/x-mp3"
这会告诉你哪些包提供了 MP3 格式的解码支持。
查询包的信息:
dnf info firefox
输出包括:版本、架构、大小、来源仓库、简介、URL 等。但如果你觉得输出太乱,可以用 --verbose:
dnf info --verbose firefox
这会显示依赖树、冲突包、推荐包等详细信息,对排查问题极有帮助。
2. 查看已安装的包:哪些是你真正需要的?
列出所有已安装包:
dnf list installed
按仓库过滤:
dnf list installed --repo=fedora
这会只列出来自官方 Fedora 仓库的包,帮你区分哪些是系统自带的,哪些是你后来装的。
查找特定类型的包:
dnf list installed | grep -i python
虽然这是用 grep 过滤,但配合 dnf 的 --showduplicates 可以看到是否有多个版本安装。
3. 查询历史:后悔药随时可吃
这是 dnf 相比旧版 yum 的一个巨大改进。历史回滚。
你不小心装了一堆乱七八糟的包?系统崩了?没关系,dnf 会记录每一次事务操作。
查看操作历史:
dnf history list
你会看到类似这样的输出:
ID | Command line | Date and time | Action(s) | Altered
-------------------------------------------------------------------------------
15 | install firefox | 2024-01-15 10:30 | Install | 1
14 | upgrade --security | 2024-01-14 09:15 | Update | 42
13 | install gcc make | 2024-01-13 14:20 | Install | 3
撤销某次操作:
sudo dnf history undo 15
这会把第 15 次操作(装 firefox)逆转,相当于删除 firefox 及其新增的依赖。注意,它不会删除你手动装的依赖,只会撤销那次事务的影响。
重新执行某次操作:
sudo dnf history redo 15
有时候你想恢复之前的状态,比如你回滚了更新,现在又想把那些更新补回来,用 redo 就行。
四、仓库管理:掌握软件包的“源头”
dnf 的力量来自仓库(repositories)。Fedora 默认有几十个仓库,有些是启用的,有些是禁用的。理解仓库管理,能让你装到更多软件,也能避免混乱。
1. 查看仓库状态
dnf repolist all
你会看到类似这样的列表:
repo id repo name status
fedora Fedora 38 - x86_64 enabled: 65,432
updates Fedora 38 - Updates enabled: 12,345
rpmfusion-free RPM Fusion for Fedora 38 - Free disabled
rpmfusion-nonfree RPM Fusion for Fedora 38 - Nonfree disabled
只查看启用的仓库:
dnf repolist enabled
查看禁用的仓库:
dnf repolist disabled
2. 启用/禁用仓库
临时启用一个仓库(比如为了装一个特定软件):
sudo dnf --enablerepo=rpmfusion-free install vlc
这条命令会临时启用 rpmfusion-free 仓库,装完 vlc 后仓库自动禁用。
永久启用或禁用仓库:
编辑 /etc/dnf/repos.d/ 目录下的配置文件,或者用:
sudo dnf config-manager --set-enabled rpmfusion-free
sudo dnf config-manager --set-disabled rpmfusion-nonfree
添加第三方仓库(以 RPM Fusion 为例):
很多用户装完 Fedora 第一件事就是加 RPM Fusion,因为它包含了很多自由软件仓库没有的多媒体编解码器和专有驱动。
sudo dnf install https://mirrors.rpmfusion.org/free/fedora/rpmfusion-free-release-$(rpm -E %fedora).noarch.rpm https://mirrors.rpmfusion.org/nonfree/fedora/rpmfusion-nonfree-release-$(rpm -E %fedora).noarch.rpm
这个命令会自动下载并安装 RPM Fusion 的仓库配置文件,之后你就可以用 dnf install vlc 或 dnf install nvidia-driver 了。
3. 管理本地仓库(进阶)
如果你有自己编译的软件包,或者想建立一个私有仓库,dnf 也支持。
创建本地仓库元数据:
假设你把 .rpm 文件放在 /home/user/myrepo 目录下:
cd /home/user/myrepo
sudo createrepo_c .
在 dnf 中配置本地仓库:
创建 /etc/yum.repos.d/myrepo.repo:
[myrepo]
name=My Local Repository
baseurl=file:///home/user/myrepo
enabled=1
gpgcheck=0
然后就可以像对待远程仓库一样操作了:
sudo dnf install mypackage.rpm
五、缓存与清理:让系统保持清爽
dnf 默认会缓存下载的 RPM 包和元数据,这在网络慢或者频繁重装时很有用,但时间长了会占用大量空间。
1. 查看缓存使用情况
dnf makecache --verbose
或者更简单地:
du -sh /var/cache/dnf
看看 /var/cache/dnf 目录下到底占了多少空间。
2. 清理缓存
只清理过期元数据:
sudo dnf clean expire-cache
清理所有缓存(包括 RPM 包):
sudo dnf clean all
这会删除 /var/cache/dnf 下的所有内容。下次安装时,dnf 会重新下载。
只清理旧的包(保留最新版本):
sudo dnf clean packages
Fedora 默认会保留最近几个版本的包,以便你回滚。如果你想节省空间,可以调整这个设置,但一般不建议动,除非你磁盘真的告急。
3. 自动清理(懒人福音)
你可以在 /etc/dnf/dnf.conf 中添加配置,让 dnf 在每次操作后自动清理:
[main]
keepcache=0
clean_requirements_on_remove=1
autoclean_always=1
keepcache=0:不保留下载的 RPM 包。clean_requirements_on_remove=1:移除包时自动清理依赖。autoclean_always=1:每次操作前自动清理过期缓存。
六、实战场景:常见问题的 dnf 解决方案
场景一:依赖冲突,装不上软件
这是新手最容易遇到的坑。错误信息通常长这样:
Problem: problem with installed package xxx-1.0-1.fc38.x86_64
- package yyy conflicts with xxx
解决步骤:
- 查看详细冲突信息:
sudo dnf install --best --allowerasing zzz
--best 会让 dnf 尝试最优的依赖解决方案,--allowerasing 允许 dnf 移除冲突的包。但这招比较激进,可能会删掉你不想要的东西,慎用。
- 查找冲突来源:
sudo dnf install --dry-run zzz
--dry-run 是模拟安装,不会真的执行,但会告诉你会发生什么。看看输出,确认哪些包会被移除或替换。
- 检查是否第三方仓库冲突:
很多时候冲突是因为你加了 RPM Fusion 或 EPEL,它们和官方仓库的某些包版本不一致。这时候可以:
sudo dnf distro-sync
这会把所有已安装的包同步到当前仓库的最新版本,解决版本混乱问题。
场景二:想知道某个命令属于哪个包
比如你想知道 vim 命令在哪个包里,或者 python3 是哪个包提供的。
dnf provides "*/vim"
dnf provides "*/python3"
这比 rpm -qf 更强大,因为它会搜索所有仓库,包括未安装的。
场景三:只想下载包,不想安装
有时候你只需要 RPM 包,比如要装到另一台离线机器上,或者要检查包的签名。
sudo dnf download firefox
这会在当前目录下载 firefox-*.rpm 文件,不会安装,也不会缓存到系统目录。
场景四:查找包的历史版本
dnf list --showduplicates firefox
这会列出所有可用版本的 firefox 包。你可以指定版本安装:
sudo dnf install firefox-120.0-1.fc38.x86_64
这招在某个新版本有问题时非常有用,可以回退到旧版本。
七、性能优化:让 dnf 跑得像闪电
1. 选择合适的镜像
Fedora 默认镜像可能离你很远。编辑 /etc/dnf/dnf.conf,加入:
fastestmirror=True
这会强制 dnf 使用最快的镜像。你也可以手动指定国内镜像,比如在 CentOS/RHEL 系常见的阿里云、腾讯云镜像。
2. 并发下载
max_parallel_downloads=10
默认是 3,改成 10 可以大幅提升下载速度,尤其对于大仓库。
3. 预装元数据
sudo dnf makecache
定期运行这个命令,让本地缓存保持最新,查询和安装时会快很多。
八、给小朋友的比喻:dnf 就像一个智能快递管家
说到这儿,我得插一段。如果你家里有小朋友,或者你想用最通俗的方式解释 dnf,可以这么比喻:
想象你住在一个大社区( Fedora 系统),社区里有个智能快递管家(dnf)。
- 安装软件:你想买个新玩具(软件包),告诉管家“我要 firefox”,管家会去仓库(商店)下单,顺便看看需不需要电池(依赖),一起给你送过来。
- 更新系统:管家会定期检查所有玩具有没有新版本,有就自动给你升级。
- 删除软件:你不想要某个玩具了,管家帮你扔掉,还会顺手清理掉为了这个玩具专门买的配件(依赖)。
- 历史回滚:万一你装错了,管家有个账本,记录了你每一次操作,你可以说“把昨天装的玩具退掉”,管家就帮你恢复原样。
- 仓库:管家不只从一家店买东西,还可以从多个店(官方仓库、第三方仓库)进货,只要你允许,他就能帮你买到各种奇奇怪怪的东西。
这个比喻虽然简单,但核心逻辑都对上了。dnf 的本质就是一个帮你管理“软件依赖”和“版本”的智能代理,让你不用操心底层细节。
九、结语:把 dnf 变成你的本能
写了这么多,其实就想传达一个观点:dnf 不是命令行的奴隶,而是你的助手。
很多人排斥 Linux 命令行,是因为觉得命令难记、难用。但 dnf 的设计哲学是“方便优于简洁”,它的自动依赖解析、历史回滚、仓库管理,都是为了让用户少踩坑。
我建议你这么做:
- 把这篇指南收藏起来,遇到问题回来查。
- 没事多敲
dnf history list,熟悉一下自己的操作历史。 - 学会用
--dry-run,在真正执行前先看一眼会发生什么。 - 别怕改配置,
/etc/dnf/dnf.conf里的选项很多都是有用的,试了才知道。
最后,送大家一句话:Linux 的威力不在于命令的多,而在于你对工具的理解深。dnf 只是起点,后面还有 systemd、pacman、apt 等你去探索。但在这条路上,dnf 会是你最忠实的伙伴。
现在,打开终端,输入 sudo dnf upgrade,开始你的 Fedora 之旅吧。