ARTICLE DETAIL

资讯详情

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

CentOS 7 yum源报错Could not resolve host mirrorlist.centos.org 解决方案

CentOS 7 yum源报错Could not resolve host mirrorlist.centos.org 解决方案 第一次在CentOS 7上看到“Could not resolve host: mirrorlist.centos.org”这个报错时我正蹲在一台刚克隆出来的虚拟机前面做初始环境配置。yum install敲下去两秒钟内满屏报错。第一反应是DNS有问题nameserver换了两套网卡重启好几回问题依然在。后来把yum源的工作机制完整捋了一遍才意识到这个报错背后藏着两条完全不同的故障路径一条是本地网络和DNS确实有毛病另一条是CentOS 7官方源已经迁移老域名根本不提供解析服务了。这篇文章就把这个报错从原理到实操完整拆开讲覆盖DNS修复、vault官方仓库切换、国内镜像源替换三种方案并附上VMware虚拟机环境下的完整修复记录刚接触Linux的新手可以直接照着操作正在维护存量CentOS 7服务器的运维也能把里面的排查思路拿去用。1. 先定位这个报错到底卡在了哪一环1.1 报错出现的典型场景这类报错在不同的使用场景里出现频率特别高。最常见的是新装完CentOS 7系统后第一次执行yum update其次是给虚拟机做模板封装、克隆完重新开机再就是老机器休眠了几个月重新拉起来仓库数据已经过期。不管哪种场景报错信息本身长得都差不多Loaded plugins: fastestmirror, langpacks Could not retrieve mirrorlist http://mirrorlist.centos.org/?release7archx86_64repoosinfrastock error was 14: curl#6 - Could not resolve host: mirrorlist.centos.org; 未知的错误注意最后那一句“未知的错误”很多朋友看到这里就开始怀疑是不是系统坏了。其实不是curl#6在curl的返回码里有明确含义就是DNS解析失败网络层还能不能通都不一定但域名肯定没解析出IP。这个阶段不需要紧张也不用急着重装系统更不要盲目删除repo文件。先搞清楚yum在执行过程中到底卡在哪一步。yum更新时第一步是读取/etc/yum.repos.d/目录下的所有.repo文件根据里面的mirrorlist或baseurl配置去联系仓库服务器。如果这一层域名解析不过去后面所有步骤全部停摆。1.2 拆开看“Could not resolve host”是什么意思我用比较直白的方式解释一下yum仓库配置文件里写了一个网址比如http://mirrorlist.centos.org/?release7archx86_64repoos系统要访问这个网址第一步就必须先把域名转换成IP地址。这个转换动作叫DNS解析靠的是你机器上配置的nameserver。Could not resolve host直译过来就是“无法解析主机名”意味着系统拿着mirrorlist.centos.org这个名字去问DNS服务器结果没得到有效回答。这里要区分一下它不代表ping不通外网不代表网关有问题它只代表“域名转IP”这一步失败了。可以打个生活化的比方你的yum是个送货员它要去某仓库取货结果翻遍通讯录也找不到那个仓库的电话号码。通讯录就是/etc/resolv.conf电话号码就是DNS记录。仓库本身有没有货、路通不通那是后面的事通讯录这一关已经卡住了。搞清楚这一层逻辑后面的排查思路就会清晰很多不至于被各种带偏。1.3 三条命令快速确认故障层级遇到这个报错后我会先按下面的顺序敲三条命令把故障范围缩小到具体层级。# 第一条测试是否能够访问互联网IP ping -c 3 223.5.5.5 # 第二条测试域名解析是否正常 ping -c 3 www.baidu.com # 第三条直接测试yum仓库域名 nslookup mirrorlist.centos.org如果ping 223.5.5.5能通说明本机网络链路和网关都没问题如果ping www.baidu.com也通说明DNS解析整体可用到了第三条nslookup mirrorlist.centos.org这一步如果直接提示域名不存在或者解析超时那问题就锁定在“这个域名本身无法解析”。在CentOS 7停止维护之后mirrorlist.centos.org这个域名对广大新装系统来说已经形同虚设解析失败是常态不需要再反复折腾本机DNS。当然也有一种情况就是公司内部网络只允许访问特定的DNS服务器外部域名一律解析不了这时候需要先去解决网络出口策略而不是继续在服务器上折腾。2. 根源拆解为什么mirrorlist.centos.org突然不能解析2.1 CentOS 7停更后官方仓库域名已经迁移很多人在排查这个报错时最容易忽略的就是时间因素。CentOS 7的生命周期在2024年6月30日正式结束官方不再对CentOS 7进行任何维护和更新。生命周期结束后原本负责动态分发镜像地址的mirrorlist.centos.org服务被下线mirror.centos.org也开始停止响应CentOS 7相关的路径。这意味着什么意味着如果你新装了一台CentOS 7.9系统里默认的repo文件仍然写着老地址但官方已经不提供对应的解析和服务了。2024年之前能正常工作的配置2024年之后可能就突然不行。这是整个报错的“大背景”也是很多人排查了半天最后才恍然大悟的地方。老版本系统没有自动跳转能力它只会死板地读取/etc/yum.repos.d/CentOS-Base.repo文件里的配置。那里面写了mirrorlisthttp://mirrorlist.centos.org/?release$releaseverarch$basearchrepoosyum启动时会带上release7去请求镜像列表而这个请求在官方已经找不到对应服务自然就会报出Could not resolve host。这一步不是你的操作问题也不是网络故障纯粹是“源已经搬家了但配置还指向老地址”。2.2 本地DNS与网络链路也是高发原因排除官方源失效这个因素后还得正视本地环境的DNS配置问题。我遇到过很多次类似情况打开/etc/resolv.conf里面要么是空的要么只有一个不可达的nameserver。这种情况下访问任何域名都会失败不只是mirrorlist.centos.org。常见的原因有这么几类安装系统时没配置网络resolv.conf内容为空虚拟机克隆后网卡配置被重置DNS信息丢失企业内网要求使用内部DNS但服务器配置的是公共DNS被防火墙拦截有人手动改过/etc/resolv.conf重启后被NetworkManager重新覆盖成默认值。这些都属于本地链路问题。判断方法也简单把nameserver改成公共DNS再测试一次如果www.baidu.com能解析yum还是报同样的错然后再去考虑仓库源的问题。注意一个细节改/etc/resolv.conf是临时生效的办法重启网络服务或者重启主机后NetworkManager很可能把它覆写掉。永久修复要在网卡配置文件/etc/sysconfig/network-scripts/ifcfg-ens33里写DNS1和DNS2或者用nmcli命令设置。2.3 VMware虚拟机里更容易踩的坑结合最近常被问到的场景VMware虚拟机里装CentOS 7之后出现这个报错的概率不低。NAT模式下只要安装时选择了自动获取IP通常网络是正常的。但很多人会手贱去配置静态IP这一改就容易出问题。NAT模式虚拟机的虚拟网卡默认网关一般是192.168.xx.2也就是VMware NAT网关的地址。有些人习惯性填成192.168.1.1或者192.168.0.1结果网络包根本出不去自然解析不了域名。还有人在ifcfg文件里漏写了ONBOOTyes系统启动后网卡压根没有启用ip addr一看只有lo回环地址。克隆虚拟机更要注意克隆出来的机器网卡名称可能从ens33变成ens37之类UUID也可能冲突导致网络起不来。遇到这种情况不要上来就改源先确认网卡状态、IP地址、网关和DNS都正常。网络都不通换什么源都是白搭。3. 解决方案三条路照着做就能恢复yum3.1 方案一修复本地DNS与网卡配置这个方案适合确认是本地DNS损坏或者网络配置错误的情况。先临时改resolv.conf测试echo nameserver 223.5.5.5 /etc/resolv.conf echo nameserver 114.114.114.114 /etc/resolv.conf改完马上测试ping -c 3 www.baidu.com如果能通说明就是DNS的问题。接下来做永久修复编辑网卡配置文件vi /etc/sysconfig/network-scripts/ifcfg-ens33在文件里补上DNS1223.5.5.5 DNS2114.114.114.114 ONBOOTyes BOOTPROTOstatic IPADDR192.168.1.100 NETMASK255.255.255.0 GATEWAY192.168.1.1如果你是在VMware NAT模式下GATEWAY要填NAT网关地址通常是192.168.xx.2不要想当然填别的网段。改完重启网络systemctl restart network再检查一次ping -c 3 www.baidu.com nslookup www.baidu.com两条都正常再执行yum update看情况。如果还是报Could not resolve host: mirrorlist.centos.org说明问题已经不在本地DNS直接进入下一节修改源配置。3.2 方案二切换官方vault旧包仓库CentOS 7停止维护后官方把所有历史版本的RPM包挪到了vault.centos.org。这个域名依然可用专门存放已经停止维护的旧版本仓库。如果你希望继续使用官方源的地址体系可以把repo文件里的mirrorlist注释掉把baseurl改成vault。先做备份这是操作前的好习惯mkdir -p /root/repo-backup cp -r /etc/yum.repos.d/* /root/repo-backup/然后执行替换sed -i s|^mirrorlist|#mirrorlist|g /etc/yum.repos.d/CentOS-*.repo sed -i s|^#baseurlhttp://mirror.centos.org/centos/$releasever|baseurlhttps://vault.centos.org/7.9.2009|g /etc/yum.repos.d/CentOS-*.repo sed -i s|$releasever|7.9.2009|g /etc/yum.repos.d/CentOS-*.repo这里有个非常关键的细节vault目录的顶层结构是按照完整版本号组织的比如7.9.2009它不是按照7这种大版本号组织的。如果你把路径写成vault.centos.org/7/os/x86_64/大概率会得到404。用7.9.2009才能正确访问。执行完再看一下repo文件是否干净grep -rn mirrorlist /etc/yum.repos.d/ | grep -v ^.*#如果有还没注释的mirrorlist手动改掉。清理缓存后重建yum clean all yum makecache这个方法的好处是地址完全在官方体系内不依赖第三方站点适合对来源有严格要求的场景。缺点是vault服务器在海外国内网络环境下速度可能比较慢耐心等一会儿就好。3.3 方案三使用国内镜像源日常推荐日常使用我更推荐直接换成国内镜像源速度快、配置简单而且这类镜像站会长期保留CentOS 7的最终版本内容。以阿里云镜像站为例最简单的方式是直接下载阿里云维护好的repo文件curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo注意这个命令的前提是网络已经通了至少能访问mirrors.aliyun.com。如果连这一步都报Could not resolve host那就先执行3.1里的DNS修复把域名解析恢复正常再操作。如果不想下载整个repo文件也可以沿用原来的文件做sed替换sed -e s|^mirrorlist|#mirrorlist|g \ -e s|^#baseurlhttp://mirror.centos.org/centos/$releasever|baseurlhttps://mirrors.aliyun.com/centos/$releasever|g \ -i.bak /etc/yum.repos.d/CentOS-Base.repo国内可选的镜像站很多清华大学TUNA镜像站、阿里云镜像站、腾讯云镜像站都可以。选一个你网络环境里访问速度最快的就行。替换完成后同样要清缓存yum clean all yum makecache用国内源之后yum makecache的进度条跑起来明显快很多装软件时的下载速度差距更是肉眼可见。对于个人开发机和测试环境这是性价比最高的方案。3.4 三个方案怎么选对比与适用场景方案适用场景优点缺点修复DNS与网卡确认网络配置错误、DNS缺失不动yum源配置治本如果域名本身不可达则无效切换vault官方仓库对软件来源有严格管理要求的生产环境保持官方地址不引入第三方速度可能慢路径必须写完整版本号使用国内镜像源个人开发机、测试环境、日常运维速度快配置简单依赖镜像站连通性断源时需要切换备用如果只是想让yum赶紧恢复正常优先走国内镜像源。如果是公司内部有合规要求必须走官方源那就用vault。不管哪条路修复DNS都是第一前提域名都解析不了后面全白搭。4. 实操还原VMware上新装CentOS 7后的一次完整修复4.1 现场操作全流程回放用一个比较典型的场景完整走一遍。我在VMware Workstation里新建了一台CentOS 7.9虚拟机安装完成后准备装vim结果出现Could not resolve host: mirrorlist.centos.org。第一步检查IP地址ip addr看到ens33有正常的IP说明虚拟机网卡已经连上。第二步测试网络ping -c 3 223.5.5.5能通。第三步测试域名解析ping -c 3 www.baidu.com报Name or service not known到这里可以断定DNS有问题。打开/etc/resolv.conf一看里面只有一行注释nameserver是空的。临时写入两个公共DNSecho nameserver 223.5.5.5 /etc/resolv.conf echo nameserver 114.114.114.114 /etc/resolv.conf再次ping www.baidu.com通了。结果跑yum makecache还是报同样错误这说明本地DNS已经恢复了问题出在yum源配置上。于是备份原repo文件执行vault替换命令。替换后执行yum clean all yum makecache这次顺利跑完后面安装yum install -y vim也一次通过。整个过程从报错到恢复用了不到五分钟。4.2 核心细节占位符、备份与源文件检查操作中容易忽略的几个点逐个说明。先看占位符。CentOS的repo文件里常见$releasever和$basearch前者代表大版本号CentOS 7下就是7后者代表架构通常是x86_64。用国内源时路径里保留这两个变量没问题因为阿里云、清华的目录结构支持7/os/x86_64/这种路径。但vault的目录顶层是完整版本号所以第三行替换命令要把$releasever全部替换成7.9.2009否则会白折腾一遍还得到404。再看备份。不要小看这一步生产环境上一旦sed命令写错把repo文件改得面目全非至少还能从备份里恢复。直接把整个/etc/yum.repos.d/目录复制一份是最稳的不要只备份单个文件因为不确定系统里到底有几个repo文件。最后检查残留配置。很多朋友改完CentOS-Base.repo发现还报mirrorlist.centos.org就是因为系统里还有其他repo文件带着mirrorlist地址。用下面这条命令全局排查grep -rn mirrorlist /etc/yum.repos.d/看到所有包含mirrorlist的行逐个确认是被注释掉的还是活着的。只要还有一条活着的你的yum操作就可能再撞一次这个报错。4.3 验证步骤让yum真正恢复可用源改完后别急着高兴验证一下yum确实恢复可用心里才踏实。先看仓库列表yum repolist正常输出会列出base/7/x86_64、extras/7/x86_64这些仓库并显示仓库包数量。如果列表为空说明仓库配置仍然有问题。然后做一次真实的软件安装验证yum install -y vim能看到软件包下载和安装过程说明yum的解析、下载、依赖处理全链路已经通了。最后再跑一遍yum makecache确认每次刷新仓库都没有报错。到这里这台机器的yum源就算彻底修好了。补充一个小技巧安装完成后用yum history可以查看最近的yum操作记录方便回顾执行过哪些步骤。5. 高频问题与避坑总结5.1 改完源依旧Could not resolve怎么办处理过大量相似问题后把最常遇到的几种情况整理成了排查表可以直接对着检查。现象可能原因处理方法改了源还报Could not resolve host: mirrorlist.centos.org还有其他repo文件没注释mirrorlist全目录grep排查一遍resolv.conf重启后变回原样NetworkManager覆盖配置在ifcfg里配置DNS1/DNS2或使用nmcliyum makecache报404baseurl路径不存在用curl验证URL地址报错certificate verify failed系统时间错误或证书过期校准系统时间检查CA证书报错Cannot retrieve metalink for repository: epelEPEL源也在访问镜像列表单独修复或禁用EPEL仓库其中EPEL的问题很典型。很多人在CentOS 7上装过EPEL扩展源它是独立的一个epel.repo文件同样使用mirrorlist机制。如果只修复了CentOS-Base.repoEPEL源依然会触发类似的Could not resolve host报错。要么把epel.repo里的mirrorlist也注释掉改成可用镜像地址要么临时禁用yum --disablerepoepel install 软件名5.2 那些和仓库源相关的连环坑第一个坑是乱删repo文件。有人看到报错直接把整个/etc/yum.repos.d/目录清空想用绝对干净的配置重来。这么做风险很高先不说丢失原有配置清空后yum会提示找不到任何配置好的软件仓库等于从“一个报错”变成“另一个报错”。第二个坑是下载来源不明的repo文件。网络上有很多所谓“一键修复”脚本或repo文件来源不明内容不可控。尽量从阿里云、清华TUNA等主流镜像站获取不要为了图省事随意执行别人发来的命令。第三个坑是忽略系统版本本身。改源之前先确认系统是CentOS 7的哪个小版本可以用cat /etc/redhat-release查看。如果系统是CentOS 7.6之类更早的版本vault路径用7.9.2009依然可以访问因为vault保留了7.x系列全部历史包只是网上一些教程里只会提7.9容易让新手产生困惑。第四个坑是改完源直接升级内核。CentOS 7已经停止维护yum update可能不会带来新的内核安全更新反而可能拉入一些不再维护的旧包。建议按需安装软件不要没事就yum update。5.3 关于CentOS 7 yum源我最后的建议把这类问题处理多之后我形成了一套相对固定的习惯。遇到Could not resolve host第一件事不是改源而是先看链路用ping和nslookup把本地DNS和网络情况摸清楚。原因很简单如果本地网络有问题改什么源都白搭。网络链路确认OK后再动手改源一般两到三分钟就能让yum恢复。改成什么源取决于场景。开发机和虚拟机实验环境我直接用国内镜像源速度快、省心。生产服务器如果公司有合规要求优先用vault官方源。改的时候一定要备份并把所有repo文件都检查一遍不要只盯着CentOS-Base.repo一个文件。如果你手上有一大批CentOS 7服务器同时需要处理手工一台台改太低了。可以把改源的命令写成一个脚本统一执行跑完抽查几台的yum repolist结果确认一下就行。我给一个最常用的脚本片段参考#!/bin/bash # 一键修复CentOS 7 yum源切换到阿里云镜像 mkdir -p /root/repo-backup cp /etc/yum.repos.d/*.repo /root/repo-backup/ sed -i s|^mirrorlist|#mirrorlist|g /etc/yum.repos.d/CentOS-*.repo sed -i s|^#baseurlhttp://mirror.centos.org/centos/$releasever|baseurlhttps://mirrors.aliyun.com/centos/$releasever|g /etc/yum.repos.d/CentOS-*.repo yum clean all yum makecache写脚本时注意sed表达式里用了单引号包裹避免$releasever被shell提前展开。在实际维护中我已经验证过很多次这个流程在VMware虚拟机、物理服务器和云主机上都能稳定复现。CentOS 7的官方生命周期已经结束mirrorlist.centos.org这个域名大概率会逐渐淡出历史舞台。但只要理解了yum源的工作机制和仓库域名的迁移背景以后再遇到Could not resolve host这类报错就能很快判断出问题在哪一层。最后再提一句如果手上的CentOS 7只用来跑测试环境换成国内镜像源是最省心的选择如果还有长期运行的业务还是建议提前规划迁移到持续维护的Linux发行版或者容器化平台上免得后续安全更新问题越积越多。
返回列表