最近折腾 Fedora 的朋友可能都遇到过这种崩溃时刻:sudo dnf update 跑一半突然报错,满屏红色的错误信息,要么显示 “Could not resolve hostname”,要么提示 “404 Not Found”,还有更玄学的 “Error: Failed to download metadata for repo ‘updates’“。那一刻,感觉自己的开发环境像是要散架一样。
别慌,这个问题我帮无数人解决过,从 Fedora 38 到最新的 Fedora 40,各个版本的坑都踩过。今天就把这套排查和修复流程彻底讲清楚,保证你能让系统重新跑起来,而且跑得比之前还快。
先搞清楚:为什么软件源会失败?
在动手修复之前,我们得先明白问题出在哪里。Fedora 默认使用官方源 download.fedoraproject.org 和 download.privatedns.org,这些服务器主要托管在美国。如果你在国内,或者网络环境比较复杂,遇到延迟高、连接超时、DNS 解析失败都是非常正常的。
除了网络问题,软件源配置失败还可能由以下几个原因导致:
- DNS 解析异常:系统无法将域名解析为 IP 地址
- 防火墙或代理限制:公司网络、学校网络或者个人防火墙拦截了 HTTP/HTTPS 请求
- 镜像源镜像同步延迟:某些第三方镜像站的软件包同步不及时,导致 404 错误
- GPG 密钥过期或损坏:验证签名时出错
- DNF 缓存污染:旧的缓存数据和新源不兼容
- 系统版本已停止维护:比如 Fedora 36 已经 EOL(结束支持),官方源已经下线
知道原因之后,我们一步步来排查。
第一步:快速诊断,定位问题根源
不要急着换源,先看看到底是什么错。打开终端,运行以下命令来获取详细的错误信息:
# 清除 DNF 缓存,排除缓存污染问题
sudo dnf clean all
# 刷新元数据,查看具体报错
sudo dnf makecache --verbose
如果这一步就报错了,把完整的错误信息记下来。常见的错误类型有几种,对应不同的解决方案:
类型一:DNS 解析失败
Could not resolve host: download.fedoraproject.org; Unknown error
这说明你的系统连域名都解析不了。先检查 DNS 设置:
# 查看当前 DNS 配置
systemctl status systemd-resolved
resolvectl status
# 测试 DNS 解析是否正常
nslookup download.fedoraproject.org
nslookup mirrors.aliyun.com
如果 DNS 解析失败,尝试修改 DNS 服务器为公共 DNS,比如阿里云 DNS(223.5.5.5)或 Google DNS(8.8.8.8):
# 使用 systemd-resolved 设置 DNS
sudo resolvectl dns enp3s0 223.5.5.5 8.8.8.8
# 注意:enp3s0 是你的网卡名称,用 ip addr 查看
类型二:连接超时
Failed to download metadata for repo 'updates': Timeout too long
这通常是网络不通或者被墙了。先测试连通性:
# 测试能否访问官方源
curl -I --max-time 10 https://download.fedoraproject.org/pub/fedora/linux/updates/40/Everything/x86_64/repodata/repomd.xml
# 测试能否访问国内镜像
curl -I --max-time 10 https://mirrors.aliyun.com/fedora/releases/40/Everything/x86_64/os/repodata/repomd.xml
如果官方源超时但阿里云镜像正常,那毫无疑问,换镜像源就对了。
类型三:404 Not Found
The repository 'updates' is missing gpg key
或者
Some repositories are not valid because...
这种情况多见于系统版本过旧,或者镜像同步不完整。如果用的是较老的 Fedora 版本(比如 37、38),官方已经停止支持,需要从 vault 源获取。
第二步:备份现有配置,安全第一
在修改任何配置文件之前,养成备份的好习惯。这样万一改错了,还能还原。
# 备份整个 repo 目录
sudo cp -r /etc/yum.repos.d /etc/yum.repos.d.bak.$(date +%Y%m%d)
# 查看当前有哪些 repo 文件
ls -la /etc/yum.repos.d/
你会看到类似这样的文件:fedorarepo.repo、fedora-updates.repo、fedora-modular.repo 等。这些就是控制软件源的核心配置文件。
第三步:替换为国内镜像源(最核心的解决方案)
对于国内用户来说,更换镜像源是最直接有效的解决方式。以下是几个稳定可靠的镜像站推荐:
- 阿里云镜像:
mirrors.aliyun.com,速度快,稳定性好 - 清华大学镜像:
mirrors.tuna.tsinghua.edu.cn,学术资源丰富 - 中科大镜像:
mirrors.ustc.edu.cn,南方地区速度优秀 - 华为云镜像:
mirrors.huaweicloud.com,新兴但质量不错
下面以阿里云镜像为例,提供两种替换方法。
方法一:一键脚本替换(适合大多数人)
你可以直接运行以下脚本来完成替换。这个脚本会自动检测你的 Fedora 版本,然后下载对应的镜像配置:
#!/bin/bash
# Fedora 软件源替换脚本 - 阿里云镜像
# 请确保以 root 权限运行此脚本
set -e
# 获取 Fedora 版本号
fedora_version=$(grep -oP '(?<=^VERSION_ID=)"?\K[^"]+' /etc/os-release)
echo "检测到 Fedora 版本: $fedora_version"
# 备份原有配置
sudo cp -r /etc/yum.repos.d /etc/yum.repos.d.backup.$(date +%Y%m%d%H%M%S)
echo "已备份原有配置到 /etc/yum.repos.d.backup.*"
# 删除原有 Fedora repo 文件
sudo rm -f /etc/yum.repos.d/fedora*.repo
echo "已删除原有 Fedora repo 文件"
# 下载阿里云镜像的 repo 配置
sudo curl -o /etc/yum.repos.d/fedora.repo https://mirrors.aliyun.com/fedora/repos/fedora.repo
sudo curl -o /etc/yum.repos.d/fedora-updates.repo https://mirrors.aliyun.com/fedora/repos/updates.repo
# 如果是 modular 版本,还需要替换 modular 源
if [ -f /etc/yum.repos.d/fedora-modular.repo ] || [ -f /etc/yum.repos.d/fedora-updates-modular.repo ]; then
sudo rm -f /etc/yum.repos.d/fedora-modular.repo
sudo rm -f /etc/yum.repos.d/fedora-updates-modular.repo
sudo curl -o /etc/yum.repos.d/fedora-modular.repo https://mirrors.aliyun.com/fedora/repos/modular.repo
sudo curl -o /etc/yum.repos.d/fedora-updates-modular.repo https://mirrors.aliyun.com/fedora/repos/updates-modular.repo
fi
echo "镜像源替换完成,正在刷新缓存..."
sudo dnf clean all
sudo dnf makecache
echo " done! 现在可以尝试更新系统了。"
保存为 switch-fedora-mirror.sh,然后执行:
chmod +x switch-fedora-mirror.sh
sudo ./switch-fedora-mirror.sh
方法二:手动编辑配置文件(适合喜欢掌控细节的用户)
如果你想自己掌控每一个细节,可以手动编辑 repo 文件。先看看默认的 repo 文件长什么样:
cat /etc/yum.repos.d/fedora.repo
你会看到类似这样的内容:
[fedora]
name=Fedora $releasever - $basearch
failovermethod=priority
#baseurl=https://download.fedoraproject.org/pub/fedora/linux/releases/$releasever/Everything/$basearch/os/
mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=fedora-$releasever&arch=$basearch
enabled=1
metadata_expire=7d
repo_gpgcheck=0
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-fedora-$releasever-$basearch
注意看 baseurl 那行被注释掉了,实际使用的是 mirrorlist。我们需要把 mirrorlist 注释掉,然后取消 baseurl 的注释并修改为阿里云的地址:
[fedora]
name=Fedora $releasever - $basearch
failovermethod=priority
baseurl=https://mirrors.aliyun.com/fedora/releases/$releasever/Everything/$basearch/os/
#mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=fedora-$releasever&arch=$basearch
enabled=1
metadata_expire=7d
repo_gpgcheck=0
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-fedora-$releasever-$basearch
同样地,fedora-updates.repo 也要做类似修改:
[fedora-updates]
name=Fedora $releasever - $basearch - Updates
failovermethod=priority
baseurl=https://mirrors.aliyun.com/fedora/releases/$releasever/Updates/Everything/$basearch/
#mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=updates-released-f$releasever&arch=$basearch
enabled=1
metadata_expire=7d
repo_gpgcheck=0
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-fedora-$releasever-$basearch
改完后,保存文件,然后执行:
sudo dnf clean all
sudo dnf makecache
方法三:使用 Fedora 官方推荐的换源工具
Fedora 社区其实提供了一个叫 dnf-config 或者更简单的 fedora-repos 包的管理方式。不过对于国内用户,最省事的还是用镜像站的预配置。
还有一个更现代的方法是使用 dnf config-manager:
# 禁用默认源
sudo dnf config-manager --set-disabled fedora fedora-updates
# 添加阿里云镜像源
sudo dnf config-manager --add-repo https://mirrors.aliyun.com/fedora/repos/fedora.repo
sudo dnf config-manager --add-repo https://mirrors.aliyun.com/fedora/repos/updates.repo
sudo dnf config-manager --set-enabled fedora fedora-updates
第四步:处理 EOL(已结束支持)版本的特殊问题
如果你用的是 Fedora 36 或更早的版本,情况会比较麻烦。因为这些版本已经停止维护,官方源已经将其移动到 vault 仓库。
先检查你的版本状态:
# 查看当前版本
cat /etc/os-release
# 检查版本是否 EOL
dnf module list
如果确认是 EOL 版本,需要将源指向 vault 仓库。以 Fedora 36 为例:
# 备份并清理
sudo rm -f /etc/yum.repos.d/fedora*.repo
# 使用阿里云的 vault 源
sudo cat > /etc/yum.repos.d/fedora.repo << 'EOF'
[fedora]
name=Fedora $releasever - $basearch - vault
failovermethod=priority
baseurl=https://mirrors.aliyun.com/fedora/vault/fedora-linux-$releasever/Everything/$basearch/os/
enabled=1
metadata_expire=14d
repo_gpgcheck=0
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-fedora-$releasever-$basearch
EOF
sudo cat > /etc/yum.repos.d/fedora-updates.repo << 'EOF'
[fedora-updates]
name=Fedora $releasever - $basearch - vault - Updates
failovermethod=priority
baseurl=https://mirrors.aliyun.com/fedora/vault/fedora-linux-$releasever/Updates/Everything/$basearch/
enabled=1
metadata_expire=14d
repo_gpgcheck=0
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-fedora-$releasever-$basearch
EOF
注意:EOL 版本只能安装该版本发布时存在的软件包,无法获得新的安全更新。强烈建议升级到支持的版本。
第五步:验证修复结果
源替换完成后,需要做一系列验证来确保一切正常:
# 1. 清理缓存
sudo dnf clean all
# 2. 重建缓存,观察是否有错误
sudo dnf makecache -v
# 3. 检查各个 repo 的状态
sudo dnf repolist -v
# 4. 试运行一次更新(不实际安装)
sudo dnf upgrade --refresh --downloadonly
如果 repolist 输出显示各个 repo 都正常启用,并且 makecache 成功生成元数据,那就说明换源成功了。
第六步:进阶优化——配置多镜像 failover
有时候单个镜像也可能出问题,比如某台镜像服务器宕机或者网络抖动。这时候可以配置多个镜像作为 failover。编辑 repo 文件,添加多个 baseurl:
[fedora]
name=Fedora $releasever - $basearch
failovermethod=priority
baseurl=https://mirrors.aliyun.com/fedora/releases/$releasever/Everything/$basearch/os/
https://mirrors.tuna.tsinghua.edu.cn/fedora/releases/$releasever/Everything/$basearch/os/
https://mirrors.ustc.edu.cn/fedora/releases/$releasever/Everything/$basearch/os/
enabled=1
metadata_expire=7d
repo_gpgcheck=0
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-fedora-$releasever-$basearch
这样 DNF 会按顺序尝试,第一个失败就自动试第二个,大大提高了可靠性。
第七步:常见陷阱与额外技巧
陷阱一:GPG 密钥问题
Public key for xxx.rpm is not installed
如果遇到这个问题,导入对应的 GPG 密钥:
sudo rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-fedora-$releasever-$basearch
陷阱二:proxy 设置干扰 有些公司网络需要走代理,但代理配置可能没有正确传递给 DNF。检查并设置代理:
# 查看当前代理设置
env | grep -i proxy
# 在 /etc/dnf/dnf.conf 中添加代理配置
sudo sh -c 'cat >> /etc/dnf/dnf.conf << EOF
proxy=http://your-proxy-server:port
proxy_username=username
proxy_password=password
EOF'
陷阱三:SELinux 阻止访问 极少数情况下,SELinux 策略可能会阻止 DNF 访问某些路径。如果怀疑是这个问题:
# 查看 SELinux 日志
sudo ausearch -m avc -ts recent
# 临时设置为 permissive 模式测试(不推荐长期这样做)
sudo setenforce 0
技巧:使用 dnf-utils 中的工具
# 查看哪些包可以更新
sudo dnf list updates
# 查看特定 repo 的详细信息
sudo dnf info <package-name>
# 使用 --nogpgcheck 临时跳过 GPG 检查(仅用于可信源)
sudo dnf install <package> --nogpgcheck
总结:一套完整的排查流程图
把上面的内容浓缩成一个清晰的排查流程:
- 先诊断:
sudo dnf clean all && sudo dnf makecache --verbose,看具体报什么错 - 测网络:
curl -I分别测试官方源和国内镜像,确认是哪个不通 - 备份配置:
cp -r /etc/yum.repos.d /etc/yum.repos.d.bak - 换镜像源:用阿里云或清华源替换默认配置
- 处理 EOL:如果版本过旧,指向 vault 仓库
- 验证结果:
dnf repolist -v和dnf makecache确认正常 - 优化配置:配置多镜像 failover,提升稳定性
记住,软件源配置问题在 Fedora 上非常常见,尤其是国内网络环境下。但只要按部就班地排查,绝大多数问题都能在十分钟内解决。换源之后,你会发现 dnf install 和 dnf update 的速度快得像闪电一样,开发环境的稳定性也大大提升。
如果按照以上步骤操作后仍然遇到问题,建议把完整的错误日志贴出来,比如 sudo dnf upgrade --refresh -v 的输出,这样可以更精准地定位问题。祝你的 Fedora 系统早日恢复顺畅运行!
