刚把 Fedora 装好,打开终端准备敲 dnf update 吧?结果那个转圈圈转了二十分钟,最后还给你甩一个红色的报错信息,那种感觉就像是大夏天跑完五公里发现没带水,憋屈又无奈。别急,这其实是 Fedora 用户(尤其是国内用户)必经的“成人礼”。
Fedora upstream 的服务器在美国或欧洲,咱们在国内访问,不仅速度慢,还经常断连。今天咱们不整那些虚头巴脑的教科书定义,我就当作是坐在你对面的一个老铁,跟你唠唠怎么给 Fedora 换个“加速器”,让 dnf 跑得像闪电一样快,顺便把那些让人头秃的报错给解决了。
为什么要折腾软件源?
首先你得明白,软件源(Repository,简称 repo)其实就是个巨大的超市货架。Fedora 官方的那些.rpm 安装包都摆在这个货架上。默认情况下,你的电脑会去“官方总店”买东西。
问题在于,从北京到美国的服务器,数据包要跨洋过海,还要经过好几个节点。这就好比你想买瓶可乐,得去总部的仓库提货,然后再找物流送过来。不仅时间长,有时候仓库还关门(服务器拥堵或断连)。
而“国内镜像源”,就像是你在楼下便利店买可乐。货是一样的,但价格(网络延迟)和速度(下载带宽)完全不是一个概念。Fedora 官方非常贴心,在国内部署了多个高质量的镜像站点,比如清华、中科大、阿里云等。我们要做的,就是把你的“购物清单”指向这些便利店。
第一步:诊断现状——你现在的源是谁?
在动手改配置之前,先看看你现在的处境。打开终端,输入以下命令,查看当前激活的软件源及其状态:
dnf repolist
你会看到类似这样的输出:
repo id repo name
fedora Fedora 39 - x86_64
updates Fedora 39 - Updates
如果名字里带着 fedora/project 或者地址栏显示的是 download.fedoraproject.org,那你大概率是在直接连接官方源。再试一下测速,看看延迟到底有多高:
curl -o /dev/null -s -w "%{time_connect} %{time_total}\n" https://download.fedoraproject.org/pub/fedora/linux/updates/
如果 time_total 大于 2 秒,甚至提示 curl: (28) Connection timed out,那别犹豫,马上换源。
第二步:选择适合你的国内镜像
国内有好几个靠谱的老牌镜像站,各有各的好处。我给你列个表,你可以根据自己的喜好和地理位置选一个:
| 镜像源 | 地址模板 | 特点 |
|---|---|---|
| 清华大学 (TUNA) | mirrors.tuna.tsinghua.edu.cn/fedora |
速度极快,稳定性好,社区支持强,很多开发者首选。 |
| 中国科学技术大学 (USTC) | mirrors.ustc.edu.cn/fedora |
华东地区体验极佳,学术圈常用,也很稳。 |
| 阿里云 (Aliyun) | mirrors.aliyun.com/fedora |
阿里云ECS用户福音,公网带宽大,通用性好。 |
| 华为云 (Huawei) | repo.huaweicloud.com/fedora |
西北和华北节点不错,适合特定区域用户。 |
我的建议: 除非你有特殊偏好,否则清华大学 TUNA 镜像通常是国内 Fedora 用户的“盲选最优解”。它的同步速度快,且官方维护文档最全。
第三步:一键换源——最简单粗暴的方法
Fedora 其实已经内置了自动选择最佳镜像的工具。你不需要手动去编辑那些复杂的 .repo 文件,只需运行一条命令:
sudo dnf install dnf-utils
sudo dnf config-manager --set-enabled *
sudo dnf swap --refresh repos-fedoraproject-org fedora-repos-ftp
等一下,上面这个命令其实是针对某些特定版本的。对于大多数普通用户,最省心、最官方推荐的做法是使用 dnf 自带的 reflector 工具或者简单的替换命令。
最稳妥的“清华源”替换方案:
我们直接用 sed 命令,把系统里所有的官方源地址替换成清华的镜像地址。这一步在终端里操作非常简单,但请务必逐字逐句复制,不要手抖:
# 1. 备份原有的 repo 文件(好习惯,以防万一)
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
# 2. 替换 Fedora 主仓库地址
sudo sed -i 's|^metalink=|#metalink=|g' /etc/yum.repos.d/fedora.repo
sudo sed -i 's|^#baseurl=http://download.example/pub/fedora/linux|baseurl=https://mirrors.tuna.tsinghua.edu.cn/fedora|g' /etc/yum.repos.d/fedora.repo
sudo sed -i 's|^baseurl=https://download.fedoraproject.org/pub/fedora/linux|baseurl=https://mirrors.tuna.tsinghua.edu.cn/fedora|g' /etc/yum.repos.d/fedora.repo
# 3. 替换 Fedora Updates 仓库地址
sudo sed -i 's|^metalink=|#metalink=|g' /etc/yum.repos.d/fedora-updates.repo
sudo sed -i 's|^#baseurl=http://download.example/pub/fedora/linux/updates|baseurl=https://mirrors.tuna.tsinghua.edu.cn/fedora/updates|g' /etc/yum.repos.d/fedora-updates.repo
sudo sed -i 's|^baseurl=https://download.fedoraproject.org/pub/fedora/linux/updates|baseurl=https://mirrors.tuna.tsinghua.edu.cn/fedora/updates|g' /etc/yum.repos.d/fedora-updates.repo
如果你用的是中科大的源,只需要把上面命令里的 https://mirrors.tuna.tsinghua.edu.cn 换成 https://mirrors.ustc.edu.cn 即可。
解释一下这些命令在做什么:
sudo cp ... .bak:这是给你的“后悔药”。万一你改坏了,或者想换回官方源,删掉新文件,把.bak重命名回来就行。sed -i 's|^metalink=|#metalink=|g':这一行很有意思。Fedora 默认使用metalink协议,它会让你连接到列表中“最快”的服务器。但在国内,这个列表有时候会抽风,连到一些慢得离谱或者根本无法访问的节点。注释掉metalink,强制指定baseurl,就是告诉 dnf:“别瞎猜了,就认准这个地址跑”。sed -i 's|^...|...|g':这是核心操作,把原来指向download.fedoraproject.org的地址,整体替换成清华镜像的地址。
改完之后,记得清空一下缓存,让系统重新索引:
sudo dnf clean all
sudo dnf makecache
这时候,如果你感觉到下载速度从几十 KB/s 跳到了几 MB/s,那就恭喜你,换源成功!
第四步:进阶配置——开启多线程和并行下载
换好源只是第一步,要让它跑得更快,还得优化 dnf 自身的配置。默认情况下,dnf 一次只下一个包,这太浪费了。
编辑 /etc/dnf/dnf.conf 文件:
sudo vi /etc/dnf/dnf.conf
在文件的 [main] 部分,添加或修改以下行:
[main]
# 同时下载的最大数量,建议设为 5 或 10
max_parallel_downloads=10
# 显示下载速度
showdupesfromrepos=true
# 如果下载失败,重试次数
retries=3
# 超时时间(秒)
timeout=60
这里有个小技巧:如果你在网络环境特别恶劣的情况下(比如移动热点),可以把 retries 设大一点,timeout 也适当增加,防止刚下两秒就断连。
第五步:常见问题解决指南
即使换了源,有时候也会遇到各种奇葩问题。别慌,这些问题我都经历过,给你整理几个“坑”和填坑方法。
问题一:GPG 密钥过期或校验失败
报错信息通常长这样:
The GPG keys listed for the "Fedora 39 - x86_64" repository are already installed but they are not correct for this package.
原因: Fedora 升级时,或者镜像源同步滞后,导致本地的 GPG 公钥和新的 rpm 包签名不匹配。
解决方法: 重新导入最新的签名密钥。
sudo dnf upgrade gpg-pubkey --nogpgcheck
# 或者更彻底一点,清除并重新导入
sudo dnf clean all
sudo rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-fedora-$releasever-$basearch
如果是Fedora 39及以上,也可以直接运行:
sudo dnf swap --refresh gpg-pubkey
问题二:dnf 报错 “Expired” 或 “Expired signature”
这说明本地的密钥过期了。Fedora 的密钥是有有效期的。
解决方法:
sudo dnf config-manager --setopt=reposdir=/etc/yum.repos.d --refresh
sudo dnf update gpg-pubkey
如果还不行,强制清除缓存并重新同步:
sudo rm -rf /var/cache/dnf
sudo dnf makecache
问题三:某些软件包下载失败,或者“No Module”错误
有时候你装一个包,提示 Module is not enabled 或者 No match for argument。
原因: Fedora 引入了 Modular(模块化)的概念。有些软件(如 Python, Node.js, Rust 等)有不同的版本流(Stream)。你可能需要显式地启用某个模块流。
解决方法: 先查看所有可用的模块流:
dnf module list
找到你需要的模块,比如 python39,然后启用它:
sudo dnf module enable python39
sudo dnf install python39
或者,直接安装不带版本后缀的包,让系统自动处理依赖:
sudo dnf install python3
问题四:镜像源地址 404 或无法连接
这通常发生在 Fedora 刚发布新版本(比如从 38 升级到 39)的过渡期。旧版本的 repo 文件可能还残留着,或者镜像站的同步有延迟。
解决方法:
- 检查
/etc/yum.repos.d/下是否有多个冲突的 repo 文件(比如同时存在fedora.repo和fedora-updates.repo的旧版本)。 - 清理所有 repo 配置,重新生成:
系统会自动重新下载最新的 repo 文件。sudo rm -f /etc/yum.repos.d/fedora*.repo sudo dnf makecache --refresh
第六步:如何验证源是否生效?
换了源,心里没底?跑个测试就知道了。
dnf repolist -v
在输出中,寻找 baseurl 字段。如果你看到的是 mirrors.tuna.tsinghua.edu.cn,那就实锤了。
另外,你可以尝试下载一个大一点的包,比如 vlc 或 firefox,观察下载速度。正常情况下,国内镜像源应该能跑满你的带宽,至少也要在几 MB/s 以上。如果还是只有几十 KB/s,那可能是你的 DNS 解析有问题,或者镜像源对你的 IP 做了限制(极少见,但可以换备用源试试)。
给新手的一点心里话
配置软件源这件事,乍一看挺吓人的,又是 sed 又是 bash 的。但其实,你就把它当成是给你的电脑找个“本地代购”。
我第一次接触 Linux 的时候,也是被那些红色的报错吓退了,甚至想过放弃。但当你亲手改掉那几行配置,看着 dnf 以飞快的速度下载完几百个更新包时,那种掌控感是无与伦比的。
如果你按照上面的步骤操作后依然遇到问题,不要急着骂街。第一步,先 sudo dnf clean all;第二步,检查一下网络连接;第三步,去 Fedora 中文社区 或者 V2EX 的 Fedora 节点 看看有没有人遇到类似的情况。
记住,Linux 的友好度,往往就藏在你解决这些小麻烦的过程中。下次再打开终端,输入 sudo dnf update,听着风扇轻微的运转声,看着进度条嗖嗖地涨,你会感谢今天认真读完了这篇指南的自己。
好了,去试试吧!如果有其他奇怪的报错,欢迎随时来问我,咱们一起研究。
