前两天我在搞Fedora 39的时候,差点被dnf的报错给整破防了。明明只是想装个vim或者git,结果终端里红的一片,提示Failed to download metadata for repo 'updates',时间卡在那儿一动不动,跟蜗牛爬似的。对于习惯了国内访问速度的小伙伴来说,这简直是灾难——毕竟国外的服务器就像在跨洋海运,慢得让人怀疑人生。
其实,这99%的情况都不是你的网络有多烂,而是你的Fedora还在固执地连接默认的官方镜像站。今天咱们就来聊聊怎么把这个“慢加载”的问题彻底解决掉,核心思路只有一个:把源换成国内的,尤其是清华大学的TUNA镜像,速度快到飞起。
为什么Docker和DNF一样慢?
在深入配置之前,我得先澄清一个小误区。标题里提到了dnf报错,但很多时候大家遇到“安装慢、装不上”的问题,其实混淆了系统包管理器和容器运行时这两个概念。
如果你是在Docker容器里或者宿主机上尝试拉取镜像,或者在容器内使用apt/yum/dnf,速度都会受影响。但本文主要聚焦于宿主机层面的Fedora系统配置。如果你的问题是Docker拉镜像慢,那是另一回事(需要配Docker Hub镜像加速器),但如果你运行的是sudo dnf install xxx然后报错或超时,那就是源的问题。
我遇到的那个典型报错是这样的:
$ sudo dnf update
Downloading metadata...
Fedora 39 - x86_64 45 MB/s | 25 MB 00:00
Fedora 39 openh264 (From Cisco) - x86_64 11 kB/s | 4.0 kB 00:00
Fedora 39 - x86_64 - Updates 22 MB/s | 18 MB 00:00
...
Error: Failed to download metadata for repo 'updates': Cannot prepare internal mirrorlist: Timeout was reached: [metalink.fedoraproject.org:443] Operation too slow. Less than 1000 bytes/sec transferred the last 30 seconds
看到最后那个Timeout was reached了吗?这就是典型的“干着急”信号。官方源对国内用户来说,延迟高且不稳定,尤其是更新包(updates)和源码包(source)。
第一步:备份现有的源配置
在进行任何修改之前,作为一个严谨的“技术控”,我们首先要做的是备份。万一配错了,我们还有后悔药吃。Fedora的源配置文件通常位于/etc/yum.repos.d/目录下。
打开你的终端,执行以下命令:
# 进入源配置目录
cd /etc/yum.repos.d/
# 创建一个备份目录,按日期命名,方便日后追溯
sudo mkdir -p backup-$(date +%Y%m%d)
# 备份所有repo文件
sudo cp *.repo backup-$(date +%Y%m%d)/
# 查看备份是否成功
ls -lh backup-$(date +%Y%m%d)/
这一步非常关键。想象一下,如果你直接删除了文件而不是备份,下次想恢复原始状态就得去网上找半天。备份是工程师的基本素养,对吧?
第二步:了解Fedora的仓库结构
在替换源之前,我们需要知道Fedora有哪些主要的仓库。默认情况下,你的*.repo文件里可能包含以下几个核心部分:
- fedora:主仓库,包含最新发布的稳定软件包。
- updates:更新仓库,包含安全补丁和bug修复。这是最容易卡住的地方,因为更新包频繁且量大。
- fedora-source:源码仓库,一般用户用不到,但有时会被误启。
- fedora-debuginfo:调试信息仓库,同样,普通用户禁用它能加快速度。
- copr:社区仓库,比如你之前装的某些第三方软件。
清华TUNA镜像站通常只提供fedora和updates的核心仓库,以及一些常用的非自由软件仓库(如rpmfusion)。因此,我们的策略是启用清华的官方源,禁用那些不常用的源。
第三步:配置清华TUNA镜像源
现在进入正题。我们有两种主要方式来配置源:手动编辑文件和使用dnf config-manager工具。推荐使用dnf config-manager,因为它更安全、更直观,不容易改坏语法。
方法一:使用 dnf config-manager(推荐)
首先,确保你的系统已经安装了dnf-plugins-core,这是config-manager所属的包。
sudo dnf install dnf-plugins-core -y
接下来,我们可以添加清华的镜像源。清华TUNA为Fedora提供了非常完善的镜像服务。
# 添加 Fedora 主仓库的清华镜像
sudo dnf config-manager --add-repo https://mirrors.tuna.tsinghua.edu.cn/fedora/releases/39/Everything/x86_64/os/
# 添加 Fedora Updates 仓库的清华镜像
sudo dnf config-manager --add-repo https://mirrors.tuna.tsinghua.edu.cn/fedora/updates/releases/39/Everything/x86_64/
等等,你可能会发现上面的链接有点问题。其实,更简单且官方推荐的做法是直接编辑或生成一个指向清华镜像的repo文件。让我给你展示一个更稳妥、更常用的脚本化方案,这也是我在社区里推广最多的方法。
方法二:直接替换/创建Repo文件(更彻底)
我们可以直接创建一个名为fedora-tuna.repo的文件,并禁用默认的官方repo文件。
首先,让我们看看默认的repo文件长什么样:
cat /etc/yum.repos.d/fedora.repo
你会看到类似这样的内容:
[fedora]
name=Fedora $releasever - $basearch
failovermethod=priority
#baseurl=http://download.fedoraproject.org/pub/fedora/linux/releases/$releasever/Everything/$basearch/os/
metalink=https://mirrors.fedoraproject.org/metalink?repo=fedora-$releasever&arch=$basearch
enabled=1
countme=1
metadata_expire=7d
...
注意那个metalink,它会自动选择最近的服务器,但默认情况下这个选择对于国内用户并不总是最优的。
现在,我们来创建清华的配置文件。你可以直接复制粘贴以下内容到终端:
sudo tee /etc/yum.repos.d/fedora-tuna.repo << 'EOF'
[fedora]
name=Fedora $releasever - $basearch
failovermethod=priority
baseurl=https://mirrors.tuna.tsinghua.edu.cn/fedora/releases/$releasever/Everything/$basearch/os/
enabled=1
countme=1
metadata_expire=7d
repo_gpgcheck=0
type=rpm
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-fedora-$releasever-$basearch
skip_if_unavailable=False
[updates]
name=Fedora $releasever - $basearch - Updates
failovermethod=priority
baseurl=https://mirrors.tuna.tsinghua.edu.cn/fedora/updates/releases/$releasever/Everything/$basearch/
enabled=1
countme=1
metadata_expire=7d
repo_gpgcheck=0
type=rpm
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-fedora-$releasever-$basearch
skip_if_unavailable=False
EOF
这里有个小细节需要解释一下:为什么我要用baseurl而不是metalink?metalink是一个URL集合,客户端需要先去下载这个列表,然后再选择最快的服务器。这个过程在连接不稳定或DNS解析慢的时候,会浪费时间。而baseurl直接指定了固定的清华服务器地址,虽然少了一点“动态选优”的灵活性,但在国内,清华服务器本身就是最优解之一,速度极且稳定。
第四步:禁用默认源,启用新源
刚才我们创建了fedora-tuna.repo,但原来的fedora.repo和fedora-updates.repo还在系统中。如果两者都启用,dnf可能会感到困惑,或者优先使用旧的慢速源。
我们需要禁用默认的官方源:
# 禁用默认的fedora.repo
sudo dnf config-manager --set-disabled fedora
# 禁用默认的fedora-updates.repo
sudo dnf config-manager --set-disabled fedora-updates
如果你还安装了其他额外的源(比如RPM Fusion,这是Fedora用户装机必备的非自由软件源),也需要检查它们是否在使用默认的metalink。RPM Fusion的国内镜像支持通常也不错,我们可以单独为它配置清华镜像。
# 假设你已经安装了rpmfusion-free.repo
sudo dnf config-manager --set-disabled rpmfusion-free
sudo dnf config-manager --set-disabled rpmfusion-nonfree
# 添加RPM Fusion的清华镜像(如果需要)
sudo dnf config-manager --add-repo https://mirrors.tuna.tsinghua.edu.cn/rpmfusion/fedora/rpmfusion-free-release-$(rpm -E %fedora).noarch.rpm
注意:RPM Fusion的镜像地址可能随版本变化,建议去清华TUNA官网确认最新的链接格式,或者直接使用上面的命令,脚本会自动解析%fedora变量。
第五步:清理缓存并验证
配置完成后,最关键的一步是清理旧的元数据缓存。dnf会把之前的源信息缓存起来,如果不清理,它可能还在读取旧的、慢速的源信息,导致配置不生效。
# 清理所有缓存
sudo dnf clean all
# 重建缓存
sudo dnf makecache
这时候,你应该能看到终端输出大量的Downloading metadata信息,而且速度应该从原来的几KB/s飙升到几MB/s甚至更高。
$ sudo dnf makecache
Fedora 39 - x86_64 25 MB/s | 25 MB 00:01
Fedora 39 - x86_64 - Updates 18 MB/s | 18 MB 00:01
Dependencies resolved.
...
Metadata cache created.
看到那个速度了吗?这就是我们想要的。
为了验证源是否真的生效了,我们可以运行一个查询命令:
# 查看当前启用的仓库及其状态
sudo dnf repolist
输出应该类似于:
repo id repo name status
fedora Fedora 39 - x86_64 68,450
updates Fedora 39 - x86_64 - Updates 45,230
如果repolist里显示的是fedora和updates,并且数量巨大,说明清华源已经成功接管。如果还看到fedora-updates之类的旧ID,说明你之前的禁用步骤没做干净,需要再次检查。
常见问题与排查技巧
尽管这个过程看起来很顺利,但在实际应用中,可能会遇到一些“小插曲”。下面我列举几个常见的坑,以及我是如何解决的。
1. 报错:GPG key is not installed
有时候,禁用repo_gpgcheck或者因为权限问题,系统会提示GPG密钥缺失。
Error: Failed to download metadata for repo 'fedora':
GPG check of /var/cache/dnf/fedora-xxxxx/... failed:
error [1]: key import failed
解决方案:
重新导入GPG密钥。Fedora的密钥通常位于/etc/pki/rpm-gpg/。
sudo rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-fedora-$releasever-$basearch
如果不确定路径,可以搜索一下:
sudo find /etc/pki/rpm-gpg -name "*fedora*"
2. 报错:Cannot download repomd.xml
这可能意味着网络仍然无法连接到清华服务器,或者DNS解析有问题。
Error: Failed to download metadata for repo 'fedora':
Cannot prepare internal mirrorlist: Timeout was reached:
[mirrors.tuna.tsinghua.edu.cn:443] Operation too slow.
解决方案:
- 检查网络:先用
ping mirrors.tuna.tsinghua.edu.cn看看连通性。 - 切换镜像:如果清华的443端口被墙或者拥堵,可以尝试中科大(USTC)镜像作为备选。
sudo dnf config-manager --add-repo https://mirrors.ustc.edu.cn/fedora/releases/$releasever/Everything/$basearch/os/ - 使用HTTP而非HTTPS:极少数情况下,HTTPS握手可能慢,可以尝试将
baseurl中的https://改为http://(注意安全性,仅限内网或信任网络)。
3. 想保留官方源作为备用?
有些用户担心清华源万一挂了怎么办。其实,dnf支持failovermethod=priority,但这通常用于metalink内部。对于手动配置的baseurl,我们可以在同一个repo文件中定义多个baseurl,用逗号分隔,或者使用failovermethod=priority配合多个baseurl行(虽然标准repo文件格式对多baseurl支持有限,通常建议用metalink)。
更简单的做法是:不要完全删除官方repo文件,只是将其禁用。这样,如果清华源出问题,你可以随时重新启用官方源,虽然慢,但至少能用。
# 临时启用官方源测试
sudo dnf config-manager --set-enabled fedora
sudo dnf makecache
测试完记得再禁用它,换回清华源。
进阶:让配置持久化且自动化
如果你经常重装系统,或者有多台Fedora机器,手动复制粘贴repo文件太麻烦了。我们可以写一个简单的Shell脚本,一键完成配置。
创建一个名为setup-fedora-mirrors.sh的文件:
#!/bin/bash
set -e
echo "=== Fedora 清华镜像配置脚本 ==="
echo "正在备份现有源配置..."
sudo mkdir -p /etc/yum.repos.d/backup-$(date +%Y%m%d)
sudo cp /etc/yum.repos.d/*.repo /etc/yum.repos.d/backup-$(date +%Y%m%d)/ 2>/dev/null || true
echo "正在安装dnf-plugins-core..."
sudo dnf install dnf-plugins-core -y
echo "正在禁用官方默认源..."
sudo dnf config-manager --set-disabled fedora fedora-updates
echo "正在添加清华TUNA镜像源..."
sudo dnf config-manager --add-repo https://mirrors.tuna.tsinghua.edu.cn/fedora/releases/$releasever/Everything/x86_64/os/
sudo dnf config-manager --add-repo https://mirrors.tuna.tsinghua.edu.cn/fedora/updates/releases/$releasever/Everything/x86_64/
echo "正在清理并重建缓存..."
sudo dnf clean all
sudo dnf makecache
echo "=== 配置完成! ==="
echo "当前启用的仓库:"
sudo dnf repolist
赋予执行权限后,以后每次重装系统,只需运行这一行命令:
chmod +x setup-fedora-mirrors.sh
./setup-fedora-mirrors.sh
这样,你就能在几分钟内把一个“龟速”的Fedora系统,变成“闪电般”的快速体验。
总结:从报错到畅快的距离
回头看,从最初的dnf报错、安装缓慢,到最终配置好清华镜像源、秒级更新,中间其实只隔了一层窗户纸——源的选择。
Fedora作为一个优秀的Linux发行版,其软件生态非常活跃,但官方服务器对非北美地区的用户确实不够友好。通过简单的配置替换,我们不仅解决了安装慢的问题,还提升了系统整体的稳定性和响应速度。
记住这几个关键点:
- 先备份,这是铁律。
- 禁用旧源,启用新源,避免冲突。
- 清理缓存,让配置立即生效。
- 遇到问题先ping,确认网络连通性,再考虑是否是源的问题。
希望这篇教程能帮到正在被Fedora安装问题困扰的你。如果还有什么疑问,欢迎在评论区留言,咱们一起探讨。毕竟,技术的乐趣就在于解决一个个具体的问题,然后分享给需要的人。
