刚接手一台CentOS服务器准备装个软件结果yum一执行就报错“Could not retrieve mirrorlist http://mirrorlist.centos.org/?relea...”后面跟一串看不太懂的地址。很多运维新手第一次遇到这个提示第一反应是网络断了或者是DNS解析出问题了一顿排查下来还是不行。这个报错在近两年出现的频率极高尤其是CentOS 7和CentOS 8的用户几乎无一幸免。这篇文章就围绕这个报错把原因、排查思路、解决方案一次讲透顺便把换源、配置本地源的实操也一起给了保证你照着做就能解决。先说结论这个报错绝大多数情况下不是你的网络问题而是CentOS官方对旧版本软件源服务做了调整导致yum默认访问的mirrorlist地址已经失效。想彻底解决最稳的办法就是把手动配置的yum源从官方默认源切换到可用的镜像源比如国内镜像站或者使用本地源。下面我会从报错机制讲起逐步带你完成排查和配置。1. 报错产生的根本原因1.1 “Could not retrieve mirrorlist”到底卡在哪一步我们先拆解一下这个报错的执行链路。当你执行yum install xxx的时候yum会读取/etc/yum.repos.d/目录下的所有.repo配置文件。以CentOS 7默认的CentOS-Base.repo为例里面会有一行类似这样的配置mirrorlisthttp://mirrorlist.centos.org/?release7archx86_64repoosinfrastockyum拿到这个mirrorlist地址后会去请求这个URL得到一个包含多个镜像服务器地址的列表然后再从中选择一个速度最快的镜像去下载软件包元数据。问题就出在第一步请求mirrorlist.centos.org这个域名时失败了yum无法获取到可用的镜像列表自然就抛出了“Could not retrieve mirrorlist”的错误。这就好比你拿着一个通讯录准备给朋友打电话结果通讯录本身是伪造的、空白的你当然不知道拨哪个号码。yum也一样它拿到的是一个无法返回合法内容的地址后面的流程全部中断。1.2 为什么是2024年之后集中爆发这里有明确的时间线。CentOS 7的主流支持周期在2024年6月30日正式结束CentOS 6更早就停止维护了。官方停止维护后对应的mirrorlist服务也随之发生变化。老版本的CentOS如果继续使用默认的mirrorlist地址请求会直接失败。CentOS 8的情况略有不同它在2021年底就停止了维护默认的yum源也早已被迁移到了vault仓库。所以你现在看到的这个报错本质上是“操作系统生命周期结束”和“软件源服务调整”共同作用的结果。如果你还在用老版本的CentOS且没有及时更换软件源那这个报错几乎是必然会出现的。别指望修改一下网卡配置、重启一下network服务就能解决方向错了再怎么折腾都是白费劲。1.3 这个报错和其他yum报错的区别yum常见的报错还有“Cannot find a valid baseurl for repo: base/7/x86_64”以及“Failed to download metadata for repo”。这几个报错经常被混为一谈实际上有细微差别报错信息大概率原因排查方向Could not retrieve mirrorlistmirrorlist地址不可达或DNS解析失败网络、DNS、镜像源配置Cannot find a valid baseurlmirrorlist能访问但列表为空或baseurl无效yum源配置、镜像源可用性Failed to download metadata已找到仓库但元数据下载失败基础源、EPEL源的HTTPS证书或版本匹配明白这些区别你就能在排查的时候少走弯路。后面讲到具体问题表格的时候再展开细说。2. 动手排查前必看的3个方向2.1 网络连通性检查别急着怪yum有个基本原则先确认基础网络没毛病再碰yum的配置。我在排查这类问题时习惯按下面的顺序来ping -c 4 223.5.5.5 ping -c 4 mirrorlist.centos.org curl -I http://mirrorlist.centos.org/?release7第一跳是ping公网IP。如果ping 223.5.5.5都不通说明服务器网络出口有问题。检查网卡状态ip addr、路由ip route、DNS配置/etc/resolv.conf。第二跳是ping域名这一步区分是DNS解析失败还是路由不可达。第三跳是curl直接请求mirrorlist地址看返回的HTTP状态码。从我实际处理过的案例来看大概有两成的情况确实是服务器DNS配置指向了一个失效的内网DNS服务器或者防火墙做了域名过滤。这种情况下你更换镜像源也一样失败。所以排查顺序必须是先网络后配置。2.2 配置文件排查是否有残留的旧配置很多服务器上的yum源配置文件是被各种教程、一键脚本改过的。我看过的机器里有的/etc/yum.repos.d/目录下除了CentOS自带的repo文件还堆着各种备份文件、第三方repo比如CentOS-Base.repo.bak、epel.repo.rpmnew等。yum对.repo后缀的文件都会读取。如果你之前手滑把base源的文件名改了但没改全或者多个repo文件里存在重复的baseurl就会引起各种奇怪的问题。所以建议先看一眼目录下的情况ls -l /etc/yum.repos.d/发现有多余的、备份的repo文件不用客气移到/etc/yum.repos.d/backup/目录去只保留需要的配置文件。这个动作虽然简单但能帮你排除掉环境干扰的因素。2.3 检查系统版本明确自己用的是哪个系统CentOS 7、CentOS 8、CentOS Stream的yum源配置方法不一样网络上很多教程只讲了其中一种照搬容易踩坑。先执行cat /etc/redhat-release看到结果后再对照后面的解决方案操作。如果你用的是CentOS 7就找CentOS 7专用的源配置如果是CentOS 8或者Stream需要的配置不同千万别混用。有些用户拿着CentOS 7的源配置硬套到CentOS 8上结果就是一堆依赖错误和版本冲突。3. 解决方案一配置国内镜像源最推荐3.1 为什么优先选择国内镜像源mirrorlist.centos.org失效以后官方源并非完全不能用但很多老版本的仓库内容已经被移到了vault归档仓库里。直接从官方vault拉取速度慢且不稳定加上网络链路的问题超时概率很大。国内镜像站阿里云、清华TUNA、中科大等都会同步CentOS的官方仓库并且提供稳定的访问速度配置方式和官方源非常接近。拿阿里云镜像站举例CentOS 7的仓库地址是http://mirrors.aliyun.com/centos/7/os/x86_64/这个地址是长期维护的不会像官方mirrorlist那样说挂就挂。对于国内服务器来说配置这个源之后的下载速度通常能提升好几倍。3.2 备份原配置并写入新源无论你打算用哪个镜像站第一步永远是备份原配置而不是直接删除。养成这个习惯后面想回滚或者排查问题会从容很多mkdir -p /etc/yum.repos.d/backup mv /etc/yum.repos.d/CentOS-*.repo /etc/yum.repos.d/backup/然后新建一个配置文件比如CentOS-Base.repo写入镜像源配置。下面是阿里云CentOS 7源的完整内容[base] nameCentOS-$releasever - Base baseurlhttp://mirrors.aliyun.com/centos/$releasever/os/$basearch/ gpgcheck1 enabled1 gpgkeyhttp://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7 [updates] nameCentOS-$releasever - Updates baseurlhttp://mirrors.aliyun.com/centos/$releasever/updates/$basearch/ gpgcheck1 enabled1 gpgkeyhttp://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7 [extras] nameCentOS-$releasever - Extras baseurlhttp://mirrors.aliyun.com/centos/$releasever/extras/$basearch/ gpgcheck1 enabled1 gpgkeyhttp://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7这里解释一下几个关键参数。baseurl是仓库的实际地址相当于告诉yum“你去这个商店买东西”gpgcheck1表示开启GPG校验防止软件包被篡改gpgkey是公钥地址。$releasever和$basearch是yum的变量前者代表系统主版本号7后者代表架构x86_64无需手动替换。3.3 清理缓存并验证配置写完以后需要让yum重新建立缓存。执行yum clean all yum makecachemakecache会去下载仓库的元数据。看到类似Metadata cache created.的提示说明配置生效了。接下来测试安装一个软件yum install -y vim如果能正常安装整个修复过程就完成了。如果你的机器环境特殊比如内网有代理或者只能访问某些特定域名记得提前把代理配好不然换源之后依然可能失败。3.4 CentOS 8/Stream版的换源差异CentOS 8的情况特殊一点。因为CentOS 8已经EOL阿里云和清华的镜像站单独做了归档目录。比如阿里云的CentOS 8源地址是http://mirrors.aliyun.com/centos-vault/8.5.2111/配置的时候不能直接写$releasever因为默认的releasever是8但实际仓库路径已经带上了具体版本号。最简单的办法是把baseurl里的$releasever手动改成具体的版本号比如8.5.2111。CentOS Stream的源地址结构又不一样常见的是http://mirrors.aliyun.com/centos-stream/所以CentOS 8/Stream用户在换源时务必先确认自己的版本再选择对应的镜像路径。我的建议是如果生产环境能用CentOS 7就先别急着升级毕竟生态最成熟、踩坑资料也最多如果已经上了CentOS 8/Stream就老老实实按对应的文档操作。4. 解决方案二配置本地yum源4.1 什么场景下需要本地源不是所有服务器都能访问外网。有些内网环境、隔离机房或者安全要求极高的生产网段服务器根本没有外网权限。这时候镜像源也白搭只能配置本地源。本地源有两种常见形态使用系统安装ISO镜像作为源适合少量机器简单粗暴搭建局域网内的yum源服务器适合批量机器集中管理如果你手头有CentOS 7的ISO镜像文件用第一种方案就能很快解决问题。先挂载ISOmkdir -p /mnt/centos7 mount -o loop /path/to/CentOS-7-x86_64-DVD-2009.iso /mnt/centos74.2 编写本地repo文件挂载完成后新建一个repo文件[local-base] nameLocal CentOS $releasever - Base baseurlfile:///mnt/centos7 gpgcheck0 enabled1注意这里我把gpgcheck设置为0原因在于ISO镜像里的RPM包是官方原版本地挂载校验意义不大而且内网环境往往没有GPG公钥开了反而会报错。如果你对安全有要求也可以设置为1并把公钥文件路径配好。配置完成后同样的流程yum clean all yum makecache如果ISO文件完整元数据会正常加载。这种方式的局限也很明显ISO包里只有基础软件包和常用工具如果以后要安装某个ISO里没有的软件还是会失败。适合用来解决“装个基本环境”这类需求。4.3 进阶局域网yum源服务器机房里有几十台机器都要装软件每台挂ISO肯定不现实。这时候可以挑一台能访问外网的服务器配置好镜像源再通过Nginx或HTTP服务把/mnt/centos7或同步下来的镜像目录共享出去。其他机器把repo文件的baseurl指向baseurlhttp://yum-server.local/centos/7/os/x86_64/这种方式的好处是内网机器不用访问外网拉取速度极快但要求你得先有一台“跳板”能同步软件包。这个方案做起来不难等有机会单独写一篇详细点的教程。5. 常见问题与排查技巧实录5.1 报错速查表场景报错摘要处理方法使用默认源Could not retrieve mirrorlist按第3节更换镜像源换源后执行makecache超时Failure when receiving data from the peer检查防火墙、代理、baseurl路径格式GPG签名验证失败Public key for xxx is not installed导入对应版本的GPG-KEY执行安装提示依赖冲突nothing provides xxx needed by xxx检查是否有多个repo源优先级冲突清理缓存重试元数据错误repomd.xml is missing确认baseurl目录层级是否正确下载中断Downloading from mirror ... was interrupted重试或更换镜像源上面这张表覆盖了我遇到过的绝大多数场景。第一行就是此次要解决的问题后面几行都是换源过程中高频出现的次生问题。5.2 yum源配置后依然报错的几个冷门原因检查了半天源也换了缓存也清了还是不行。这时候往往是一些容易被忽略的细节在作怪。一个是repo文件格式问题。手写配置文件的时候缩进、空格、换行都要规范。[base]后面的键值对要顶格别在行首加空格。我曾经见过某台机器repo文件是从网页上直接复制的行尾带了看不见的特殊字符yum解析的时候直接报错。另一个是多个repo文件之间的冲突。比如系统自带的epel.repo也失效了而你只处理了CentOS-Base.repo。执行yum时EPEL源的元数据下载失败同样会导致安装中断。处理方式是把/etc/yum.repos.d/下所有源都过一遍尤其是EPEL源它经常被忽略。还有一个是DNS解析的缓存问题。改了/etc/resolv.conf以后可以先执行nslookup mirrors.aliyun.com确认解析正常再继续操作。有些厂商云的服务器内网DNS解析外网域名很慢用公网DNS223.5.5.5、8.8.8.8反而更快。5.3 经验心得不要忽视系统版本的生命周期最后聊一点实操体会。我发现很多用户的机器是多年前部署的系统装完以后就再没管过yum源这回事直到某天要装软件才发现问题。做运维的人最好在服务器上线的时候就把yum源配置成国内镜像源同时做好repo文件的备份和检查。这样等官方源失效的那天你的机器不会有任何感知。如果你需要管理多台机器建议写一个简单的脚本批量处理。脚本的核心逻辑就是备份原repo文件、下载新的repo文件、清理缓存、重建缓存。把这个脚本保存下来下次新机器上线直接执行几分钟搞定。这个报错说到底是CentOS旧版本生命周期结束带来的连锁反应之一。理解了原理排查起来就不会慌。先把网络确认了再把源换好最后细节上多留神基本都能顺利解决。希望通过这篇文章你再遇到“Could not retrieve mirrorlist”的时候能心里有底顺手解决。