CentOS 6.8 yum源失效修复:从报错到恢复安装的完整指南
凡是给老机器装过软件的人十有八九都见过这个场景系统是CentOS 6.8执行yum install某个包等半天之后屏幕上甩出一串Error什么Could not retrieve mirrorlist、Peer certificate cannot be negotiated或者干脆就是404 Not Found。一开始以为是网络问题换源、清缓存、重试结果依然失败。这套操作在CentOS 7/8上几乎不会遇到偏偏在6.8上频繁出现原因只有一个——这套系统的生命周期早就结束官方不再维护镜像源原来指向的下载地址已经被移除。这篇文章就把这个问题的来龙去脉、解决思路和实操步骤完整展开手把手让你把yum救活。1. 问题根因CentOS 6.8的镜像源到底怎么了1.1 一个“退休”系统带来的连锁反应CentOS 6于2020年11月30日正式停止维护官方不再提供任何安全更新和软件包更新。这个消息在当年只是一条公告但对于还在跑6.8的老机器来说影响是实打实的/etc/yum.repos.d/里的repo文件默认指向的是mirror.centos.org这个域名在EOL之后逐渐停止服务CentOS 6的软件包被整体迁移到了vault.centos.org这个“归档仓库”里。你可以把这件事类比成超市搬迁原来的货架mirrorlist拆掉了所有商品被挪到了郊区仓库vault但老顾客手里拿的还是旧地址的购物清单到了原址自然只能看见一扇锁上的门。yum就是在执行这个“按清单找货架”的动作地址无效后面的流程全断。1.2 三种典型报错与底层机理实际操作中yum install失败通常表现为以下三种形态搞清楚它们分别对应哪个环节出了问题排查时能少走很多弯路。第一种是Could not retrieve mirrorlist。yum在安装软件前要先读取repo文件里的mirrorlist或baseurl如果这个地址无法访问或者访问后返回的是一个空列表yum就会认为没有可用软件源。CentOS 6默认的repo文件里写的是mirrorlisthttp://mirrorlist.centos.org/?release6arch$basearchrepoos这个接口现在基本已经废弃访问不到列表于是直接报这个错。第二种是404 Not Found。这种情况常见于你把repo地址改成了某个镜像站但路径写错了或者镜像站根本没有对应版本和架构的目录。yum的机制是逐个尝试baseurl里的每一个镜像地址全部失败后才报错所以一个源写错往往要等很长时间才开始报错很折磨人。第三种是Peer certificate cannot be negotiated或SSL certificate problem。这属于HTTPS握手阶段的证书校验失败。CentOS 6内置的ca-certificates太老不认现在新签发的CA证书镜像站若走HTTPS老系统在证书交换阶段就会被卡住。这三种报错可能是叠加出现的但无论哪一种核心解法都是一样的让yum指向一个当前仍然有效、且和CentOS 6.8匹配的旧版本镜像源。2. 排查先行动手改源之前必须确认的三件事2.1 先认准系统小版本和CPU架构改源前先把系统身份认清楚。有很多人上来就写repo结果镜像源路径里写的版本号跟实际系统对不上越改越乱。用下面两条命令确认cat /etc/centos-release uname -m第一行告诉你系统是CentOS 6.8还是6.9、6.10。第二行告诉你架构是x86_64还是i386。这两个参数直接影响镜像目录的路径比如6.8/os/x86_64/和6.8/os/i386/是两个完全不同的目录写错一个字符404立刻找上门。另外要特别注意的是6.8和6.10虽然都属于CentOS 6但软件包并不是完全通用的。yum只会从你指定的版本目录里找包如果你把6.8机器的源指到了6.10能装上一些包但依赖解析时容易出幺蛾子。稳妥做法是系统是几就写几不要图省事统一用6.10。2.2 验证网络连通性和DNS解析先把“源的问题”和“网络的问题”区分开。如果机器本身连外网都不通那改什么源都白搭。验证步骤很简单ping -c 3 114.114.114.114 ping -c 3 mirrors.aliyun.com第一步验证IP层通不通第二步验证DNS解析和基础外网连通性。如果第一个ping通、第二个ping不通基本就是DNS配置的问题检查/etc/resolv.conf里的nameserver是否可用。如果两个都不通检查网卡配置、网关、防火墙这些属于纯网络问题不在这篇文章的范围里。提示老机器如果长时间没重启网卡驱动偶尔会有异常ifconfig能看到网卡但ping不通优先重启网络服务试试service network restart。2.3 备份原始repo配置给自己留退路改repo文件之前一定先把原始配置备份。这不只是留个心理安慰而是真的会用到有些软件安装时要求某些特定的repo设置你改乱了还能对照回去。cp -rp /etc/yum.repos.d /etc/yum.repos.d.bak.$(date %F)$(date %F)会自动拼上当天日期备份目录不会覆盖历史版本。之后不管怎么改都能随时翻看原始内容。我见过有人嫌麻烦直接rm -rf /etc/yum.repos.d/重建的结果新写的repo文件格式有问题yum直接瘫痪只能靠备份恢复。另外/etc/yum.repos.d/下通常不止一个repo文件有CentOS-Base.repo、CentOS-Debuginfo.repo、CentOS-Media.repo等。除了CentOS-Base.repo其他文件要么把enabled0要么直接挪到备份目录避免yum在makecache时去访问一些根本用不到的源拖慢速度甚至报错干扰判断。3. 核心操作手写可用的CentOS 6.8 repo文件3.1 镜像源怎么选vault仓库与国内镜像站CentOS官方把EOL后的所有版本都放进了vault仓库地址是vault.centos.org路径规则很清晰/版本号/os/架构/。比如CentOS 6.8的base仓库就是http://vault.centos.org/6.8/os/x86_64/。这是最稳妥、最权威的来源缺点是服务器在境外国内访问速度不太稳定。国内镜像站也大多提供了centos-vault目录把官方归档同步了一份路径大同小异。比如阿里云镜像的路径是http://mirrors.aliyun.com/centos-vault/6.8/os/x86_64/清华源是https://mirrors.tuna.tsinghua.edu.cn/centos-vault/6.8/os/x86_64/。这些镜像站跟官方vault内容一致但国内访问速度快得多而且基本都支持http能绕开老系统的证书问题。选源的优先级我个人的习惯是内网有自建镜像就优先用内网否则用国内镜像站的http地址再不行才用官方vault。原因后面细说反正都是同一个东西选最快、最顺手的就行。3.2 一份可以直接复制的repo配置把/etc/yum.repos.d/CentOS-Base.repo打开清空后写入下面的内容。注意$releasever这个变量在CentOS 6上有坑——它解析出来是6而vault和镜像站的路径需要精确到6.8所以这里必须写死版本号不能偷懒用变量。[base] nameCentOS-6.8 - Base baseurlhttp://vault.centos.org/6.8/os/$basearch/ http://mirrors.aliyun.com/centos-vault/6.8/os/$basearch/ gpgcheck1 gpgkeyhttp://vault.centos.org/6.8/os/$basearch/RPM-GPG-KEY-CentOS-6 enabled1 [updates] nameCentOS-6.8 - Updates baseurlhttp://vault.centos.org/6.8/updates/$basearch/ http://mirrors.aliyun.com/centos-vault/6.8/updates/$basearch/ gpgcheck1 gpgkeyhttp://vault.centos.org/6.8/os/$basearch/RPM-GPG-KEY-CentOS-6 enabled1 [extras] nameCentOS-6.8 - Extras baseurlhttp://vault.centos.org/6.8/extras/$basearch/ http://mirrors.aliyun.com/centos-vault/6.8/extras/$basearch/ gpgcheck1 gpgkeyhttp://vault.centos.org/6.8/os/$basearch/RPM-GPG-KEY-CentOS-6 enabled1有几个细节值得说明。$basearch变量会自动解析成x86_64或i386不需要写死这跟$releasever的情况不一样。gpgkey我统一写了os目录下的key文件因为经实际验证os目录里一定会有RPM-GPG-KEY-CentOS-6updates和extras目录里不一定齐全。gpgcheck1建议保留这是软件包完整性校验能有效防止下载到损坏或被篡改的文件不要因为急于解决报错就随手改成gpgcheck0。baseurl里写了官方vault和阿里云两个地址yum会按顺序尝试第一个不通就自动切换第二个。如果你更信任其他镜像站把第二行替换成清华、中科大等路径即可格式保持一致。3.3 配置后的固定三连clean、makecache、repolist写完repo文件后执行下面的命令这套流程是验证源是否可用的标准动作yum clean all yum makecache yum repolistyum clean all是把之前缓存的metadata清掉。旧的缓存里记录的是失效源的列表信息不清掉的话就算repo文件改好了yum还是会用旧缓存报错。yum makecache开始重新从新源下载软件包列表这一步可以看到每个repo的下载是否成功。yum repolist则列出当前所有启用源并统计各自有多少个软件包。正常的话repolist输出里能看到base、updates、extras三个仓库各自有几千个包。如果某个仓库的数量是0说明对应的baseurl路径可能不对或者镜像站目录里没同步完整回去检查路径或换一个镜像站重试。4. 实操记录从整夜报错到恢复正常安装4.1 第一次尝试镜像路径没找对404迎面而来我处理过的一台CentOS 6.8服务器最初是网上的教程让改http://mirrors.aliyun.com/centos/6.8/os/x86_64/。这个地址从浏览器访问是通的但yum始终报404。后来发现mirrors.aliyun.com/centos/目录下只保留了CentOS 7和8的长期支持版本CentOS 6的内容被挪到了centos-vault/子目录。也就是说地址要写成http://mirrors.aliyun.com/centos-vault/6.8/os/x86_64/才对。这类问题特别典型——镜像站为了节省空间会把EOL版本统一归档到独立目录不能拿CentOS 7的路径习惯去套6.8。遇到404时别急着反复改路径先用浏览器或者curl打开确认一下目录结构curl -I http://mirrors.aliyun.com/centos-vault/6.8/os/x86_64/返回200 OK说明路径正确返回404就继续往上逐层找比如先访问http://mirrors.aliyun.com/centos-vault/6.8/再一层层进入os/x86_64/。这个排查方式虽然笨但非常直接能准确定位是路径问题还是目录不存在的问题。4.2 第二次尝试老系统与HTTPS证书的“信任危机”路径修正后makecache能跑了但又冒出新的报错Peer certificate cannot be negotiated with server。这个错误开头提过是HTTPS证书握手失败。CentOS 6的ca-certificates包停留在老版本很多新签发的证书链它不认识尤其是国内镜像站为了安全基本都上了HTTPS老系统就卡死在证书校验上。处理办法有三种按优先级排第一种把repo里的baseurl改成该镜像站的http地址。像阿里云、清华这些镜像站一般同时提供http和https入口http下不需要做证书校验最简单的就把https://换成http://。上面的配置示例里我直接写的就是http就是为了绕开这个坑。第二种临时更新系统的ca-certificates。有点鸡生蛋的意味——更新它本身也需要先有源能用但可以用http源先把包拉下来yum install -y ca-certificates装完后再把repo切回https证书校验就有可能会通过。如果yum install ca-certificates这一步本身也因为证书问题失败那就先用http源解决。第三种在repo配置里临时加sslverify0跳过证书校验。这属于兜底方案不建议长期开启因为等于放弃了HTTPS的加密和身份认证。真到万不得已用一下可以装完包之后记得把这一行去掉。注意老系统上还容易出现另一个隐蔽问题——系统时间不准。HTTPS握手时证书有有效期如果服务器时间差了好几年证书会被判定为“未生效”或“已过期”。排查证书问题时顺手执行一下date看看时间如果不对用ntpdate同步ntpdate pool.ntp.org。4.3 修复完成演示一次完整的yum install当yum repolist稳定显示三个仓库都有包数量后就可以正式装了。以一个最常用的传输工具为例yum install -y lrzsz整个过程会显示从base仓库下载lrzsz的rpm包随后自动完成依赖解析和安装。看到Complete!就说明整个链路彻底通了。如果安装过程中弹出GPG key retrieval failed说明gpgkey地址访问不了。检查一下gpgkey里写的路径是不是和baseurl的域名一致不一致就改一致或者手动导入keyrpm --import http://vault.centos.org/6.8/os/x86_64/RPM-GPG-KEY-CentOS-6导入后再yum install就不会再问key的事了。5. 高频问题排查速查表与避坑心得5.1 典型故障一览表下面这张表是我反复遇到、也看别人反复踩的问题汇总可以直接当速查手册用。报错或现象可能原因快速解决方式Could not retrieve mirrorlistrepo里还是旧的mirrorlist地址或该地址已失效改用baseurl指向vault或镜像站centos-vault目录404 Not Foundbaseurl路径写错或镜像站没有对应版本目录用curl逐层检查目录结构确认版本号和架构正确Peer certificate cannot be negotiated老系统ca-certificates太旧不认新证书换http地址或先装ca-certificates临时可加sslverify0GPG key retrieval failedgpgkey地址不对或网络不通修正gpgkey路径或手动rpm --import导入keyrepolist数量为0仓库路径不对或该镜像站未同步完整换一个镜像站或核对目录层级makecache超时境外源访问慢或baseurl里第一个地址不通多写几个镜像地址把国内源放在第一位尝试5.2 几条只有踩过坑才记得住的建议第一$releasever在CentOS 6上会解析为6但镜像站需要6.8这类完整小版本号必须写死。这是所有新手的第一个坑也是所有教程里最容易被忽略的一句。第二仓库不是越多越好。CentOS 6默认会启用base、updates、extras这几个就够日常用了。debuginfo、contrib、centosplus这些仓库在6.8上基本用不到要么enabled0要么直接删掉减少makecache时间和干扰源。有些教程会让把CentOS-Vault.repo也启用如果你不需要装旧版软件包来“降级”这个源就不要打开否则两个源同时提供同名包yum的依赖解析逻辑会变得很难预料。第三备份目录一定留在原分区别随手放在/tmp。服务器跑久了/tmp可能被清理或者空间不足备份放在/etc/yum.repos.d.bak.日期这种位置虽然名字丑但绝对不会丢。第四如果公司内网有自建yum镜像优先用内网地址。原因很简单内网速度快、不占用出口带宽、也不受外网DNS波动影响。改repo时把内网地址写在baseurl第一行外网镜像写在后面作为备用这样就算内网临时出问题yum也能自动降级到外网源。第五如果机器完全离线没有外网也没有内网镜像最可行的方案是用CentOS 6.8的ISO镜像做本地源。把ISO文件挂载到系统里写好以file://开头的baseurl指向挂载目录下的Packages目录这种“光盘源”也能让yum正常工作。虽然ISO里的包版本旧但应付基础的软件安装绰绰有余。最后再说一个个人体会。我在给好几台6.8老机器换源的过程中最大的感受是改源这个操作本身不难难的是判断这台机器到底值不值得继续折腾。CentOS 6已经停止了所有安全更新即便源修好了、软件能装了系统本身的安全漏洞也不会有人补。如果你只是在内网环境跑一个生命周期快结束的小服务换源续命完全没问题但如果是暴露在公网的机器我更建议趁早规划迁移方案而不是把精力花在给一个“退休系统”维护仓库地址上。说到底yum源是工具能用、够用、清楚它为什么能用就够了。