资讯动态

Rocky Linux 9.0 yum源一键切换到国内镜像:从官方源到上海交大的完整实践

发布时间:2026/9/21 3:00:06 来源:尧图企业网站定制
前天在一台刚装好的 Rocky Linux 9.0 上执行 dnf update进度条卡了好几分钟仍在个位数徘徊大部分时间都耗在跟官方源建立连接和等待响应上。后来我把 yum 源切成上海交大镜像站刷新缓存和拉取软件包的速度直接上了一个台阶。这篇就把这次更换国内 yum 源的完整过程记录下来包括替换脚本、为什么选交大、实测中有哪些坑给同样在 Rocky Linux 9.0 上折腾 yum 源的同学一个可以抄作业的参考。Rocky Linux 9.0 的 yum 源替换并不复杂本质就是把 /etc/yum.repos.d/ 下的官方仓库地址改成国内镜像站地址再重建缓存。但越是看似简单的操作越容易在细节上翻车。不同镜像站的目录结构、repo 文件里的 mirrorlist/metalink 开关、替换后是否顺手处理了缓存都会直接影响最终效果。下面我从仓库构成讲起把整个流程拆开揉碎。1. 换源前先搞清 Rocky Linux 9.0 的仓库构成和默认配置1.1 官方源为什么慢mirrorlist 与 metalink 的真实工作方式很多刚接触 Rocky Linux 的人有个误区以为 yum 配置里写的 baseurl 就是真正下载软件包的地址。实际上 Rocky Linux 9.0 默认的 repo 文件写得非常“聪明”它没有直接用某个固定的下载地址而是启用 mirrorlist 或 metalink 机制。当你在官方 repo 文件里看到mirrorlist或metalink开头的一行时yum 会先去请求这个动态列表接口拿到一批全球镜像地址再从里面挑选一个响应最快的进行下载。听起来很智能但在国内网络环境下这个动态列表接口本身可能响应很慢或者返回的镜像列表里包含大量境外地址最终选出来的那个地址并不一定快。这就是为什么你明明带宽很大yum 却慢得像蜗牛。Rocky 9.0 的官方 repo 文件里baseurl 默认是被注释掉的启用的是 mirrorlist。所以换源的第一个关键动作就是把 mirrorlist/metalink 关掉把注释掉的 baseurl 打开并改成国内镜像地址。1.2 Rocky Linux 9.0 的仓库家族BaseOS、AppStream、Extras 分别是什么Rocky Linux 9.0 的 yum 仓库不是单一仓库而是分成多个子仓库每个仓库对应不同类型的软件包。默认启用的主要是这几个BaseOS基础操作系统组件包括内核、核心工具链、网络服务等是系统运行的地基。AppStream应用流仓库包含大量用户态应用比如 Nginx、Python、PostgreSQL还支持多版本并行选择。Extras额外软件包通常是一些不在 BaseOS 和 AppStream 里的补充内容。CRBCodeReady Builder原本叫 PowerTools包含一些开发库和构建依赖默认不启用但编译软件时经常用得到。这几个仓库在 /etc/yum.repos.d/ 目录下对应多个 repo 文件命名是 rocky.repo、rocky-extras.repo、rocky-devel.repo、rocky-addons.repo 这类。换源时要做的就是把其中所有涉及官方下载地址的地方统一替换成镜像站地址而不是只改某一个文件。1.3 动手前先确认三件事版本、网络、备份换源前不要急着执行命令先用几分钟确认基础环境后面会省掉很多麻烦。第一确认系统版本。执行cat /etc/rocky-release看到 Rocky Linux release 9.0 就说明当前是 9.0。9.x 系列的操作方式基本一致但不同小版本在镜像站的目录名上可能有差异比如有的镜像站是 /9/ 目录有的是 /9.0/ 目录这个后面会详细说。第二确认网络连通性。如果你是在虚拟机里刚装好的系统可能还没配好静态 IP 和 DNS。yum 解析不了域名的时候即使换了源也一样报错。可以先执行ping mirror.sjtu.edu.cn或者curl -I https://mirror.sjtu.edu.cn测一下网络不通的话优先排查网络配置而不是yum配置。第三做好临时备份。虽然 sed 批量替换不是危险操作但万一你之前手动改过 repo 文件或者装了第三方源导致文件内容不标准替换后可能会出现意想不到的问题。把整个 repo 目录打包备份是最稳妥的做法。提示备份命令建议直接复制整个目录后续排查时可以对比原始文件和修改后文件的差异定位问题更快。2. 一键替换脚本从官方源切到上海交大镜像的完整做法2.1 为什么选择上海交大镜像站而不是直接改域名国内可用的 Rocky Linux 镜像站不少清华、阿里云、中科大、上海交大都有同步。我这次选择上海交大镜像站主要基于几个实际考量。上海交大镜像站mirror.sjtu.edu.cn是国内高校镜像站里维护频率比较高的Rocky Linux 仓库同步及时目录结构跟官方保持高度一致基本不需要做什么额外适配。另外它在公网和教育网都有不错的接入速度我用下来从 makecache 到实际拉包都比较稳。但这不意味着交大是唯一选择。换源方法的逻辑对所有镜像站通用区别只是域名和路径。如果你所在网络访问某个镜像站明显更快完全可以换成清华或阿里的地址。镜像站之间偶尔会有同步延迟碰到某个源 404 或软件包版本偏旧换一个源往往就能解决。2.2 sed 批量替换脚本拆解每一行到底在干什么下面这段脚本是这次实测用的核心内容负责把所有 Rocky 官方源替换成上海交大镜像地址#!/bin/bash # Rocky Linux 9.0 yum源一键替换为上海交大镜像站 set -e REPO_DIR/etc/yum.repos.d BACKUP_DIR$REPO_DIR/backup-$(date %Y%m%d%H%M%S) MIRRORhttps://mirror.sjtu.edu.cn/rocky # 1. 备份原仓库配置 mkdir -p $BACKUP_DIR cp $REPO_DIR/rocky*.repo $BACKUP_DIR/ # 2. 批量修改 Rocky 仓库文件 find $REPO_DIR -name rocky*.repo -type f | while read -r f; do sed -i \ -e s|^mirrorlist|#mirrorlist|g \ -e s|^metalink|#metalink|g \ -e s|^#baseurlhttp://dl.rockylinux.org/pub/rocky|baseurl$MIRROR|g \ -e s|^#baseurlhttps://dl.rockylinux.org/pub/rocky|baseurl$MIRROR|g \ -e s|http://dl.rockylinux.org/pub/rocky|$MIRROR|g \ -e s|https://dl.rockylinux.org/pub/rocky|$MIRROR|g \ $f done # 3. 清理并重建缓存 dnf clean all dnf makecache这段脚本里最关键的是 sed 的几个替换规则我逐个解释一下。前两条规则把mirrorlist和metalink开头的行注释掉。Rocky 9.0 的 repo 文件可能用的是其中一种两个都处理是为了兼容不同情况。注释掉之后yum 就不会再去请求动态列表接口了。第三条和第四条规则处理的是被注释的 baseurl 行。官方 repo 文件里的 baseurl 长这样#baseurlhttp://dl.rockylinux.org/pub/rocky/$releasever/BaseOS/$basearch/os/。这两条规则把行首的#去掉同时把官方域名替换成交大镜像域名这样 baseurl 就被激活了。第五条和第六条规则是整个脚本的保险丝把 repo 文件里所有出现官方域名的位置都替换掉。比如有些 repo 文件里 gpgkey 可能写了远程地址或者某些描述字段里带了官方域名这些都会被统一替换避免漏网之鱼。2.3 为什么用 $releasever 变量而不是写死版本号官方 repo 文件里的路径大量使用$releasever变量这个变量由 dnf 根据系统的 release 包自动解析在 Rocky Linux 9.0 上通常解析为9。所以最终访问的路径就是https://mirror.sjtu.edu.cn/rocky/9/BaseOS/x86_64/os/https://mirror.sjtu.edu.cn/rocky/9/AppStream/x86_64/os/https://mirror.sjtu.edu.cn/rocky/9/Extras/x86_64/os/保留变量而不是写成具体的 9.0主要好处是以后你执行dnf upgrade小版本升级时路径不需要再次修改。如果把 repo 文件里的版本号写死成 9.0升级之后很容易出现路径不存在的问题。如果你实在不放心 $releasever 解析出来的值可以在执行脚本后运行dnf repolist -v查看输出里的仓库基础地址确认结果。如果发现路径里解析出来的是 9.0而交大镜像站的目录是 9/把 $releasever 换成具体的 9 就行。不同镜像站对版本号目录的处理略有差异这也是换源时最容易遇到的问题之一。3. 缓存重建与实测验证makecache 只是第一步3.1 替换配置文件后为什么要 clean all很多教程只教改文件不教清理缓存导致替换后 yum 依然报错或者拉取旧数据。这是因为 dnf/yum 会把仓库元数据缓存到本地如果改完源不执行 clean all它可能还在用旧的缓存信息。dnf clean all的作用是清空所有仓库的元数据缓存和临时文件。执行完后再跑dnf makecache才会强制重新从新的镜像地址拉取仓库元数据。这两条命令必须连着执行只 clean 不 makecache后续安装软件时照样会报错只 makecache 不 clean则可能拿到旧缓存。我在交大镜像上实测clean 和 makecache 整个过程大概是十几秒比官方源的几分钟快了太多。看到类似下面这样的输出就说明仓库已经通过新源正常工作了Rocky Linux 9 - BaseOS 5.6 MB/s | 1.4 MB 00:00 Rocky Linux 9 - AppStream 7.8 MB/s | 6.5 MB 00:00 Rocky Linux 9 - Extras 2.1 MB/s | 14 kB 00:003.2 实测安装验证用一个小工具确认源真的可用makecache 成功只能说明仓库元数据拉下来了不代表软件包也能正常下载。我习惯找一个体积适中、依赖不算太少的软件包做真实安装测试这次拿的是tree命令后面想装 zabbix 或 docker 这类依赖很多的软件时源的响应速度差别会更明显。dnf install -y tree安装过程会显示从哪个仓库获取、下载速度如何。如果看到下载地址是 mirror.sjtu.edu.cn并且速度明显快于之前的官方源说明换源已经生效。我这里下载 RPM 包的速度从原来的几十 KB/s 提升到了几 MB/s整个安装过程几乎是瞬间完成。实测完tree之后我还会顺手跑一次dnf repolist确认所有默认启用的仓库都处于 enabled 状态。如果某个仓库显示 disabled检查一下是不是之前调整过 enable 参数或者仓库文件本身格式有误。3.3 用 repolist -v 确认 baseurl 真的指向交大光看安装成功还不够我建议再执行一条命令做最终确认dnf repolist -v | grep -E Repo-id|Repo-baseurl输出里会显示每个仓库的详细信息重点看 baseurl 这一行。正常的输出应该是这样的Repo-baseurl : https://mirror.sjtu.edu.cn/rocky/9/BaseOS/x86_64/os/只要 baseurl 开头是 mirror.sjtu.edu.cn而不是 dl.rockylinux.org就说明替换成功。如果这里显示的还是官方地址大概率是 sed 替换时出了错比如 repo 文件里原本启用的是 metalink 而不是 mirrorlist而你的替换规则没有覆盖到。4. 替换过程中最容易翻车的几个细节4.1 小版本目录差异为什么你访问的交大路径可能是 404这个问题是我觉得最值得单独拿出来讲的。Rocky Linux 9.x 系列在镜像站上的目录组织方式并不完全统一。大部分镜像站采用 /rocky/9/ 这种主版本目录但少数镜像站会保留 /rocky/9.0/ 的小版本目录或者在仓库内使用不同的层级结构。如果 makecache 时报 404 错误或者下载元数据失败先不要怀疑脚本有问题直接用浏览器或者 curl 打开镜像站的目录看看实际结构curl -s https://mirror.sjtu.edu.cn/rocky/ | grep -oE href[^]*根据返回结果确认到底是 9/ 还是 9.0/。如果发现你的源路径跟实际目录对不上把 repo 文件里的 baseurl 路径改成实际存在的路径就行。这个排查思路对任何镜像站都适用因为不同镜像站的目录命名确实存在差异。4.2 baseurl 注释没去掉最常见的“改了等于没改”翻车现场我在帮别人排查 yum 源问题时发现超过一半的人替换完发现还是在访问官方源原因是只替换了域名但 baseurl 前面的#注释符没去掉。baseurl 一旦被注释yum 就自动回退到 mirrorlist/metalink 的默认逻辑最终访问的还是官方动态列表。常见的错误命令是这样写的# 只替换域名没去掉注释也没关 mirrorlist sed -i s|dl.rockylinux.org/pub/rocky|mirror.sjtu.edu.cn/rocky|g /etc/yum.repos.d/rocky.repo这条命令执行完文件里确实出现了交大的域名但 baseurl 仍然是注释状态mirrorlist 仍然处于启用状态。看起来像换成功了实际根本没生效。所以替换时一定要同时处理三件事注释掉 mirrorlist/metalink、去掉 baseurl 前面的注释、替换域名。缺少任何一步结果都不对。这也是我在脚本里用多条 sed 规则的原因——宁可多处理一次也不能留下漏网之鱼。4.3 GPG 校验失败为什么 Rocky 的密钥一般不用额外处理换源后首次安装软件如果提示Public key for xxx is not installed或者GPG key retrieval failed通常是因为仓库的 GPG key 地址不可访问或者密钥没有被导入。Rocky Linux 9.0 的默认 repo 文件里gpgkey 的写法比较人性化指向的是本地路径gpgkeyfile:///etc/pki/rpm-gpg/RPM-GPG-KEY-Rocky-9因为是本地文件路径所以替换源域名时不会影响 gpgkey 的解析这也是 Rocky 相对某些旧发行版换源更省心的原因。如果是从其他发行版迁移过来的老手可能会习惯性地去修改 gpgkey 的域名在 Rocky 上反而没必要。不过有一个例外情况如果你安装的第三方源把远程 URL 写在了 gpgkey 里比如下载.fedoraproject.org 这类地址那么首次安装时仍然需要联网拉取密钥。这时候只要网络能正常访问就不会有问题万一拉取失败把远程路径改成对应的本地密钥文件路径即可。5. EPEL 源与扩展仓库也一起换掉5.1 EPEL 仓库的替换方式域名跟 Rocky 官方源不一样Rocky Linux 9.0 装完系统之后大部分人还会安装 EPELExtra Packages for Enterprise Linux仓库里面包含大量不在默认仓库里的实用软件包。EPEL 的 repo 文件由epel-release包提供安装方式很简单dnf install -y epel-release装完后/etc/yum.repos.d/ 下会多出 epel.repo 和 epel-testing.repo。EPEL 的默认配置也是使用 metalink而且域名是 download.example.com 和 mirrors.fedoraproject.org跟 Rocky 官方源不是同一个域名所以不能沿用上面替换 Rocky 源的方法。我的做法是单独对 epel 文件执行一次替换sed -i \ -e s|^metalink|#metalink|g \ -e s|^mirrorlist|#mirrorlist|g \ -e s|^#baseurlhttps://download.example/pub/epel|baseurlhttps://mirror.sjtu.edu.cn/epel|g \ -e s|https://download.example/pub/epel|https://mirror.sjtu.edu.cn/epel|g \ -e s|https://mirrors.fedoraproject.org|https://mirror.sjtu.edu.cn|g \ /etc/yum.repos.d/epel*.repo然后同样执行dnf clean all dnf makecache。如果你还想用 EPEL 的测试仓库把 epel-testing.repo 也一并处理即可。5.2 CRB 仓库编译软件时高频使用的隐藏仓库Rocky Linux 9.0 的 CRB 仓库CodeReady Builder默认是关闭的但如果你经常自己编译软件几乎一定会用到它。很多开发库和构建依赖只在 CRB 里才有。启用并换源可以分两步走。先启用仓库dnf config-manager --set-enabled crb然后调整 CRB 的 repo 文件。CRB 的配置在 rocky.repo 里所以前面的一键替换脚本其实已经把它覆盖了但前提是你执行脚本前先启用了 crb。如果没启用repo 文件里的 enabled0 会让 yum 跳过它换没换都无感。启用后同样执行 makecache 验证一下。编译类软件对依赖完整性要求很高如果 CRB 源指向的是官方地址速度太慢configure 和 make 阶段会非常痛苦换源后整个编译体验会有明显改善。5.3 离线环境补充本地 yum 源跟在线镜像源怎么共存换源的话题延伸到内网环境还有一个常见需求是配置本地 yum 源。如果你在隔离网络或者离线机房无法访问外网镜像站就需要把 ISO 镜像挂载后做成本地源。做法不复杂把 Rocky Linux 9.0 的 ISO 挂载到 /mnt/iso然后在 /etc/yum.repos.d/ 下新建一个 local.repo 文件写入类似下面的内容[local-baseos] nameLocal Rocky BaseOS baseurlfile:///mnt/iso/BaseOS gpgcheck0 enabled1 [local-appstream] nameLocal Rocky AppStream baseurlfile:///mnt/iso/AppStream gpgcheck0 enabled1这里有个认识误区需要澄清本地源和在线镜像源是可以同时存在的并不是非此即彼。yum 会自动汇总所有启用仓库里的软件包信息下载时根据优先级和版本情况选择合适的仓库。内网有在线缓存服务器时可以同时挂在线源和本地源本地源没有的包自动去在线源拉这样兼顾速度和完整性。如果你的系统里同时存在多个源指向同一个软件包安装时想固定用某一个源可以安装 yum-plugin-priorities 插件设置优先级数字数字越小优先级越高。这个插件在混合源的场景下非常好用能避免不同源之间因为同名包版本竞争导致安装结果不确定。6. 不同镜像站的对比与我的最终选择建议6.1 上海交大、清华 TUNA、阿里云三个源的实际体验差异换源这事没有绝对的“最好”只有“最适合当前网络环境”。我这次主要对比了三个国内主流镜像站简单说说各自的感受。上海交大镜像站的目录结构跟官方保持得很一致同步延迟控制得不错华东地区访问速度很有优势我实测 makecache 和拉包都比较稳定。清华 TUNA 是老牌镜像站仓库全、同步快而且提供了丰富的镜像列表如果你在做开发环境搭建顺手还能解决很多其他软件的下载问题。阿里云镜像站的优势是带宽资源充足在 IDC 机房或者云服务器上访问速度通常非常快如果你用的是阿里云 ECS优先用阿里云的源会是更合理的选择。三个源在 Rocky Linux 9.0 的替换逻辑上完全相同只需要把脚本里的域名部分换成对应的镜像地址。真正影响选择的变量是你的实际网络环境建议花两分钟分别测一下 curl 速度哪个快用哪个。6.2 换源后保持更新习惯不要只顾着改不验证我见过不少同学换完源之后就不管了几个月后跑dnf update突然报错才发现镜像站的同步出了问题或者网络环境变了。换源不是一劳永逸的事镜像站偶尔也会出现同步延迟、目录结构调整、甚至临时不可用的情况。所以我的习惯是换源后定期执行一次dnf check-update不实际更新系统但能确认仓库元数据拉取正常。如果发现某个仓库开始报错先用dnf repolist确认是哪个仓库的问题再决定是换回官方源还是换另一个镜像站。镜像站之间是可以随时切换的改一下 repo 文件里的域名再 makecache 就行成本很低。6.3 我的最终选择为什么保留了交大作为主力源测了一圈之后我最后把主力源定在了上海交大镜像站同时保留了一个备选源的切换思路写在笔记里。理由很简单交大源在我这个网络环境下速度和稳定性综合表现最好而且它的 Rocky Linux 仓库目录跟官方保持高度一致减少了很多因为目录结构差异带来的额外适配工作。当然如果你的网络访问清华更快或者你本身就在阿里云上跑了几年 Rocky完全没有必要为了“用交大”而用交大。换源的方法和思路才是重点域名只是参数。最后说一个我自己的习惯每次换源后我都会用一个平时不怎么装的软件做一次真实安装测试比如htop或iotop这比只看 makecache 成功更能验证整个源是否真的可用。只有真正跑通一次 dnf install我才敢放心在那台机器上进行后续操作。这个习惯帮我避免过好几次“源看着换好了实际安装软件时才发现异常”的尴尬建议你也试试。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价