从Ubuntu转Fedora后软件装不了搞懂DNF包管理避开依赖冲突和第三方软件安装坑
说实话,我刚从Ubuntu搬到Fedora那会儿,真的是懵的。
你在Ubuntu里装软件,习惯了apt install一把梭,遇到报错就加个-f或者ppa,基本上没什么大问题。结果到了Fedora,apt不见了,换成了dnf,装个VS Code直接报错说依赖冲突,装个Chrome又提示签名验证失败……那几天我差点想回Ubuntu。
后来折腾了好久,终于把DNF摸透了。今天把踩过的坑都整理出来,希望能让你少掉几根头发。
为什么你在Fedora上装软件老报错?
先别急着骂Fedora,咱们先搞清楚一个问题:Ubuntu和Fedora的包管理体系从根本上就是两套不同的东西。
Ubuntu用的是APT(Advanced Package Tool),配合.deb包和.deb的依赖解析机制。包管理器会去Ubuntu的仓库里找对应的.deb文件,然后自动把依赖也一起装上。
Fedora用的是DNF(Dandified YUM),配合.rpm包。RPM是红帽系的历史遗留,DNF是它的现代化升级版,底层依赖解析用的是LibDNF。
这意味着什么?意味着你在Ubuntu上熟得不能再熟的命令,到Fedora上全变了:
| 操作 | Ubuntu (APT) | Fedora (DNF) |
|---|---|---|
| 更新软件列表 | apt update |
dnf check-update |
| 安装软件 | apt install xxx |
dnf install xxx |
| 卸载软件 | apt remove xxx |
dnf remove xxx |
| 搜索软件 | apt search xxx |
dnf search xxx |
| 查看所有已装包 | dpkg -l |
dnf list installed |
| 清理缓存 | apt clean |
dnf clean all |
光记这些命令区别还好,真正让人头大的是依赖解析逻辑不一样。APT和DNF对”依赖冲突”的处理策略完全不同,这就是你装软件报错的根本原因。
DNF的核心工作机制
仓库(Repository)是什么
在Ubuntu上你习惯用apt,它会去/etc/apt/sources.list里读仓库地址。Fedora的DNF仓库配置在/etc/yum.repos.d/目录下。
# 看看Fedora默认有哪些仓库
ls /etc/yum.repos.d/
# 输出大概是这样的:
# fedora.repo
# fedora-cisco-openh264.repo
# fedora-modular.repo
# rpmfusion-free.repo
# rpmfusion-free-updates.repo
# ...
每个.repo文件里都写着仓库的地址、启用状态、GPG密钥位置等信息。Fedora官方仓库分好几种:
- core:基础系统包,Fedora官方维护
- updates:安全更新和bug修复
- fedora-updates-modular:模块化更新
- rpmfusion-free:第三方免费软件(比如显卡驱动、多媒体编解码器)
- rpmfusion-nonfree:第三方闭源软件(比如某些专有驱动)
DNF的安装流程是怎样的
当你执行dnf install firefox时,DNF会做这几件事:
- 刷新元数据:去各个仓库下载最新的包列表和依赖关系信息
- 解析依赖:根据你的安装请求,递归找出所有需要的依赖包
- 解决冲突:检查是否有版本冲突、文件冲突
- 下载并安装:下载所有包,依次安装
关键的一步在”解析依赖”和”解决冲突”。DNF用的依赖解析器比APT的更强一些,它能处理更复杂的依赖关系,但同时也更严格——它会直接报错,而不是像APT那样有时候”悄悄”降级或者跳过。
查看仓库信息
# 查看所有已启用的仓库
dnf repolist
# 输出示例:
# repo id repo name
# fedora Fedora 40 - x86_64
# fedora-modular Fedora Modular 40 - x86_64
# updates Fedora 40 - x86_64 - Updates
# rpmfusion-free RPM Fusion for Fedora 40 - Free
# rpmfusion-free-updates RPM Fusion for Fedora 40 - Free - Updates
# 查看某个仓库的详细信息
dnf repo --showduplicates firefox
依赖冲突:最常见的噩梦
为什么会冲突
依赖冲突的本质是:两个包要求同一个依赖的不同版本,或者同一个文件被两个包都声称拥有。
比如你在Ubuntu上装过Chrome,习惯了直接去官网下.deb包安装。到Fedora上你照样去官网下了个.rpm包,然后用rpm -ivh chrome.rpm装,结果报错:
error: Failed dependencies:
libwebkitgtk-1.0.0.so.3()(64bit) is needed by google-chrome-stable
或者更常见的情况:
Problem: package google-chrome-stable-120.0.6099.109-1.x86_64 requires
libstdc++.so.6(GLIBCXX_3.4.30)(64bit), but none of the providers can be installed
这是因为Chrome的RPM包依赖的某个库版本,在你的系统上不存在或者版本不匹配。
怎么查看依赖关系
在安装之前,你可以先看看某个包依赖什么:
# 查看包的依赖信息(不实际安装)
dnf info firefox
# 输出里会有一行 Depends On,列出所有依赖
# 更详细地查看依赖树
dnf repoquery --requires firefox
# 查看某个包被哪些其他包依赖
dnf repoquery --wheneeded firefox
# 查看某个包提供哪些文件
dnf repoquery --files firefox
repoquery是一个非常好用的工具,它能帮你深入了解包的依赖关系。
遇到依赖冲突怎么办
方法一:先更新系统再装
很多依赖冲突是因为你的系统太老了。Fedora的版本更新很快,每隔几个月就出一个新版本。如果你用的是旧版系统,装新软件就容易出问题。
# 先更新系统
sudo dnf upgrade --refresh
# 然后再尝试安装
sudo dnf install xxx
方法二:查看具体的冲突原因
当dnf install报错时,它通常会告诉你冲突的具体原因。仔细读错误信息,比如:
Problem 1: package firefox-120.0-1.fc40.x86_64 conflicts with
google-chrome-stable provided by google-chrome-stable-120.0-1.x86_64
这说明Firefox和Chrome都声称要安装某个文件,产生冲突。
方法三:使用--allowerasing参数(慎用)
有时候DNF找不到一个干净的解决方案,但可以告诉你”如果你允许,我可以这样做”:
sudo dnf install google-chrome-stable --allowerasing
这个参数会让DNF在安装新包时,允许卸载已经冲突的包。一定要仔细看它会卸载什么,别一不小心把你的系统核心包给卸了。
方法四:用dnf solve分析问题
从Fedora 36开始,DNF提供了一个solve子命令,可以帮你分析问题:
# 分析问题但不执行
sudo dnf solve install google-chrome-stable
# 这个命令会输出详细的问题分析,包括所有冲突的包和依赖关系
实际案例:装VS Code时的依赖问题
有一天我想在Fedora上装VS Code,直接去官网下了code-1.85.0.rpm,然后:
sudo rpm -ivh code-1.85.0.rpm
结果报错:
error: Failed dependencies:
libsecret-1.so.0()(64bit) is needed by code-1.85.0-1704104462.el8.x86_64
我用repoquery查了一下:
dnf repoquery --requires code-1.85.0.rpm | grep libsecret
发现它需要libsecret-1.so.0,而系统上安装的是libsecret-1.so.0但版本不匹配。
最后我直接改用DNF从仓库安装:
# 先导入Microsoft的GPG密钥
sudo rpm --import https://packages.microsoft.com/keys/microsoft.asc
# 添加Microsoft的仓库
sudo dnf config-manager --add-repo https://packages.microsoft.com/yumrepos/vscode
# 安装
sudo dnf install code
这次就顺利装好了。因为DNF会自动处理依赖,它会去仓库里找正确版本的libsecret,而不是像你手动装rpm时那样只装这一个包。
第三方软件安装的坑
坑一:直接rpm -ivh安装包
很多新手(包括曾经的我)在Fedora上装软件,第一反应是去官网下载.rpm包,然后rpm -ivh xxx.rpm。
这是一个巨大的坑。
rpm是包管理器的底层工具,它不会自动解决依赖。你手动装一个rpm,如果它依赖的包不在系统上,它会报错让你自己解决依赖。这就会导致你装了一个半成品软件,运行起来才发现缺这缺那。
正确做法:始终用dnf安装本地rpm包
# 错误做法
sudo rpm -ivh xxx.rpm
# 正确做法
sudo dnf install ./xxx.rpm
# dnf会自动处理依赖,它甚至能自动解决依赖冲突
dnf install配合本地文件路径,会在安装这个包的同时,自动去仓库里找它依赖的其他包,比rpm强大太多。
坑二:RPM Fusion
Fedora官方仓库不包含很多软件,因为Fedora对许可证比较严格。比如:
- 多媒体编解码器(MP3、H.264、MP4等)
- NVIDIA显卡驱动
- 某些游戏引擎
- Adobe Flash(虽然现在没人用了)
这些软件在RPM Fusion仓库里。如果你不加RPM Fusion,很多常用软件你根本装不到。
# 安装RPM Fusion(免费版,包含大多数开源和免费软件)
sudo dnf install https://mirrors.rpmfusion.org/free/fedora/rpmfusion-free-release-$(rpm -E %fedora).noarch.rpm
# 安装RPM Fusion(非免费版,包含NVIDIA驱动等闭源软件)
sudo dnf install https://mirrors.rpmfusion.org/nonfree/fedora/rpmfusion-nonfree-release-$(rpm -E %fedora).noarch.rpm
# 装完刷新缓存
sudo dnf upgrade --refresh
装完RPM Fusion之后,你就可以装vlc、steam、nvidia-driver这些软件了。
坑三:Flatpak和Snap
Fedora默认集成了Flatpak,这是Linux上另一种软件分发方式。Flatpak的好处是它自带运行时环境,不依赖系统的库,所以不会出现依赖冲突。
# 看看Flatpak是不是已经装了
flatpak --version
# 安装一个应用(比如Spotify)
flatpak install flathub com.spotify.Client
# 查看所有已装的Flatpak应用
flatpak list
# 更新所有Flatpak应用
flatpak update
但Flatpak有个问题:应用更新会缓存很多旧版本,用久了会占很多空间。你可以定期清理:
flatpak uninstall --unused
至于Snap,Fedora默认没有预装,但也可以装。不过个人不太推荐,因为Snap的性能和体验普遍不如Flatpak和原生包。
坑四:GPG密钥验证失败
从第三方仓库安装软件时,经常遇到这样的报错:
GPG key retrieval failed: [Errno 14] curl#37 - "Couldn't open file /etc/pki/rpm-gpg/RPM-GPG-KEY-Fedora"
或者:
Retrieving key from https://xxx.repo
Importing GPG key 0x12345678:
Userid : "XXX"
Fingerprint: XXXX
From : https://xxx.repo
Key import failed (code 1)
这说明仓库的GPG密钥没有正确导入。解决方法:
# 手动导入GPG密钥
sudo rpm --import https://packages.microsoft.com/keys/microsoft.asc
# 或者清除缓存后重试
sudo dnf clean all
sudo dnf makecache
坑五:模块(Modular)冲突
从Fedora 28开始,DNF引入了模块(Module)的概念。模块允许同一个软件的不同版本共存。比如你可以同时安装PHP 7.4和PHP 8.1,它们互不干扰。
但这对新手来说也是个坑。比如你想装nodejs,结果发现:
Problem: module nodejs:18 conflicts with module nodejs:20 provided by module nodejs:20
这是因为你之前启用过某个模块,现在想装另一个版本的模块,产生了冲突。
解决方法:
# 查看所有可用的模块
dnf module list
# 禁用之前的模块
sudo dnf module reset nodejs
# 启用你想要的模块
sudo dnf module enable nodejs:20
# 再安装
sudo dnf install nodejs
DNF的高级技巧
缓存管理
DNF会缓存已经下载的包,这样你 reinstall 的时候就不用重新下载。但缓存也会占空间。
# 查看缓存大小
dnf clean packages
# 清理所有缓存
sudo dnf clean all
# 设置自动清理(在/etc/dnf/dnf.conf里)
# 或者每次装包后自动清理
sudo dnf install --refresh --setopt=clean_requirements_on_remove=true
安装历史和中继
DNF会自动记录每次操作的历史,你可以随时查看和回滚。
# 查看操作历史
dnf history
# 回滚某次操作
sudo dnf history undo 5
# 查看某次操作的详细信息
dnf history info 5
这个功能非常有用!比如你装完某个软件后发现系统出了问题,可以直接回滚到装之前的状态。
自定义DNF配置
/etc/dnf/dnf.conf是DNF的配置文件,你可以调整一些行为:
[main]
gpgcheck=1
installonly_limit=3
clean_on_remove=true
best=true
best=true:总是安装最新版本,而不是兼容版本installonly_limit=3:同时保留最多3个内核版本(默认是3,太老的内核不会自动清理)clean_on_remove=true:卸载包时自动清理依赖
快速搜索和过滤
# 搜索包含"editor"的包
dnf search editor
# 只搜索名称精确匹配的
dnf search --name firefox
# 查看某个包的详细信息
dnf info firefox
# 列出某个包提供的所有文件
dnf repoquery --files firefox
# 找出哪个包提供了某个文件
dnf provides /usr/bin/python3
从Ubuntu迁移的实用建议
替换常用操作
把你在Ubuntu上的习惯对应到Fedora:
| 你想做的事 | Ubuntu怎么做 | Fedora怎么做 |
|---|---|---|
| 更新软件列表 | apt update |
sudo dnf makecache |
| 升级系统 | apt upgrade |
sudo dnf upgrade |
| 安装软件 | apt install xxx |
sudo dnf install xxx |
| 清理缓存 | apt clean |
sudo dnf clean all |
| 查看已装包 | dpkg -l |
dnf list installed |
| 查找包 | apt search xxx |
dnf search xxx |
先装这几个工具
刚到Fedora,建议先装几个常用工具,让日常操作更顺手:
# 代码编辑器
sudo dnf install code
# 浏览器
sudo dnf install firefox
# 压缩工具
sudo dnf install unzip p7zip p7zip-plugins
# 终端工具
sudo dnf install tmux htop ncdu
# 开发工具(根据你的需求)
sudo dnf install git cmake gcc gcc-c++ make
如果遇到奇怪的错误
记住这几个万能排查步骤:
# 1. 先更新系统
sudo dnf upgrade --refresh
# 2. 清除缓存重新下载
sudo dnf clean all
sudo dnf makecache
# 3. 检查依赖关系
sudo dnf distro-sync
# 4. 检查并修复仓库配置
sudo dnf repoquery --repoid=updates --queryformat="%{name}-%{version}-%{release}.%{arch}.rpm" | head -20
# 5. 查看日志
journalctl -xe | grep dnf
总结
从Ubuntu转到Fedora,最大的不适应就是包管理器的变化。但只要你理解了DNF的工作原理,掌握了几个关键技巧,其实挺顺手的。
几个核心要点记住就够了:
- 别直接用
rpm -ivh装包,用dnf install ./xxx.rpm - 装第三方软件前先加仓库,导入GPG密钥
- 依赖冲突时先看错误信息,再用
dnf solve分析 - 善用
dnf history来回滚操作 - RPM Fusion是Fedora上装非自由软件的必经之路
- Flatpak是原生包的补充,适合装那些仓库里没有的流行应用
刚开始可能会有点不适应,但用一段时间之后,你会发现DNF的依赖解析比APT更严谨,系统在遇到冲突时会明确告诉你问题在哪里,而不是像APT那样有时候静默降级。
Fedora对新手确实不够友好,但只要你愿意花时间理解它的工作方式,它会回报你一个稳定、现代、干净的系统。
