Fedora安装软件一直卡住报超时国内镜像源配错引发依赖问题手把手教你正确配置清华阿里中科大源
一、你是不是也遇到过这个烦人的问题?
先说说我(或者说很多Fedora用户)的真实经历吧——
你在终端里兴冲冲地敲下一行命令:
sudo dnf install vscode
然后……进度条开始缓缓移动,数字停在某个地方不动,时间一秒一秒过去,五分钟、十分钟……屏幕上始终挂着一行:
Retrieving metadata...
或者更惨的是,直接给你抛出一堆让你怀疑人生的错误:
Error:
Problem: package code-1.85.0-1705123456.el8.x86_64 requires ...
but none of the providers can be installed
- conflicting requests
- problem with installed package
你查了一圈网络,发现WiFi正常、浏览器能访问网页,就是DNF就是不动。这时候你开始怀疑人生,甚至想退回Ubuntu——别急,这其实大概率是镜像源配置出了问题,而且是比较典型的”配错源引发依赖地狱”。
这篇文章我会把整个排查过程、根本原因、正确的配置方法,以及依赖问题怎么解,全部掰开揉碎讲给你听。
二、先搞清楚:为什么会卡住、为什么会报依赖错误?
2.1 卡住/超时的本质原因
Fedora默认的官方仓库服务器在北美,国内访问延迟高、packet loss严重。DNF在尝试连接这些服务器时,如果没有合理配置超时和镜像,就会一直等待直到超时。
但更常见的情况是:你之前手动改过镜像源,结果改出问题了。比如:
- 把
fedora和updates的baseurl写混了 - 版本号对不上(比如Fedora 39用了Fedora 38的源地址)
- 同时启用了多个互相冲突的源
- 第三方源(RPM Fusion等)没有正确配置
这些都会导致DNF在metadata获取阶段卡死,或者拿到错误的元数据后进入依赖解析的死循环。
2.2 依赖错误的本质原因
DNF是一个依赖解析非常严格的包管理器。它的逻辑是这样的:
“你要装A,A需要B版本2以上,但当前启用的仓库里只有B版本1——那我装不了,报错。”
当你配错了源,可能出现的情况:
- 混用不同版本的repo文件:比如Fedora 39的系统里用了Fedora 38的源,导致某些包的版本编号对不上
- 启用了错误的架构源:比如x86_64系统用了aarch64的源
- 第三方源没有正确启用:RPM Fusion、Netflix源等没有配好,而你要装的软件恰好依赖它们
- 缓存污染:旧的repo metadata还在,新的源已经换了,两者冲突
三、先排查:你现在到底配置成了什么样?
在动手改任何东西之前,先看看你当前的配置。打开终端,依次运行:
# 查看所有已启用的仓库
dnf repolist all
# 查看仓库的详细配置
dnf config-manager --dump
# 查看当前Fedora版本(确认你用的是哪个codename)
cat /etc/fedora-release
输出的样子大概是这样:
Fedora Linux 39 (Workstation Edition)
Fedora 39的codename是rawhide以外的正式版本代号,后续配源要用到。记住这个版本号,后面每一步都要和它匹配。
接下来看看你的repo文件:
# 查看主仓库配置
ls /etc/yum.repos.d/
# 查看主要repo文件内容
cat /etc/yum.repos.d/fedora.repo
cat /etc/yum.repos.d/fedora-updates.repo
正常情况下,这两个文件里应该只有简单的配置,baseurl应该指向官方源或者你配置的镜像。如果你看到里面有一堆乱七八糟的url、或者版本号写错了,那基本就是问题所在。
四、正确配置国内镜像源:三种主流方案
下面我会分别介绍清华源、阿里源、中科大源的配置方法。三种任选其一即可,不建议混用。
重要提示:以下步骤需要root权限,请用
sudo执行。
方案一:清华大学开源镜像站(推荐,最稳定)
清华源是国内Fedora用户用得最多的,更新速度跟官方几乎同步。
第一步:备份原有配置
sudo cp /etc/yum.repos.d/fedora.repo /etc/yum.repos.d/fedora.repo.bak
sudo cp /etc/yum.repos.d/fedora-updates.repo /etc/yum.repos.d/fedora-updates.repo.bak
第二步:替换为清华源
假设你的Fedora版本是39(请根据你的实际版本修改下面的39):
# 编辑fedora.repo
sudo tee /etc/yum.repos.d/fedora.repo > /dev/null << 'EOF'
[fedora]
name=Fedora $releasever - $basearch
baseurl=https://mirrors.tuna.tsinghua.edu.cn/fedora/releases/$releasever/Everything/$basearch/os/
enabled=1
countme=1
metadata_expire=7d
repo_gpgcheck=0
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-fedora-$releasever-$basearch
skip_if_unavailable=False
[fedora-debuginfo]
name=Fedora $releasever - $basearch - Debug
baseurl=https://mirrors.tuna.tsinghua.edu.cn/fedora/releases/$releasever/Everything/$basearch/debug/
enabled=0
metadata_expire=7d
repo_gpgcheck=0
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-fedora-$releasever-$basearch
skip_if_unavailable=False
[fedora-source]
name=Fedora $releasever - Source
baseurl=https://mirrors.tuna.tsinghua.edu.cn/fedora/releases/$releasever/Everything/source/SRPMS/
enabled=0
metadata_expire=7d
repo_gpgcheck=0
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-fedora-$releasever-$basearch
skip_if_unavailable=False
EOF
# 编辑fedora-updates.repo
sudo tee /etc/yum.repos.d/fedora-updates.repo > /dev/null << 'EOF'
[updates]
name=Fedora $releasever - $basearch - Updates
baseurl=https://mirrors.tuna.tsinghua.edu.cn/fedora/updates/$releasever/Everything/$basearch/
enabled=1
countme=1
metadata_expire=7d
repo_gpgcheck=0
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-fedora-$releasever-$basearch
skip_if_unavailable=False
[updates-debuginfo]
name=Fedora $releasever - $basearch - Updates - Debug
baseurl=https://mirrors.tuna.tsinghua.edu.cn/fedora/updates/$releasever/Everything/$basearch/debug/
enabled=0
metadata_expire=7d
repo_gpgcheck=0
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-fedora-$releasever-$basearch
skip_if_unavailable=False
[updates-source]
name=Fedora $releasever - Source - Updates
baseurl=https://mirrors.tuna.tsinghua.edu.cn/fedora/updates/$releasever/Everything/source/SRPMS/
enabled=0
metadata_expire=7d
repo_gpgcheck=0
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-fedora-$releasever-$basearch
skip_if_unavailable=False
EOF
第三步:清理缓存并测试
sudo dnf clean all
sudo dnf makecache
sudo dnf update
如果这一步跑得很快(十几秒内完成),说明配置成功。
方案二:阿里云开源镜像站
阿里云的Fedora镜像也很不错,带宽充足,南方用户访问体验好。
替换fedora.repo
sudo tee /etc/yum.repos.d/fedora.repo > /dev/null << 'EOF'
[fedora]
name=Fedora $releasever - $basearch
baseurl=https://mirrors.aliyun.com/fedora/releases/$releasever/Everything/$basearch/os/
enabled=1
countme=1
metadata_expire=7d
repo_gpgcheck=0
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-fedora-$releasever-$basearch
skip_if_unavailable=False
[fedora-debuginfo]
name=Fedora $releasever - $basearch - Debug
baseurl=https://mirrors.aliyun.com/fedora/releases/$releasever/Everything/$basearch/debug/
enabled=0
metadata_expire=7d
repo_gpgcheck=0
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-fedora-$releasever-$basearch
skip_if_unavailable=False
[fedora-source]
name=Fedora $releasever - Source
baseurl=https://mirrors.aliyun.com/fedora/releases/$releasever/Everything/source/SRPMS/
enabled=0
metadata_expire=7d
repo_gpgcheck=0
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-fedora-$releasever-$basearch
skip_if_unavailable=False
EOF
替换fedora-updates.repo
sudo tee /etc/yum.repos.d/fedora-updates.repo > /dev/null << 'EOF'
[updates]
name=Fedora $releasever - $basearch - Updates
baseurl=https://mirrors.aliyun.com/fedora/updates/$releasever/Everything/$basearch/
enabled=1
countme=1
metadata_expire=7d
repo_gpgcheck=0
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-fedora-$releasever-$basearch
skip_if_unavailable=False
[updates-debuginfo]
name=Fedora $releasever - $basearch - Updates - Debug
baseurl=https://mirrors.aliyun.com/fedora/updates/$releasever/Everything/$basearch/debug/
enabled=0
metadata_expire=7d
repo_gpgcheck=0
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-fedora-$releasever-$basearch
skip_if_unavailable=False
[updates-source]
name=Fedora $releasever - Source - Updates
baseurl=https://mirrors.aliyun.com/fedora/updates/$releasever/Everything/source/SRPMS/
enabled=0
metadata_expire=7d
repo_gpgcheck=0
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-fedora-$releasever-$basearch
skip_if_unavailable=False
EOF
同样的,替换完后执行:
sudo dnf clean all
sudo dnf makecache
方案三:中国科学技术大学开源镜像站
中科大源在华东地区速度很快,也是很多高校用户的首选。
替换fedora.repo
sudo tee /etc/yum.repos.d/fedora.repo > /dev/null << 'EOF'
[fedora]
name=Fedora $releasever - $basearch
baseurl=https://mirrors.ustc.edu.cn/fedora/releases/$releasever/Everything/$basearch/os/
enabled=1
countme=1
metadata_expire=7d
repo_gpgcheck=0
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-fedora-$releasever-$basearch
skip_if_unavailable=False
[fedora-debuginfo]
name=Fedora $releasever - $basearch - Debug
baseurl=https://mirrors.ustc.edu.cn/fedora/releases/$releasever/Everything/$basearch/debug/
enabled=0
metadata_expire=7d
repo_gpgcheck=0
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-fedora-$releasever-$basearch
skip_if_unavailable=False
[fedora-source]
name=Fedora $releasever - Source
baseurl=https://mirrors.ustc.edu.cn/fedora/releases/$releasever/Everything/source/SRPMS/
enabled=0
metadata_expire=7d
repo_gpgcheck=0
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-fedora-$releasever-$basearch
skip_if_unavailable=False
EOF
替换fedora-updates.repo
sudo tee /etc/yum.repos.d/fedora-updates.repo > /dev/null << 'EOF'
[updates]
name=Fedora $releasever - $basearch - Updates
baseurl=https://mirrors.ustc.edu.cn/fedora/updates/$releasever/Everything/$basearch/
enabled=1
countme=1
metadata_expire=7d
repo_gpgcheck=0
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-fedora-$releasever-$basearch
skip_if_unavailable=False
[updates-debuginfo]
name=Fedora $releasever - $basearch - Updates - Debug
baseurl=https://mirrors.ustc.edu.cn/fedora/updates/$releasever/Everything/$basearch/debug/
enabled=0
metadata_expire=7d
repo_gpgcheck=0
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-fedora-$releasever-$basearch
skip_if_unavailable=False
[updates-source]
name=Fedora $releasever - Source - Updates
baseurl=https://mirrors.ustc.edu.cn/fedora/updates/$releasever/Everything/source/SRPMS/
enabled=0
metadata_expire=7d
repo_gpgcheck=0
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-fedora-$releasever-$basearch
skip_if_unavailable=False
EOF
同样执行:
sudo dnf clean all
sudo dnf makecache
五、配完源之后,依赖问题怎么解?
镜像源配对了,安装速度应该立竿见影。但如果你之前因为源配错已经搞乱了依赖关系,可能还是会遇到问题。以下是常见依赖错误的解法。
5.1 依赖冲突的通用解决思路
当DNF报依赖错误时,错误信息通常长这样:
Problem: conflicting requests
- nothing provides libfoo.so.1()(64bit) needed by package-bar-1.0-1.x86_64
这时候不要慌,按照以下步骤排查:
第一步:看清楚到底缺什么
# 加上 -v 参数,看更详细的依赖解析过程
sudo dnf install <包名> -v
第二步:看看当前有哪些仓库提供了这个依赖
# 搜索提供某个文件的包
dnf provides libfoo.so.1
第三步:检查是否有仓库冲突
# 看看哪些仓库是启用的,哪些禁用的
dnf repolist all
如果看到某个仓库既启用了又禁用,或者同一个包在多个仓库里有不同版本,这就是冲突来源。
5.2 常见依赖问题的具体解法
场景一:RPM Fusion没有配置
很多软件(比如ffmpeg、nvidia驱动、某些游戏)依赖RPM Fusion仓库。如果你之前手动配源的时候把RPM Fusion忘了,就会报依赖错误。
# Fedora 39 安装RPM Fusion(free + nonfree)
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
# 安装完后更新缓存
sudo dnf clean all
sudo dnf makecache
注意:
$(rpm -E %fedora)会自动展开成当前Fedora版本号,不需要手动改。
场景二:之前混用了不同版本的repo
比如你在Fedora 39上不小心用了Fedora 38的repo文件,会导致大量依赖版本对不上。
# 解决方法:直接还原到官方默认配置,再重新配镜像
sudo dnf config-manager --set-disabled fedora fedora-updates
sudo dnf config-manager --enable fedora fedora-updates
# 或者直接删除手动创建的repo文件,让系统回到默认
sudo rm /etc/yum.repos.d/fedora.repo /etc/yum.repos.d/fedora-updates.repo
# 然后重新用上面的方法配置镜像
场景三:缓存污染导致”幽灵依赖”
有时候源已经配对了,但DNF还在用旧的元数据,导致依然报错。
# 彻底清理
sudo dnf clean all
sudo rm -rf /var/cache/dnf/*
# 重新生成缓存
sudo dnf makecache
# 再尝试安装
sudo dnf install <包名>
场景四:第三方源冲突(如Netflix、VSCode等)
某些第三方源可能和官方源有版本冲突。比如你同时启用了RPM Fusion和某个已废弃的第三方源。
# 查看所有仓库状态
dnf repolist all
# 禁用可疑的第三方源
sudo dnf config-manager --disable <仓库名>
# 只保留必要的源
sudo dnf config-manager --enable fedora fedora-updates rpmfusion-free rpmfusion-nonfree
5.3 依赖问题解决不了的终极方案
如果以上方法都试过了还是报错,可以用DNF的内置工具来自动解决:
# 让DNF自动尝试修复依赖
sudo dnf distro-sync
# 如果还有问题,强制重新安装核心包
sudo dnf reinstall @core
distro-sync 是一个非常强大的命令,它会把系统上所有已安装的包版本和当前仓库中的版本对齐,相当于”重置”了所有包的版本状态。一般依赖地狱用它都能解决。
六、配置完成后如何验证是否成功?
配完源、解决完依赖问题,做以下几个检查来确认一切正常:
# 1. 检查仓库是否都正常启用
dnf repolist
# 2. 检查是否有仓库报错
sudo dnf check
# 3. 测试更新元数据(应该几秒钟内完成)
sudo dnf makecache
# 4. 测试安装一个小包(比如树莓派相关的小工具,或者随便一个不常用的包)
sudo dnf install htop --dry-run
# 5. 查看当前系统所有启用的仓库详情
dnf config-manager --dump | grep -E "(name|baseurl|enabled)"
正常的输出应该是:
dnf repolist显示fedora、fedora-updates、rpmfusion-free、rpmfusion-nonfree等都处于enabled状态dnf makecache在10秒内完成dnf install --dry-run显示”Transaction test succeeded”
七、一些额外的小技巧
7.1 如何查看自己最适合哪个镜像?
如果你不确定哪个源速度最快,可以用下面的命令测试:
# 安装curl用于测速
sudo dnf install curl
# 分别测试各源的速度
curl -o /dev/null -s -w "%{time_total}\n" https://mirrors.tuna.tsinghua.edu.cn/fedora/
curl -o /dev/null -s -w "%{time_total}\n" https://mirrors.aliyun.com/fedora/
curl -o /dev/null -s -w "%{time_total}\n" https://mirrors.ustc.edu.cn/fedora/
哪个返回的时间最短,就用哪个。不过一般清华和阿里都足够快了,不用太纠结。
7.2 系统升级后源要重新配吗?
Fedora每个大版本(38→39→40)的源路径里的版本号会变化。所以每次大版本升级后,建议检查一下repo文件里的$releasever是否正确展开:
# 查看releasever的实际值
rpm -E %fedora
如果升级后版本号变了,但你之前硬编码了具体版本号(比如写死了39而不是用$releasever),就需要手动修改repo文件。所以强烈建议用$releasever变量,不要硬编码版本号。
7.3 如何恢复默认官方源?
如果某天你想换回官方源,或者镜像出问题想临时切回:
# 恢复默认配置(Fedora自带)
sudo dnf config-manager --set-disabled fedora fedora-updates
sudo dnf config-manager --enable fedora fedora-updates
# 或者直接把repo文件删掉,系统会自动使用默认配置
sudo rm /etc/yum.repos.d/fedora.repo /etc/yum.repos.d/fedora-updates.repo
sudo dnf clean all
sudo dnf makecache
八、总结:遇到这类问题的排查口诀
最后送你一个排查口诀,遇到Fedora装软件卡住/依赖报错时按这个顺序来:
1. 先看版本对不对 —— rpm -E %fedora
2. 再看源配没配对 —— cat /etc/yum.repos.d/fedora.repo
3. 三清缓存再试 —— dnf clean all && dnf makecache
4. 四查RPM Fusion —— 确认free和nonfree都已启用
5. 五用distro-sync —— 解决依赖混乱的杀手锏
只要按这个流程走一遍,99%的”卡住”和”依赖错误”都能解决。
希望这篇教程能帮你摆脱Fedora装软件卡的痛苦。如果还有具体问题,可以在终端里贴出dnf repolist all和报错信息,进一步排查。记住,Fedora是个好系统,只是国内网络环境需要一点点适配——配对了源,它就是流畅的。
