ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

CentOS换国内Yum源实操:wget一键替换阿里云镜像完整指南

CentOS换国内Yum源实操:wget一键替换阿里云镜像完整指南 第一次在服务器上跑yum install nginx进度条卡在 0%等了三分钟才下载了 2MB我以为是机房网络坏了后来才发现是 Yum 源的问题。默认的 CentOS 官方源在国外国内服务器访问经常是几十 KB 甚至直接超时等 CentOS 8 停止维护之后官方源更是整个移走了不换源连yum update都没法跑。这篇文章就用我实际操作的完整流程把 CentOS 7/8/9/Stream 用wget命令替换为国内源这件事讲透——包括为什么慢、换源前要做什么准备、不同版本之间 repo 文件的差异、具体命令、以及换完之后陆续踩过的坑。准备接手 CentOS 服务器运维、刚入门 Linux 装软件装到心态爆炸的同学可以直接按下面的步骤抄作业。1. 先搞明白Yum仓库为什么慢慢在哪儿1.1 从Yum的仓库机制说起Yum 的全称是 Yellowdog Updater Modified本质上它是一个包管理前端本身并不存储软件包。你在终端敲下yum install nginx时它做的事情是读取/etc/yum.repos.d/目录下的.repo配置文件根据里面写的baseurl地址去访问远程仓库先下载仓库元数据repomd.xml以及对应的文件列表再根据元数据找到 nginx 这个 rpm 包的下载地址然后才真正开始下载安装。这里就有个关键点/etc/yum.repos.d/CentOS-Base.repo里默认写的baseurl指向的是mirror.centos.org。这是 CentOS 项目的官方镜像地址服务器位于欧洲。国内服务器访问这个地址要跨国际链路丢包、高延迟、低带宽是家常便饭。高峰期你执行yum makecache可能几分钟都跑不完更别提后面还要下载几十上百 MB 的软件包了。还有一层容易被忽略的问题Yum 在安装软件时要解析依赖关系一个 nginx 可能牵扯到 openssl、pcre、zlib 等多个依赖包每个依赖都要从远程仓库单独下载。源不稳定时经常出现下载到一半报错或者依赖解析超时的情况。这就是为什么很多人觉得Yum 装软件特别容易失败——根源往往是仓库访问速度不一定是网络完全断了。1.2 国内源的选择逻辑国内常用的 CentOS 镜像源有这么几个阿里云镜像站、清华 TUNA 镜像站、中科大 USTC 镜像站、网易 163 镜像站。它们都是定期从上游同步 CentOS 官方仓库内容文件完整性和官方保持一致区别主要体现在同步频率、带宽稳定性、附带服务上。源名称仓库地址特点阿里云mirrors.aliyun.com带宽大、同步快国内机房普遍访问好提供一键 repo 文件清华mirrors.tuna.tsinghua.edu.cn高校背景更新及时稳定性口碑好中科大mirrors.ustc.edu.cn同样高校背景支持 IPv6对教育网友好网易mirrors.163.com老牌镜像站速度稳定但仓库版本相对基础我个人在业务服务器上用得最多的是阿里云。原因很简单阿里云仓库针对 CentOS 各版本提供了现成的.repo文件不需要自己去逐条改写baseurl直接wget下来覆盖到本地就行这正好呼应了标题里说的使用 wget 命令。提示选源不用纠结太多。国内主流源的内容都是和官方仓库同步的没有本质差异。关键是选一个你服务器网络延迟最低、持续维护的源。测试方法很简单curl -I https://mirrors.aliyun.com/centos/看响应头是否正常返回。2. 动手前必须确认的三件事版本、目录、网络2.1 确认系统版本和包管理器类型不同版本的 CentOSrepo 文件的内容完全不同。很多人换源失败就是拿 CentOS 7 的配置文件套到 CentOS 8 上结果一堆 404。动手之前先确认你手里这台机器的真实版本cat /etc/redhat-release cat /etc/os-release | grep -E ^(ID|VERSION_ID)输出示例CentOS Linux release 7.9.2009 (Core) CentOS Stream release 8还要顺便看一下默认包管理器。CentOS 8 开始系统底层包管理已经从 Yum 换成了 DNF但保留了yum命令作为兼容入口所以下面的操作统一用yum写正常人敲命令不会遇到问题。只有一点要注意配置文件路径/etc/yum.repos.d/在 7/8/9/Stream 上是完全一致的这点倒是省心。2.2 备份repo目录这一步救过我两次换源的本质是修改/etc/yum.repos.d/下的文件。很多教程让你直接rm -rf /etc/yum.repos.d/*我是强烈不建议这么干的。万一新配置有问题或者哪个第三方源还需要旧文件你连回退的机会都没有。我的习惯是把整个yum.repos.d目录打包备份mkdir -p /etc/yum.repos.d/backup cp -r /etc/yum.repos.d/*.repo /etc/yum.repos.d/backup/这个动作看着不起眼但它给你留了一条后路。我遇到过两次这种情况一次是 CentOS 8 的 AppStream 源路径写错导致yum install大面积报错一次是 EPEL 源和 Base 源版本不匹配导致依赖解析崩溃。两次都是直接从备份目录把原始文件恢复回来重新调整配置十分钟解决问题。如果没有备份只能去网上找原始 repo 文件那就痛苦了。2.3 确认wget可用以及不可用时的替代方案标题既然点名了使用 wget 命令那你要确保 wget 本身是装好的。检查一下which wget如果命令不存在说明系统是最小化安装没带 wget。这时候有两个办法要么用包管理器先装一个要么直接用 curl。装 wget 的命令是yum install -y wget这里有个先有鸡还是先有蛋的小问题源还没换就要先装东西如果当前源很慢怎么办好消息是 wget 这个包很小只有几百 KB而且它在 Base 源里通常再慢也能凑合下载完。实在下不动就用 curl 顶上curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repocurl -o和wget -O的作用一样都是把下载内容保存到指定路径。所以不要被标题限制住真到了没 wget 的机器上灵活换用 curl 就行。3. CentOS 7 与 8/9/Stream 的源结构差异一份配置不能通吃3.1 CentOS 7Base/Extras/Updates 三段式CentOS 7 的 Yum 仓库结构很经典CentOS-Base.repo文件里主要包含三个仓库标识base基础软件包对应系统的核心组件extras扩展包比如一些不在 Base 里的常用软件updates更新包安全补丁和 Bug 修复都在这里这三个仓库的baseurl结构通常是https://mirrors.aliyun.com/centos/7/os/x86_64/ https://mirrors.aliyun.com/centos/7/extras/x86_64/ https://mirrors.aliyun.com/centos/7/updates/x86_64/阿里云提供的Centos-7.repo把这些路径都写好了你不需要记忆具体 URL直接下载覆盖即可。CentOS 7 目前已进入维护晚期但阿里云依然在持续镜像所以日常使用没有问题。3.2 CentOS 8/9 StreamBaseOS/AppStream 模块化设计CentOS 8 开始仓库结构大变样最核心的变化是引入了 AppStream 和模块化Modularity。传统的base仓库被拆成了两个主要部分BaseOS基础操作系统组件类似以前的 baseAppStream应用软件流nginx、mysql、php 这类运行时和应用程序全在这里Extras保留的扩展仓库PowerToolsCentOS 8/CRBCentOS 9 Stream额外工具包仓库很多编译依赖要在这里找如果继续用 CentOS 7 的 repo 文件去替换 CentOS 8Yum 会明确告诉你找不到匹配的仓库因为7/os/x86_64这个路径在 CentOS 8 上根本不存在。这就是为什么一份配置通吃所有版本是个彻头彻尾的误区。正确的做法是下载和系统版本严格对应的 repo 文件。3.3 为什么网上很多教程抄作业会失败我在各种技术论坛看到过不少帖子提问的人都是同一个问题我按教程换源了为什么yum install还是报 404仔细一问多半是版本对应关系搞错了。最常见的情况是这样的教程写的是CentOS 7提问的人是CentOS 8 Stream或者教程用的是清华源他半路换成了阿里云的地址只改了域名没改路径。Yum 源这个东西差一个路径层级都访问不到完全没有自动适配的余地。所以这里给所有读者一个硬性提醒到网上找换源教程时第一件事不是复制命令而是确认教程标题里的系统版本和你机器一致。版本不一致后面所有命令都没有参考价值必须先搞清楚自己的系统。4. wget一键替换国内源的完整实操4.1 用wget下载官方repo配置的技巧进入正题。阿里云镜像站把所有版本的一键配置 repo 文件都放在https://mirrors.aliyun.com/repo/目录下命名规律很清晰系统版本下载文件名CentOS 7Centos-7.repoCentOS 8Centos-8.repoCentOS 9 StreamCentos-9-Stream.repoCentOS Stream 8Centos-8.repo同样适用用wget下载并覆盖的核心命令是# CentOS 7 wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo # CentOS 8 / Stream 8 wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-8.repo # CentOS 9 Stream wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-9-Stream.repo这里解释一下-O参数wget默认会把下载的文件保存为 URL 末尾的文件名比如Centos-7.repo。加了-O /etc/yum.repos.d/CentOS-Base.repo之后文件直接以指定名字保存到目标路径省去了先下载再mv重命名的两步操作。这个参数是整套脚本里最值得记住的细节。下载完可以顺手看一眼文件内容确认路径没被写错cat /etc/yum.repos.d/CentOS-Base.repo | grep baseurl正常情况下你应该看到mirrors.aliyun.com开头的地址并且路径里包含对应版本号。4.2 替换repo文件后的三步收尾下载完 repo 文件不算完事必须做三步收尾否则旧的缓存会让系统继续访问老地址。第一步清理旧缓存yum clean all第二步重新生成缓存yum makecache这一步会把新源里的软件包元数据全部拉取到本地生成索引。速度取决于网络正常情况下几十秒完成。如果卡住不动超过五分钟基本可以断定源地址有问题用Ctrl C中断后检查网络和 repo 文件内容。第三步验证源是否生效yum repolist输出里应该能看到base、extras、updates7 代或baseos、appstream、extras8/9 代这些仓库标识后面跟着软件包数量。看到数量就是成功如果显示 0 或者直接报错说明配置有问题继续往下看常见坑。4.3 用 wget 前先理解这个命令的作用边界有人会问明明可以直接vim改文件为什么非要 wget我的理解是这样的手动编辑 repo 文件需要你清楚每一行的含义baseurl、gpgcheck、enabled这些参数写错一个就可能出问题。而 wget 下载的阿里云官方 repo 文件是那边运维人员实时维护的仓库路径、GPG 密钥、enabled 开关都是验证过能用的。你花三秒下载一个已被大规模验证过的配置文件比自己写十几行配置可靠得多。特别是对于 CentOS 8 这种经历过官方源迁移的版本阿里云会在 repo 文件里同步调整路径指向这个信息差是自己手动改文件永远追不上的。5. 换源后最常见的四个坑我逐一踩过5.1 CentOS 8 停止维护后的官方源指向哪里CentOS 8 在 2024 年 5 月 31 日到达生命周期终点EOL官方把mirror.centos.org上 8 的目录整个移除了。这意味着什么意味着如果你用的还是官方源yum update会一次性给你报几十个 404。用阿里云的Centos-8.repo基本能避开这个问题因为阿里云把旧版本的镜像保留在 vault 目录下repo 文件内部已经做了指向。如果你是从官方源手动改的或者用的第三方源没有保留旧包那要把 URL 路径里的/centos/8/改成/centos-vault/8.5.2111/这类带具体小版本的路径。注意vault 是 CentOS 把所有 EOL 版本归档存放的地方相当于历史版本仓库。CentOS 7 的最终版虽然还没完全 EOL但对应的 vault 路径早就存在了。详细的路径规则是/centos-vault/版本号/小版本号/仓库名/x86_64/。5.2 EPEL源不换等于白换很多人只换了CentOS-Base.repo但服务器上用到的很多第三方软件来自 EPEL 仓库。EPEL 是 Extra Packages for Enterprise Linux 的缩写由 Fedora 社区维护给 RHEL/CentOS 提供大量不在官方源里的软件包。如果你原先装了 EPEL 源但没换yum install解析依赖时会把大量请求打到国外整体速度照样拉胯。EPEL 源在阿里云同样有一键配置# CentOS 7 wget -O /etc/yum.repos.d/epel.repo https://mirrors.aliyun.com/repo/epel-7.repo # CentOS 8 / Stream 8 wget -O /etc/yum.repos.d/epel.repo https://mirrors.aliyun.com/repo/epel-8.repo下载完同样做yum clean all yum makecache。EPEL 和 Base 源版本必须一致7 的机器别装 8 的 epel否则依赖解析会抽风。5.3 AppStream路径404的排查过程有一次我在 CentOS 8 Stream 上换完源后执行yum install mysql报错信息类似Errors during downloading metadata for repository appstream: - Status: 404 Not Found我的第一反应是阿里云源坏了但仔细一想不可能这个源使用量那么大。于是去看 repo 文件里 appstream 的路径发现我下载的Centos-8.repo里 appstream 指向的是https://mirrors.aliyun.com/centos/8-stream/AppStream/x86_64/os/而我机器是 CentOS Stream 8正常路径应该包含8-stream还是8问题就出在这里——我拿普通 CentOS 8 的 repo 文件套到了 Stream 8 上。这两个版本官方的仓库路径确实不一样CentOS 8 是centos/8/CentOS Stream 8 是centos/8-stream/。排查链路先cat /etc/yum.repos.d/CentOS-Base.repo | grep -A 3 appstream确认实际配置的 URL再用curl -I直接访问该 URL看 HTTP 状态码最后换用正确的 repo 文件覆盖。整个过程不复杂但很典型换源报 404八成是版本路径不匹配先用 curl 确认 URL 可访问性是最快的排查方式。5.4 时间不同步导致的SSL握手失败这个坑藏在换源之后的第一次安装里。现象是yum makecache报错Problem with the SSL CA cert (path? access rights?)第一眼看像是证书问题实际是服务器系统时间和真实时间差太远导致 TLS 证书验证失败。很多刚部署的机器默认时区是 UTC或者硬件时钟不准系统时间差了几个月证书自然验证不过。解决方案是同步时间yum install -y ntpdate ntpdate ntp.aliyun.com同步后建议再核对一下系统时间date如果时间正确了重新跑yum makecache就正常了。这个坑不换源也会遇到但换源后首次访问 HTTPS 镜像站时更明显因为所有国内源都是 HTTPS证书校验那一关逃不掉。6. 换源完成后的验证方法与日常维护习惯6.1 三条命令验证源是否真的生效配置改完、缓存重建完不要急着装软件先用三条命令做体检。第一条看仓库列表和数量yum repolist重点看仓库 ID 是否包含base、extras、updates或baseos、appstream以及最后统计出来的软件包数量。数量为 0 或仓库项缺失都是异常信号。第二条模拟安装一个小软件验证全链路yum install -y treetree 是个很小的工具依赖也少适合当探针。如果它能秒装成功说明 Base 源连接正常、网络可达、GPG 校验正常。如果要重点验证 AppStream 源就装yum install -y nginx这个包比较有代表性。第三条跑一次实际更新yum update -y --downloadonly--downloadonly参数只下载更新包不打补丁既能验证源里所有软件包的完整性又不会真正改动系统。等输出结束且有下载量时说明所有仓库都正常工作。6.2 日常使用中的几个好习惯换源是几分钟的事但维护源是一个长期习惯。第一不要乱加第三方源。每加一个.repo文件就多一层依赖冲突风险。我曾经见过一台服务器同时开了 EPEL、Remi、Webtatic 三个源装 PHP 时三个源互相抢包版本最后只能全部清掉重来。能用官方源 EPEL 解决的需求不要画蛇添足。第二定期清理 Yum 缓存。yum clean all之后虽然重建缓存要花点时间但能避免旧缓存文件越来越大。缓存堆积太多时yum makecache会明显变慢。第三记住当前系统的源配置版本。建议换完源后在/etc/yum.repos.d/backup/里放一个本次操作的说明文件写明何时为哪个版本机器换成了哪个源。半年后你再回来维护这台机器看着这个文件能省掉大量回忆成本。6.3 如果你不想手动改这些思路可以参考有些新版本的 CentOS Stream 支持dnf的--setopt参数临时指定仓库地址但这只是临时覆盖不适合长期使用。日常运维场景下把/etc/yum.repos.d/下的配置文件改好、验证好才是正路。如果你的机器数量多还可以考虑把配置好的.repo文件和备份脚本放到统一的配置管理工具里下发避免每台机器都手动操作一遍。我个人实际操作中的体会是换源这件事七成靠对版本结构的理解三成靠命令本身。命令翻来覆去就那几条真正决定成败的是你清不清楚自己的系统是什么版本、路径该写什么、EOL 之后旧包去哪儿找。把这几个问题想明白了不管用 wget 还是 curl不管面对阿里云还是清华源你都能在五分钟内完成替换想不明白照着教程复制粘贴也会踩到版本不匹配的坑。顺便多提一句备份目录和验证命令这两个习惯是所有 Yum 相关操作的底层保障比换源本身更值得长期坚持。
返回列表