简介:这份资源面向需要在CentOS Stream 10(ARM架构)上配置国内镜像源的Linux用户与运维人员,提供更换清华源的完整操作参考。包内共3个文件,以inscode工程配置、html页面和gitignore忽略规则为主,压缩包约7KB,体量轻巧便于快速查阅与复用。内容围绕仓库配置文件的备份与修改展开,覆盖BaseOS、AppStream、CRB等多个仓库的镜像地址替换,并借助dnf clean all、dnf makecache、dnf repolist all等命令完成缓存清理、重建与仓库验证,同时演示Ansible服务的安装与结果校验。已有106人学习,适合具备一定Linux基础、希望优化下载速度与系统稳定性的读者参考,可据此快速完成镜像源切换并排查配置问题。
1. CentOS Stream 10 换源这件事,为什么值得单独写一篇
刚装完 CentOS Stream 10 的人,十有八九会在第一次dnf install时愣住——默认仓库指向的是官方 mirrorlist,国内访问速度看运气,有时候几十 KB/s 能磨到你怀疑人生。这不是玄学,是物理距离和网络链路决定的。换源说白了就是把/etc/yum.repos.d/下的仓库地址从官方源替换成国内镜像站,让包索引和 RPM 包从更近的节点拉取。CentOS Stream 10 和之前的 8、9 有个明显区别:它默认启用了centos-stream.repo和centos-stream-addons.repo等几个文件,而且仓库路径里带了10-stream这样的标识,直接套用 8 或 9 的换源脚本大概率会翻车。这篇面向的是刚上手 Stream 10 的运维和开发,也适合那些想用 Ansible 批量刷源的人——我会把手工换源、脚本换源、Ansible 批量换源三条路都走一遍,顺带把踩过的坑摊开讲。
2. 换源前的底账:仓库文件结构与你到底在改什么
2.1 CentOS Stream 10 的 repo 文件长什么样
先别急着动手,把默认仓库文件看清楚。Stream 10 安装后/etc/yum.repos.d/下通常有这几个文件:
ls -l /etc/yum.repos.d/ # CentOS-Stream-AppStream.repo # CentOS-Stream-BaseOS.repo # CentOS-Stream-Debuginfo.repo # CentOS-Stream-Extras-common.repo # CentOS-Stream-HighAvailability.repo # CentOS-Stream-Media.repo # CentOS-Stream-NFV.repo # CentOS-Stream-PowerTools.repo # CentOS-Stream-RealTime.repo # CentOS-Stream-ResilientStorage.repo # CentOS-Stream-extras.repo每个文件里有一个或多个[section],关键字段是name、mirrorlist、baseurl、gpgcheck、enabled、gpgkey。默认情况下mirrorlist是启用的,baseurl被注释掉。换源的本质就是:注释掉mirrorlist,把baseurl指向国内镜像站对应路径,同时保留gpgcheck=1和正确的gpgkey。
2.2 为什么不能直接照搬 CentOS 7/8 的换源命令
CentOS 7 时代大家习惯用sed -i 's/mirror.centos.org/mirrors.tuna.tsinghua.edu.cn/g'一把梭。到了 Stream 10,仓库域名和路径都变了。Stream 10 的官方仓库域名是mirror.stream.centos.org,路径形如/10-stream/BaseOS/x86_64/os/。如果你把域名替换成清华源,路径部分必须同步改成清华镜像站的实际目录结构,否则baseurl拼出来的 URL 是 404。清华镜像站对 Stream 的路径是https://mirrors.tuna.tsinghua.edu.cn/centos-stream/10-stream/...,注意是centos-stream而不是centos。这个细节不注意,换完源dnf makecache直接报Failed to download metadata。
2.3 换源前必须做的两件事
第一,备份原始 repo 文件。别嫌麻烦,出问题能一键回滚:
mkdir -p /etc/yum.repos.d/backup cp /etc/yum.repos.d/CentOS-Stream-*.repo /etc/yum.repos.d/backup/第二,确认系统版本和架构,避免下错路径:
cat /etc/centos-release # CentOS Stream release 10 uname -m # x86_64 或 aarch64aarch64架构的路径里x86_64要换成aarch64,这个在批量脚本里尤其容易漏。
3. 手工换源全流程:从备份到验证的每一步
3.1 用 sed 批量替换 baseurl 的实操
最直接的方式是写一个替换脚本,把每个 repo 文件里的mirrorlist注释掉,并插入清华源的baseurl。下面这段脚本我一般会先--dry-run看一遍再执行:
#!/bin/bash # centos10-tuna-switch.sh # 用途:将 CentOS Stream 10 默认源切换为清华镜像源 set -euo pipefail REPO_DIR="/etc/yum.repos.d" BACKUP_DIR="${REPO_DIR}/backup" TUNA_BASE="https://mirrors.tuna.tsinghua.edu.cn/centos-stream" STREAM_VER="10-stream" ARCH=$(uname -m) # 1. 备份 mkdir -p "${BACKUP_DIR}" cp -n "${REPO_DIR}"/CentOS-Stream-*.repo "${BACKUP_DIR}/" 2>/dev/null || true # 2. 遍历 repo 文件 for repo in "${REPO_DIR}"/CentOS-Stream-*.repo; do [ -e "$repo" ] || continue # 注释 mirrorlist sed -i 's/^mirrorlist=/#mirrorlist=/' "$repo" # 如果 baseurl 已被注释,取消注释并替换域名 sed -i "s|^#baseurl=http://mirror.stream.centos.org|baseurl=${TUNA_BASE}|" "$repo" # 处理已启用但未注释的 baseurl sed -i "s|^baseurl=http://mirror.stream.centos.org|baseurl=${TUNA_BASE}|" "$repo" # 替换路径中的版本标识 sed -i "s|/centos/\$stream|/${STREAM_VER}|g" "$repo" sed -i "s|/centos-stream/\$stream|/${STREAM_VER}|g" "$repo" done # 3. 清理缓存并重建 dnf clean all dnf makecache这段脚本的逻辑说明:set -euo pipefail保证任何一步失败就退出,避免半吊子状态。cp -n的-n表示不覆盖已存在的备份,防止二次执行把好文件覆盖成坏文件。sed的三条替换分别处理 mirrorlist 注释、baseurl 域名替换、路径版本替换。最后dnf clean all清掉旧缓存,dnf makecache拉新元数据。
参数说明:TUNA_BASE换成其他镜像站时,只需改这一个变量,但要注意不同镜像站的路径规则可能不同。STREAM_VER固定为10-stream,如果以后升级到 11,这里要同步改。
3.2 验证换源是否生效
执行完脚本后,别急着装包,先验证:
dnf repolist -v # 输出里 Repo-baseurl 应该显示 mirrors.tuna.tsinghua.edu.cn再随便装个小包测试:
dnf install -y tree # 观察下载速度,正常应该跑满带宽如果dnf makecache报Cannot download repomd.xml,八成是 baseurl 路径拼错了。用curl直接测一下:
curl -I https://mirrors.tuna.tsinghua.edu.cn/centos-stream/10-stream/BaseOS/x86_64/os/repodata/repomd.xml # 返回 200 说明路径正确3.3 回滚操作
万一换完源系统出问题,回滚很简单:
cp /etc/yum.repos.d/backup/CentOS-Stream-*.repo /etc/yum.repos.d/ dnf clean all dnf makecache注意备份目录里的文件名和原文件一致,直接覆盖即可。如果之前用cp -n备份过多次,确认一下备份文件是不是最初的那份。
4. 用 Ansible 批量刷源:多台机器一次搞定
4.1 为什么用 Ansible 而不是 for 循环 ssh
手上有三台以上机器时,for ip in ...; do ssh ...; done的写法很快就会失控——密码、sudo 权限、并发、错误处理全是坑。Ansible 的copy和replace模块天然幂等,重复执行不会把配置搞乱,而且--check模式可以先干跑一遍看变更。对于换源这种「改配置文件 + 清缓存」的任务,一个 playbook 就能覆盖。
4.2 编写换源 playbook
下面这个 playbook 把 repo 文件模板化下发,适合机器数量多、且希望配置统一的场景:
# centos10-tuna.yml - name: 切换 CentOS Stream 10 至清华源 hosts: centos10 become: true vars: tuna_base: "https://mirrors.tuna.tsinghua.edu.cn/centos-stream" stream_ver: "10-stream" tasks: - name: 备份原有 repo 文件 ansible.builtin.copy: src: "/etc/yum.repos.d/{{ item }}" dest: "/etc/yum.repos.d/backup/{{ item }}" remote_src: true mode: "0644" loop: - CentOS-Stream-BaseOS.repo - CentOS-Stream-AppStream.repo - CentOS-Stream-extras.repo ignore_errors: true - name: 注释 mirrorlist ansible.builtin.replace: path: "/etc/yum.repos.d/{{ item }}" regexp: '^mirrorlist=' replace: '#mirrorlist=' - name: 替换 baseurl 为清华源 ansible.builtin.replace: path: "/etc/yum.repos.d/{{ item }}" regexp: '^#?baseurl=http://mirror\.stream\.centos\.org' replace: "baseurl={{ tuna_base }}" - name: 清理 dnf 缓存 ansible.builtin.command: dnf clean all changed_when: false - name: 重建缓存 ansible.builtin.command: dnf makecache register: makecache_result changed_when: "'Metadata cache created' in makecache_result.stdout"逻辑说明:copy模块的remote_src: true表示源文件在目标机上,不是控制机。replace模块的regexp用了^#?baseurl来同时匹配已注释和未注释的情况,避免重复执行时插出两行 baseurl。changed_when控制幂等报告,dnf clean all每次都执行但不算变更,dnf makecache只有真正重建了缓存才算变更。
参数说明:hosts: centos10对应 inventory 里的组名,实际使用时改成自己的组。tuna_base和stream_ver抽成变量,方便换镜像站或升级版本。
4.3 执行与验证
ansible-playbook -i inventory.ini centos10-tuna.yml --check # 先干跑看变更 ansible-playbook -i inventory.ini centos10-tuna.yml # 确认无误后正式执行执行完在任意一台机器上验证:
ansible centos10 -m command -a "dnf repolist -v" | grep -i tuna如果某台机器报错,用-l限定单台重跑:
ansible-playbook -i inventory.ini centos10-tuna.yml -l 192.168.1.105. 避坑与排查:换源路上最常见的五个翻车点
5.1 现象:dnf makecache 报 404 Not Found
原因:baseurl 路径拼错,最常见的是把centos-stream写成了centos,或者版本号写成了10而不是10-stream。另一个可能是架构路径没改,x86_64 的机器上写了 aarch64。
解决:用curl -I逐段测试 URL,从域名开始一段段加路径,看哪一段开始 404。确认镜像站的实际目录结构,清华源的 Stream 10 路径是/centos-stream/10-stream/BaseOS/x86_64/os/。
5.2 现象:GPG 校验失败,提示 Public key not available
原因:换源后gpgkey字段还指向官方地址,而官方地址在国内访问不稳定,导致密钥拉不下来。或者镜像站的 gpgkey 路径和官方不一致。
解决:把gpgkey也改成镜像站地址。清华源的 key 路径通常是https://mirrors.tuna.tsinghua.edu.cn/centos-stream/RPM-GPG-KEY-CentOS-Official。改完执行rpm --import手动导入一次。
5.3 现象:换源后 dnf 仍然走官方源
原因:mirrorlist没注释干净,dnf 优先读 mirrorlist 而不是 baseurl。或者 repo 文件里有多个 section,只改了第一个。
解决:grep -r "mirrorlist" /etc/yum.repos.d/检查是否还有未注释的行。用dnf repolist -v看实际生效的 baseurl。
5.4 现象:Ansible 执行 replace 后文件里出现两行 baseurl
原因:regexp没写对,第一次执行插入了一行 baseurl,第二次执行又匹配到新插入的行,导致重复。或者原始文件里 baseurl 本来就是未注释状态,脚本又插了一行。
解决:regexp用^#?baseurl=同时匹配两种情况,replace只保留一行。执行前先用--check干跑,确认变更行数符合预期。
5.5 现象:换源后系统更新卡在某个包不动
原因:镜像站同步有延迟,某个包的元数据和实际 RPM 不一致。或者本地 dnf 缓存损坏。
解决:dnf clean all后重试。如果还不行,换一个镜像站临时测试,确认是镜像站问题还是本地问题。镜像站同步延迟一般几小时内会恢复,不用急着改配置。
6. 进阶技巧:用 dnf config-manager 做精细化控制
手工改 repo 文件虽然直观,但机器多了之后,用dnf config-manager可以更精细地控制仓库开关和优先级。Stream 10 默认装了dnf-plugins-core,直接可用。
# 查看所有仓库 dnf repolist --all # 禁用某个仓库 dnf config-manager --set-disabled CentOS-Stream-Debuginfo # 启用某个仓库 dnf config-manager --set-enabled CentOS-Stream-PowerTools # 设置仓库优先级(需要 dnf-plugin-priorities) dnf config-manager --setopt="CentOS-Stream-BaseOS.priority=1" --save--save会把配置写回 repo 文件,不写的话只在当前会话生效。这个特性适合临时调试,比如怀疑某个仓库的包版本冲突时,先禁用再测试。
另一个实用技巧是用--setopt临时指定 baseurl,不改文件:
dnf --setopt="CentOS-Stream-BaseOS.baseurl=https://mirrors.tuna.tsinghua.edu.cn/centos-stream/10-stream/BaseOS/x86_64/os/" makecache这个写法在排查「到底是配置问题还是网络问题」时特别有用——如果临时指定能通,说明是配置文件写错了;如果还不通,那就是网络或镜像站的问题。
还有一个容易被忽略的点:Stream 10 的extras仓库和Extras-common是两个不同的仓库,换源时两个都要改。很多人只改了 BaseOS 和 AppStream,结果装某些工具时提示找不到包,查半天才发现是 extras 没换。
我自己的习惯是,每次换完源后强制走一遍dnf repolist -v加dnf install -y tree的验证流程,确认 baseurl 生效且能实际下载。这个习惯帮我省过好几次「以为换好了其实没换」的后悔药。希望帮到你。
本文还有配套的精品资源,点击获取