刚装完 CentOS 7 的人大概率都遇到过这种场景执行yum install -y vim之后进度条卡在 0% 半天不动过一会儿直接报Could not resolve host或者Connection timed out。我早期带团队时几乎每个月都能看到新同事对着默认 YUM 源干瞪眼。这个问题本质很简单——CentOS 7 默认走的是官方源服务器在国外国内网络访问要么慢到难以忍受要么根本连不上。所谓更换 YUM 源就是把 yum 默认的软件仓库地址从官方源改成国内镜像站。整个过程归纳下来就是三步备份原始 repo 文件、下载国内源的 repo 文件、清理缓存并重新生成。这篇文章就是围绕这三步展开适合刚装完系统的小白也适合准备装 Docker、MySQL、Nginx 这些常用软件却被 yum 卡住的老手。我会把每一步背后的原因、命令、验证方法都拆开讲清楚顺带把换源后常见的坑也一并交代了。1. 换源前先看清三个前提避免白折腾换 YUM 源不是拿到命令就curl、mv一通操作。我在运维过程中发现很多新手换源失败不是命令错了而是准备工作没做好。换源前有几个前提条件需要先确认清楚花两分钟检查后面能省半个小时的排查时间。1.1 确认系统版本与架构决定用哪一套 repoYUM 源的 repo 文件不是所有版本通用的。CentOS 7 和 CentOS 8 的镜像路径、仓库名称、软件包版本差异很大如果把 CentOS 8 的 repo 文件用到 7 上轻则 repolist 为空重则各种依赖冲突。进入系统后先确认版本和架构cat /etc/redhat-release uname -m正常情况下你会看到类似这样的输出CentOS Linux release 7.9.2009 (Core) x86_64这两条信息决定了你下载哪个 repo 文件。比如阿里云镜像站对 CentOS 7 提供了专门的Centos-7.repo而 CentOS 8 对应的是Centos-8.repo。x86_64架构则对应镜像路径中的$basearch变量这些在 repo 文件里都是自动拼接的但前提是系统能正确识别版本。另外确认一下系统里有没有wget。虽然我用curl也能完成下载但很多新手教程默认用 wget如果你的 CentOS 7 是最小化安装wget 可能没装上。此时直接用curl是最省事的不需要额外安装。which wget which curl我遇到过不止一次有人为了用 wget 下载先执行yum install -y wget结果命令卡在默认源上下载不下来这就形成了死循环。所以本篇文章的命令统一用curl不依赖 wget。1.2 网络能不能通外网是换源的前提条件换源的本质是去国内镜像站拉取软件包元数据。如果机器本身连外网都通不了换哪个源都没用。这里说的“通外网”不光是能 ping 通而是 yum 能正常走 HTTPS 协议去访问镜像站。先做一个基础连通性测试ping -c 4 223.5.5.5这个 IP 是阿里云的公共 DNS用它而不是用 baidu.com 去测试是为了区分“DNS 解析问题”和“网络连通问题”。如果 ping IP 也不通说明你的服务器出网就有问题——虚拟机可能没开 NAT或者物理机网线都不通这时候先不要去管 YUM 源把网络调通再说。如果 ping IP 通、ping 域名不通那就是 DNS 配置有毛病。查看一下cat /etc/resolv.conf正常情况下应该至少有一行 nameserver比如nameserver 223.5.5.5 nameserver 114.114.114.114如果这个文件是空的或者 nameserver 指向了一个不可达的地址yum 解析镜像域名就会报Could not resolve host。这属于 CentOS 7 安装后非常典型的问题后面第 4 部分我会展开讲排查方法。1.3 国内镜像选哪个区别真的不大但要注意 EPEL国内比较常用的 CentOS 7 镜像源有这么几个阿里云、清华 TUNA、腾讯云、华为云。很多人在这一步纠结半天我直接说结论——选哪个都行本质上它们都是 CentOS 官方仓库的镜像同步软件包内容几乎没有差异主要区别在访问速度和稳定性。我用过的感受是镜像站镜像仓库地址特点阿里云mirrors.aliyun.com覆盖面最广服务器分布全国公司环境默认首选清华 TUNAmirrors.tuna.tsinghua.edu.cn教育网环境速度极快校园网用户首选腾讯云mirrors.cloud.tencent.com腾讯云服务器内网访问快云上环境顺手就配华为云mirrors.huaweicloud.com华为云服务器内网访问快更新也比较及时我个人在非云环境的物理机上用得最多的是阿里云原因就一个文档多、遇到问题好搜而且它的 repo 文件里已经把 base、updates、extras、centosplus 这些仓库都合并好了配置起来比较省心。这里要额外提醒一个很多人会忽略的点EPEL 源。EPEL 全称 Extra Packages for Enterprise Linux是 Fedora 社区维护的一个第三方软件仓库里面有大量 CentOS 官方源里没有的软件包比如 nginx、certbot、htop 这些。默认情况下你是装不了这些的需要先装epel-release这个包来激活 EPEL 源然后再把 EPEL 源也替换成国内镜像。很多教程只教你换了 CentOS-Base.repo没教你换 EPEL 源结果装 nginx 的时候又卡回国外源了。下文我会专门写一节讲 EPEL 源怎么一并换。2. 核心三步备份、下载、重建缓存准备工作做完了进入正题。所谓三步每一步都很短但每一步都有必须注意的细节。我在下面把三条命令拆开讲附带每条命令的原理和常见坑。2.1 第一步把原始源备份起来留一条回头路CentOS 7 的 YUM 源配置目录在/etc/yum.repos.d/里面的.repo后缀文件就是软件仓库的配置文件。yum 启动时会读取这个目录下所有.repo文件把里面定义的仓库合并到一起。系统默认的源配置文件叫CentOS-Base.repo我一般建议先备份整个目录而不是只备份一个文件cd /etc/yum.repos.d/ mkdir repo_bak mv *.repo repo_bak/这组命令的作用是进入源配置目录创建一个名为 repo_bak 的备份目录然后把当前目录下所有以.repo结尾的文件移进去。后面就算新下载的 repo 文件有问题也可以随时把备份目录里的文件恢复回来。有人可能会问为什么不直接把原文件删了因为 yum 没有原厂授权文件的话一旦你新下载的 repo 文件格式有问题或者镜像站域名解析失败系统就连恢复的通道都没有了。备份的意义就是给自己留退路。这是我经历过很多次生产环境事故之后养成的习惯——任何改动先备份成本极低收益极高。备份之后/etc/yum.repos.d/目录下暂时是空的此时执行yum repolist会提示没有已启用的仓库这是正常的别慌。2.2 第二步把国内源 repo 文件下载到正确位置接下来就是把国内镜像源提供的 repo 文件下载下来放到刚才清空的目录里。以下以阿里云镜像为例curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo拆开看这条命令-o参数指定输出文件路径后面跟的是阿里云镜像站提供的 CentOS 7 仓库配置文件下载地址。下载完成后这个文件就被保存为标准的CentOS-Base.repoyum 启动时会自动读取它。下载完成后建议打开文件看一眼内容确认没有变成乱码或者 HTML 错误页面cat /etc/yum.repos.d/CentOS-Base.repo正常你应该看到类似这样的结构[base] nameCentOS-$releasever - Base - mirrors.aliyun.com baseurlhttps://mirrors.aliyun.com/centos/$releasever/os/$basearch/ gpgcheck1 gpgkeyhttps://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7这里有几个点值得说道说道。$releasever是 yum 的环境变量系统会自动替换成主版本号 7$basearch会被替换成 x86_64。所以你下载的时候不需要把 7 写死在 URL 里这个文件本身是通用的。另外注意gpgcheck1这表示 yum 安装包时会校验 GPG 签名。文件末尾的gpgkey路径就是公钥存放位置阿里云 repo 文件已经把公钥地址指好了正常情况下不会出现 NOKEY 错误。如果你用的是清华源命令对应改成curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.tuna.tsinghua.edu.cn/help/centos/centos-7.repo这个 URL 的具体写法和阿里云不太一样建议去各镜像站的 help 页面复制官方给出的配置命令比自己拼 URL 靠谱。腾讯云和华为云也有类似的提供方式。2.3 第三步清理旧缓存并重新生成缓存repo 文件替换完成后还需要让 yum 重新读取新仓库的元数据。这里有个非常容易被忽略的细节yum 会把历史仓库的元数据缓存在本地/var/cache/yum/目录里。如果不清理旧缓存里记录的仓库 URL 还是官方源的执行任何操作都可能继续连到官方源去你甚至会怀疑“源的 repo 文件是不是没换成功”。清理缓存并重建缓存两条命令搞定yum clean all yum makecache第一条命令yum clean all会清掉所有已下载的包和元数据缓存。第二条命令yum makecache会按照当前所有启用的仓库配置重新下载元数据文件到本地缓存。执行yum makecache时如果你看到类似这样的输出Loaded plugins: fastestmirror, langpacks base | 3.6 kB 00:00 base/7/x86_64/primary_db | 6.0 MB 00:08 updates | 3.4 kB 00:00 updates/7/x86_64/primary_db | 13 MB 00:19这说明新源已经生效了。如果输出里出现mirrors.aliyun.com字样那就更确认无疑了。首次 makecache 的时间取决于网速一般在几十秒到几分钟之间如果卡住不动多半是网络到镜像站速度太差换个镜像站可解。三步到此就完成了。整个过程就是备份——下载——重建没有任何多余操作。3. 换源后怎么确认生效以及几个重要延伸三步做完了但“做完了”和“确定做对了”是两码事。我见过不少人换完源以后因为验证不彻底后面装软件时依旧报错然后又回头怀疑换源步骤有问题。这一节专门讲验证方法顺便把 EPEL 源和本地源这两个高频延伸场景一起覆盖掉。3.1 用 repolist 和实际安装验证是否真的换成功了换源后的第一件事是查看当前已启用的软件仓库列表yum repolist输出应该包含仓库 ID、名称以及每个仓库里可用的软件包数量。比如repo id repo name status base/7/x86_64 CentOS-7 - Base - mirrors.aliyun.com 10,097 extras/7/x86_64 CentOS-7 - Extras - mirrors.aliyun.com 516 updates/7/x86_64 CentOS-7 - Updates - mirrors.aliyun.com 3,423看到仓库名字里带有mirrors.aliyun.comstatus 列的数量也正常这就算基本验证通过了。接下来我建议做一次实际安装测试不要只停留在查看层面。随便装一个小软件包比如yum install -y vim-enhanced安装过程中注意观察终端里显示的下载地址。如果是从mirrors.aliyun.com拉取就说明 yum 实际使用的通道确实是国内镜像如果看到mirror.centos.org之类的官方域名说明你的 repo 文件可能没有被正确加载或者缓存没清干净。这里多说一句yum repolist all。这个命令会把你机器上所有仓库都列出来包括禁用的。有时候你下载了新 repo 文件但系统里还留着其他乱七八糟的 repo 文件它们可能互相干扰。用yum repolist all可以一眼看清当前系统加载了哪些仓库哪些被启用了哪些被禁用了。我自己排查问题时几乎必用这条命令。3.2 顺手把 EPEL 源也换成国内镜像装软件踩坑的另一个重灾区是 EPEL 源。EPEL 源默认也是指向国外服务器CentOS 7 安装完系统后执行yum install -y epel-release装的是官方 EPEL 仓库配置速度照样感人。先把 EPEL 包装上让系统知道有这个仓库yum install -y epel-release装完后直接用阿里云的 EPEL 配置覆盖默认配置curl -o /etc/yum.repos.d/epel.repo https://mirrors.aliyun.com/repo/epel-7.repo这里要注意文件名。阿里云提供的 EPEL 配置文件名是epel-7.repo下载后要保存为/etc/yum.repos.d/epel.repo才能覆盖掉原文件。覆盖完记得再执行一次yum clean all yum makecache之后yum repolist你就会看到多了一个epel/x86_64仓库里面软件包数量在上万级别。nginx、certbot、htop、iftop 这些常用工具基本都在这里。我建议所有 CentOS 7 机器在配置基础源的同时就把 EPEL 源配好不要等到装软件需要时再补。因为很多软件包的依赖关系是从 EPEL 仓库里解决的基础源和 EPEL 源同时配好yum 做依赖解析时才不会两边各跑一遍国外地址。3.3 离线环境下的本地 YUM 源玩法有些服务器在内网环境连不上外网镜像站。这时候“换源”就变成了“配置本地源”。很多学校实验课上的题目就是“linux 配置本地 yum 源实验目的”其实就是用 CentOS 7 的光盘镜像 ISO 挂载成本地仓库。本地源的配置思路和在线源一样也是写一个 repo 文件只是把baseurl从 HTTP 地址改成file://本地路径。先把 ISO 镜像挂载到系统mount -o loop /opt/CentOS-7-x86_64-Minimal-1804.iso /mnt然后在/etc/yum.repos.d/下新建一个local.repo[local] nameLocal CentOS 7 Repo baseurlfile:///mnt enabled1 gpgcheck0这里的gpgcheck0是因为本地镜像一般没有预置 GPG 公钥跳过校验省得报错。保存后执行yum clean all yum makecache就能从本地镜像安装基础软件包了。这种本地源方式在内网服务器、离线环境虚拟机里非常实用。不过要注意ISO 镜像里的软件包版本是发布时固定的不像在线源那样可以持续获取更新所以本地源通常只作为离线场景的临时方案。4. 常见问题排查与避坑经验换源这事看着简单实操中翻车的概率其实不低。我把这些年积累的典型问题列成一张排查清单按频率从高到低排列挨个说解决方案。4.1 换完源 yum update 还是 404多半是变量没解析对最常见的问题是执行yum update或yum makecache时报 404。字面上看是找不到路径但十几年经验告诉我90% 的情况不是镜像站缺文件而是 repo 文件里的 URL 路径拼错了。用yum repolist -v查看仓库详细信息能看到每条仓库最终解析出的实际 URLyum repolist -v如果看到类似Repo-baseurl : https://mirrors.aliyun.com/centos/7.9.2009/os/x86_64/那就是$releasever变量被解析成了7.9.2009这个完整版本号但阿里云镜像站上的目录名是7所以 404。这种情况常见于某些 repo 文件里写了${releasever}而不是标准的$releasever或者系统里的/etc/yum/vars/releasever被改过。应急解法是直接把变量替换成固定版本号sed -i s/$releasever/7/g /etc/yum.repos.d/CentOS-Base.repo这条命令会把 repo 文件里的$releasever全部替换成7强制走7/os/x86_64/路径。我个人的建议是替换之前先看看文件原本是怎么写的很多 CentOS 7 的第三方 repo 文件确实存在这类坑。4.2 ping 不通百度先查网关、DNS 和网卡开机自启这个故障和换源未必直接相关但几乎每个用虚拟机安装 CentOS 7 的学员都遇到过必须单独讲一下。现象是物理机网络正常虚拟机里ping www.baidu.com却一直超时。排查顺序按下面三步走第一步ping 网关确认链路通不通ip route show default ping -c 4 192.168.x.1如果网关都 ping 不通说明虚拟机的网络模式没配对。VMware 里通常是改为 NAT 模式VirtualBox 里也建议 NAT 或桥接。第二步ping 公网 IP。前面说了用223.5.5.5。如果公网 IP 通域名不通那就是 DNS 问题顺手修一下/etc/resolv.conf。第三步检查网卡配置。CentOS 7 有个历史著名问题——网卡默认ONBOOTno导致重启后网卡根本不启用。查看cat /etc/sysconfig/network-scripts/ifcfg-ens33把ONBOOT改回yes然后重启网络systemctl restart network这个坑在 CentOS 7 里出现频率极高很多人一装完系统 ping 不通百度就开始怀疑 YUM 源其实根本不是源的问题。4.3 GPG 密钥、服务器时间、缓存残留等隐蔽坑有几个问题不那么常见但一出现就足够让人头疼。第一个是 GPG 密钥警告。执行 yum 安装时报NOKEY或者GPG key retrieval failed。原因是系统的公钥库里没有对应仓库的公钥。解决办法是把公钥导入rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7阿里云镜像站的公钥也可以直接从镜像地址下载导入repo 文件里gpgkey那行已经写了路径照着配置就行。第二个是服务器时间不对导致 HTTPS 证书校验失败。curl 走 https 协议下载时会校验证书有效期如果你的系统时间和现实差距太大就会报SSL certificate problem: certificate is not yet valid。快速看时间date时间不对就先同步一下yum install -y ntpdate ntpdate ntp.aliyun.com没换源之前你装 ntpdate 可能也会卡住所以更推荐在系统初始化阶段就把时间同步配好或者直接用timedatectl set-ntp true如果能联网。第三个是缓存残留导致新源不生效。这个前面提过这里再强调一次换源之后如果不执行yum clean all终端里的下载地址永远可能是旧的。我遇到过有同事改完 repo 文件没清缓存然后跑到网上吐槽“换了阿里云源下载还是来自官方源”其实就是这一步漏了。第四个是/etc/yum.repos.d/目录下有多个互相冲突的 repo 文件。比如既有CentOS-Base.repo又有CentOS-Linux-Base.repo或者残留了系统自带的CentOS-Media.repo。多个 repo 文件定义同一个仓库 ID 时yum 的解析行为可能不符合预期。排查方法就是把目录列出来看一眼ls -l /etc/yum.repos.d/发现多余文件就移到备份目录保持这个目录只留你需要的 repo 文件干净才是王道。最后的一点个人经验我每次给团队新人布置任务都会让他们先手动完成一次完整的 YUM 源更换而不是直接扔一个一键脚本过去。原因不在于三步命令有多难记住而是这个操作背后的核心逻辑——理解/etc/yum.repos.d/目录的作用、理解 repo 文件里的变量含义、理解清理缓存的必要性——几乎覆盖了 CentOS 软件管理的所有基础常识。把这套逻辑搞清楚之后不管遇到仓库冲突、GPG 报错还是镜像站临时故障你都能顺着机制去排查而不是病急乱投医。另外把我个人常用的做法分享给大家把备份、下载、重建缓存这套流程写成一个change_yum.sh脚本统一放到/root/scripts/目录下。每台新机器跑一遍整个过程 30 秒完成顺手解决后续装软件的一切网络问题。#!/bin/bash mkdir -p /etc/yum.repos.d/repo_bak mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/repo_bak/ curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo curl -o /etc/yum.repos.d/epel.repo https://mirrors.aliyun.com/repo/epel-7.repo yum clean all yum makecache你唯一要做的是搞清楚这个脚本里每一步在干什么。搞清楚了你就不会再被 yum 网络问题劝退。CentOS 7 换源真的就这三步但把这三步背后的机制吃透你以后在服务器上面对的不只是换源而是整个软件包管理体系的游刃有余。
