十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Rocky Linux 9.0更换国内yum源:上海交大镜像站实战配置

Rocky Linux 9.0更换国内yum源:上海交大镜像站实战配置 装完 Rocky Linux 9.0 之后我做的第一件事不是配置桌面环境也不是装开发工具而是先给 yum 源“换血”。原因很简单默认的 yum/dnf 源指向的是国外 CDN在办公室里直连dnf makecache经常卡在 0%偶尔还会直接 timeout。这种体验别说生产环境了就连日常装个vim都让人烦躁。折腾几天之后我把目光锁定到国内高校镜像站综合速度、稳定性和同步频率最后一直用的是上海交大镜像站前后给几台 Rocky Linux 9.0 的服务器批量换源效果比较理想。这篇文章就完整记录一下我的实测过程和踩坑记录包含手动修改 repo 文件、一键替换脚本以及几个最容易出问题的细节。你手头不管是刚装好的 Rocky Linux 9.0还是从 CentOS 迁移过来的老机器照着做基本都能一次搞定。1. 为什么要换源yum 机制与镜像站选型分析很多刚接触 Linux 的朋友容易把“换源”当成一个神秘操作其实它背后解决的问题非常朴素yum/dnf 这个包管理器本质上就是帮你从远程软件仓库下载 RPM 包并且自动解决依赖、校验签名的一整套流程。远程仓库地址配置在/etc/yum.repos.d/下面换源就是把这个地址从一个很慢的服务器换成一个离你近、带宽大的国内镜像服务器。1.1 默认源在国内为什么这么慢Rocky Linux 官方仓库默认使用的地址是https://dl.rockylinux.org/$contentdir/$releasever/BaseOS/$basearch/os/这个域名背后是国外的 CDN。国内访问的时候跨境链路的出口带宽、国际路由的延迟抖动都会直接影响下载速度尤其是首次拉取repomd.xml和大量元数据的时候慢的体验特别明显。另外一个更隐蔽的问题是官方源默认启用了metalink机制。简单说它不是给你一个固定地址而是让你先去一个元数据服务器查“去哪个镜像最快”然后动态跳转。这个机制在海外很优秀但在国内反而可能帮倒忙因为探测过程本身就会超时有时候还会跳到一个更不稳定的节点。所以换一个国内镜像站并且手动固定baseurl、禁用metalink是解决慢和超时的最直接路径。1.2 国内主要镜像站该怎么选国内常见的公共镜像站有阿里云、腾讯云、清华 TUNA、中科大 USTC、上海交大 SJTUG 等。它们各有侧重我个人的选型逻辑是这样镜像站访问地址优点备注阿里云镜像mirrors.aliyun.com服务器多、带宽大尤其在阿里云 ECS 上速度极快推荐云服务器用户使用腾讯云镜像mirrors.cloud.tencent.com同样带宽充足腾讯云内网速度有优势推荐腾讯云用户使用清华 TUNAmirrors.tuna.tsinghua.edu.cn同步频率高、资源全高校维护访问量大中科大 USTCmirrors.ustc.edu.cn历史久、稳定高校维护同样不错上海交大 SJTUGmirrors.sjtug.sjtu.edu.cn双栈支持好最新版本同步迅速这次实测主角选镜像站不是越出名越好关键看你的网络环境到哪个站点链路质量好。比如你在上海本地的机房访问上海交大镜像站自然比访问清华的更快。公司网络、家用宽带到各高校镜像站的实测表现差异很大有条件的话都试一下哪个快用哪个。1.3 为什么这次实测选上海交大镜像站这次给 Rocky Linux 9.0 换源我用的是上海交大 Linux 用户组维护的 SJTUG 镜像站。实测中发现它对 Rocky Linux 的仓库结构支持得很完整无论是 BaseOS、AppStream 还是 Extras、CRB 这些子仓库目录结构和官方基本一致不用额外做路径适配。另外它支持 IPv4/IPv6 双栈。对于有 IPv6 环境的机房来说走 IPv6 拉取元数据很多时候比 IPv4 更稳。我用脚本批量换源之后连续做了三次dnf makecache速度和成功率都很好所以这篇指南就以它为基准展开。其他镜像站的路径规则类似看懂原理之后你想换哪个都行。2. 手动替换 repo 文件先把原理走通一键脚本虽然方便但我建议所有人先手动操作一遍。因为只有理解了/etc/yum.repos.d/下这些文件的结构后面出了问题你才知道去哪排查而不是出了问题只会重装系统。2.1 先搞清楚要改哪些文件Rocky Linux 9.0 的软件源配置放在/etc/yum.repos.d/目录下主要有以下几个文件Rocky-BaseOS.repo基础系统仓库包含核心系统组件Rocky-AppStream.repo应用流仓库包含大量用户态软件和运行时Rocky-Extras.repo扩展软件包仓库Rocky-CRB.repoCRBCodeReady Builder仓库很多编译依赖在这里Rocky-NFV.repo、Rocky-RT.repo等面向特定场景的仓库一般用不上日常换源重点改前四个就够。你可以先备份然后逐个查看文件内容mkdir -p /root/repo_backup cp -a /etc/yum.repos.d/Rocky-*.repo /root/repo_backup/ cat /etc/yum.repos.d/Rocky-BaseOS.repo正常看到的 BaseOS 文件大概是这样的结构[baseos] nameRocky Linux $releasever - BaseOS mirrorlisthttps://mirrorlist.rockylinux.org/mirrorlist?arch$basearchrepoBaseOS-$releasever baseurlhttps://dl.rockylinux.org/$contentdir/$releasever/BaseOS/$basearch/os/ gpgcheck1 enabled1 gpgkeyfile:///etc/pki/rpm-gpg/RPM-GPG-KEY-Rocky-9mirrorlist就是前面说的动态跳转机制baseurl是手动指定的固定地址。换源的思路很简单注释掉mirrorlist让baseurl生效把baseurl改成国内镜像地址。2.2 用 sed 批量替换 URL手动一个个文件去编辑器里改速度太慢而且容易打错字。我习惯用sed批量操作三步搞定所有 repo 文件。第一步注释mirrorlist行sed -i s/^mirrorlist/# mirrorlist/ /etc/yum.repos.d/Rocky-BaseOS.repo sed -i s/^mirrorlist/# mirrorlist/ /etc/yum.repos.d/Rocky-AppStream.repo sed -i s/^mirrorlist/# mirrorlist/ /etc/yum.repos.d/Rocky-Extras.repo sed -i s/^mirrorlist/# mirrorlist/ /etc/yum.repos.d/Rocky-CRB.repo第二步把baseurl从官方地址改成上海交大镜像站sed -i s|https://dl.rockylinux.org/$contentdir/$releasever|https://mirrors.sjtug.sjtu.edu.cn/rocky/9.0| /etc/yum.repos.d/Rocky-BaseOS.repo sed -i s|https://dl.rockylinux.org/$contentdir/$releasever|https://mirrors.sjtug.sjtu.edu.cn/rocky/9.0| /etc/yum.repos.d/Rocky-AppStream.repo sed -i s|https://dl.rockylinux.org/$contentdir/$releasever|https://mirrors.sjtug.sjtu.edu.cn/rocky/9.0| /etc/yum.repos.d/Rocky-Extras.repo sed -i s|https://dl.rockylinux.org/$contentdir/$releasever|https://mirrors.sjtug.sjtu.edu.cn/rocky/9.0| /etc/yum.repos.d/Rocky-CRB.repo第三步清理缓存并验证dnf clean all dnf makecache dnf repolist这里特别注意一个坑sed 替换文本里如果有$releasever一定要把 sed 的表达式用单引号包起来。如果你图省事用双引号Shell 会先把$releasever展开成一个空字符串写进配置文件里就变成了https://mirrors.sjtug.sjtu.edu.cn/rocky/9.0/BaseOS//os/多一个斜杠路径直接错乱。这个问题我已经见过好几个人踩过了写命令的时候多留个心眼。2.3 修改后的 repo 文件长什么样用上面的命令操作完之后Rocky-BaseOS.repo的核心内容应该是这样[baseos] nameRocky Linux $releasever - BaseOS # mirrorlisthttps://mirrorlist.rockylinux.org/mirrorlist?arch$basearchrepoBaseOS-$releasever baseurlhttps://mirrors.sjtug.sjtu.edu.cn/rocky/9.0/BaseOS/$basearch/os/ gpgcheck1 enabled1 gpgkeyfile:///etc/pki/rpm-gpg/RPM-GPG-KEY-Rocky-9$basearch是 dnf 自动识别的系统架构变量x86_64 机器上会自动解析成x86_64aarch64 机器上就是aarch64不用你去手动改成具体值。gpgkey我建议保持本地路径file:///etc/pki/rpm-gpg/RPM-GPG-KEY-Rocky-9不要改成远程镜像地址。因为 RPM-GPG-KEY 这个验证文件在你安装系统的时候已经放进本地目录了再用远程地址去拉取反而多一道网络依赖万一镜像的 key 文件路径有细微差异还会导致 gpg 校验失败。全部改完、dnf makecache成功之后说明手动替换这条路你已经完全走通了。接下来就可以考虑把这些操作固化成一个脚本方便以后批量处理服务器。3. 一键替换脚本批量换源的正确姿势手动改一次是学习手动改十次就是受罪了。如果你手上有五台、十台服务器要统一配置或者打算把这次换源经验沉淀成内部工具写一个一键脚本很值得。3.1 脚本设计的核心思路我写这个脚本时给自己定了几个目标安全可回滚、幂等可重复执行、输出清晰。安全可回滚是最重要的。脚本第一件事就是把原始 repo 文件备份到带时间戳的目录这样即使替换过程中出了问题也能一条命令恢复。幂等性则保证脚本可以重复执行不管你这台机器是不是已经换过源再跑一遍不会产生脏数据。在实现上我没有选择“从镜像站下载现成 repo 文件”的方案因为不是每个镜像站都提供打包好的 repo 文件下载而且官方文件随时可能调整仓库结构。更稳妥的做法是“基于本机已有官方文件做原地替换”只改 URL不改仓库定义。这样 Rocky Linux 官方后续新增了子仓库脚本也能自动覆盖到。3.2 完整脚本代码下面是我实际在用的替换脚本目标镜像站是上海交大版本写死为 9.0。你可以根据自己的实测情况替换MIRROR_BASE和RELEASE_VER这两个变量#!/bin/bash # Rocky Linux 9.0 国内yum源一键替换脚本上海交大镜像站 # 用法bash sjtu-rocky-mirror.sh set -e REPO_DIR/etc/yum.repos.d MIRROR_BASEhttps://mirrors.sjtug.sjtu.edu.cn/rocky RELEASE_VER9.0 BACKUP_DIR${REPO_DIR}/backup_$(date %Y%m%d_%H%M%S) echo [1/4] 备份现有 repo 文件 mkdir -p ${BACKUP_DIR} cp -a ${REPO_DIR}/Rocky-*.repo ${BACKUP_DIR}/ 2/dev/null || true echo 备份目录${BACKUP_DIR} echo [2/4] 替换为上海交大镜像源 for repo_file in ${REPO_DIR}/Rocky-*.repo; do [ -f ${repo_file} ] || continue echo 处理$(basename ${repo_file}) # 注释 mirrorlist sed -i s/^mirrorlist/# mirrorlist/ ${repo_file} # 确保 baseurl 未被注释 sed -i s/^#baseurl/baseurl/ ${repo_file} # 替换官方域名并固定 releasever 版本 sed -i s|https://dl.rockylinux.org/\$contentdir/\$releasever|${MIRROR_BASE}/${RELEASE_VER}|g ${repo_file} sed -i s|http://dl.rockylinux.org/\$contentdir/\$releasever|${MIRROR_BASE}/${RELEASE_VER}|g ${repo_file} # 如果镜像 URL 里仍然存在裸的 $releasever统一替换为固定版本 sed -i s|/\$releasever/|/${RELEASE_VER}/|g ${repo_file} done echo [3/4] 清理并重建缓存 dnf clean all /dev/null 21 || true dnf makecache echo [4/4] 验证仓库列表 dnf repolist echo 完成yum/dnf 源已切换到上海交大镜像站。这个脚本我实际跑了很多次核心逻辑就三句话注释mirrorlist、启用baseurl、把域名和版本变量替换成固定值。set -e是为了在出现严重错误时立即终止避免带着坏配置继续执行但后面dnf clean all我加了|| true防止某些特殊情况下 clean 不干净导致脚本直接退出。3.3 脚本执行与验证把脚本保存为sjtu-rocky-mirror.sh然后用 root 身份执行bash sjtu-rocky-mirror.sh执行过程中你会看到[1/4]到[4/4]的进度输出。重点看最后一步dnf repolist的结果正常情况下repo id列会显示baseos、appstream、extras、crb等status列的数字不再是 0。如果某个仓库显示 0 个软件包大概率是这个仓库的路径有误或者该镜像没有同步对应子仓库目录。这里有两点经验值得单独说。第一不要直接curl | bash远程执行这类脚本。虽然网上很多一键脚本这么干但风险很大你根本不知道管道里跑的代码最终会改成什么。更稳妥的用法是把这个脚本放到你自己的 Git 仓库或者内部服务器先人工 review 一遍再在目标机器上执行。第二执行完脚本建议顺手检查一下/etc/dnf/vars/目录。如果这个目录下有自定义的releasever文件它的优先级会高于脚本里设置的固定版本可能导致最终访问目录还是跳回旧版本。检查方法很简单cat /etc/dnf/vars/releasever find /etc/dnf/vars/ -type f如果这两个命令有输出说明系统里存在全局变量覆盖这时候需要评估一下是否要删除或者修改否则换源结果会和预期不一致。4. 常见问题排查与避坑清单再好的脚本在真实网络环境里也会遇到各种意外。我把这次批量换源过程中遇到的高频问题整理了一下每个都给到了排查路径和最终解决办法。4.1 gpg 验证失败文件内容没错但还是报错现象是dnf makecache时提示Public key for xxx.rpm is not installed或者GPG key retrieval failed。这个问题的根源多半不在源地址而在 gpgkey 本身。有些教程会让你把 gpgkey 改成镜像站的远程地址例如baseurlhttps://mirrors.sjtug.sjtu.edu.cn/rocky/9.0/BaseOS/x86_64/os/RPM-GPG-KEY-Rocky-9但镜像站对这个文件的命名、路径可能和官方不完全一致一旦 URL 有点出入key 就拉不下来。我的建议是统一改成本地路径file:///etc/pki/rpm-gpg/RPM-GPG-KEY-Rocky-9。如果系统里确实没有这个文件可以去官方 key 服务手动导入rpm --import https://mirrors.sjtug.sjtu.edu.cn/rocky/9.0/RPM-GPG-KEY-Rocky-9 rpm -qa gpg-pubkey第二个命令能列出当前系统已导入的 GPG key确认Rocky-9对应的 key 是否已经在列表里。4.2 dnf makecache 卡住不动多半是元数据缓存问题有时候换源之后执行dnf makecache进度条一直在一个 repo 上停留不报错也不结束。最常见的原因是之前官方源留下的元数据缓存损坏或者目录结构冲突。我的处理顺序是先彻底清缓存再验证网络连通性最后重建缓存。dnf clean all rm -rf /var/cache/dnf/* curl -I https://mirrors.sjtug.sjtu.edu.cn/rocky/9.0/BaseOS/x86_64/os/repodata/repomd.xml dnf makecachecurl -I如果返回 200 OK说明镜像站本身没问题问题出在本地缓存清掉就好。如果 curl 也超时那就不是配置问题是你当前网络到镜像站的链路本身不通这时候该检查防火墙、DNS 或者换一个镜像站。4.3 从 CentOS 7 迁移过来的朋友yum 命令老报错Rocky Linux 9.0 默认的包管理命令虽然是dnf但保留了yum作为兼容命令。很多从 CentOS 7 迁移过来的老手习惯敲yum install这个当然没问题但要注意.repo文件的格式兼容性。如果你从网上复制了 CentOS 7 时代的 repo 模板直接放进 Rocky Linux 9.0很可能因为缺少module_hotfixes或者其他新字段导致仓库加载歧义。解决办法很简单不要用老模板直接用 Rocky Linux 自带的那一套 repo 文件只替换 URL 地址就行。我脚本里也是基于这个原则设计的。4.4 常见问题速查表现象可能原因排查/解决动作dnf makecache一直卡住元数据缓存损坏、网络链路不稳dnf clean allrm -rf /var/cache/dnf/*再重建GPG key 校验失败gpgkey 指向远程 URL 且路径不对改为file:///etc/pki/rpm-gpg/RPM-GPG-KEY-Rocky-9或手动rpm --importbaseurl路径多一层斜杠sed 里$releasever被 Shell 展开为空用单引号写 sed 表达式避免变量被提前展开repo 列表显示 0 个软件包$releasever被解析成 9 而不是 9.0脚本里把版本写死为 9.0或在/etc/dnf/vars/releasever写入 9.0部分仓库替换后仍然访问官方源脚本没覆盖该 repo 文件或[repo]块级enabled0grep -L sjtug /etc/yum.repos.d/Rocky-*.repo单独处理残留文件curl -I不通但其他网站正常本地防火墙或运营商对 IP 的访问限制换阿里、清华等镜像源做交叉测试检查是否为 IPv6 强制访问问题排查的过程中有一个小技巧很推荐换完源之后别急着跑dnf makecache先用grep把所有 repo 文件里的baseurl和mirrorlist状态统一打出来一眼就能看出哪些文件漏改了。grep -E ^baseurl|^# mirrorlist /etc/yum.repos.d/Rocky-*.repo输出结果里应该只有baseurl生效并且域名全部是mirrors.sjtug.sjtu.edu.cn。任何一行还是dl.rockylinux.org就说明脚本没有覆盖到手动补一刀即可。5. 最后换源之后的几个实用习惯折腾完 Rocky Linux 9.0 的软件源我想顺带分享几个这些年积累下来的使用习惯希望能帮刚入门的读者少走弯路。第一个习惯新装系统第一时间配好源但不要第一时间makecache。先把系统自带的dnf repolist和dnf check-update跑一遍确认仓库本身没问题再进入真正的软件安装阶段。说白了就是“先验证连接再消费带宽”避免在坏配置上反复重试浪费时间。第二个习惯定期做一次dnf clean all是有必要的。长期不清理/var/cache/dnf下面累积的元数据和旧包会越来越大严重的时候会影响dnf的解析速度。我现在是每个季度定时清一次顺便执行dnf clean packages把下载过的安装包清理干净系统盘空间能省出来不少。第三个习惯软件源不是配一次就一劳永逸的。Rocky Linux 9.0 本身已经进入生命周期末端如果你的业务允许建议尽快升级到 9.4 或者更高版本。这个版本目录在镜像站上依然存在但官方仓库里的更新已经基本冻结越早迁移到较新的小版本后续安全补丁的获取就越顺畅。我在实操中最深的体会是换源这件事难点从来不在“把 URL 改掉”这一步而在于理解包管理器如何解析仓库配置以及遇到异常时怎么快速定位问题。希望这篇文章能帮你把这条路走顺。如果你照着操作时遇到其他奇怪的问题欢迎在评论区把你的报错信息贴出来大家互相借鉴比一个人闷头折腾效率高得多。
返回列表