问题背景
想私有化部署 sentry,但是在使用 yum 时报错,yum list 或 yum 安装任何东西都报错。主要报错信息如下:
CentOS-8 - Base - mirrors.aliyun.com 299 B/s | 2.3 kB 00:07 Errors during downloading metadata for repository 'base': - Status code: 404 for https://mirrors.aliyun.com/centos/8/BaseOS/x86_64/os/repodata/repomd.xml (IP: 39.96.118.194) - Curl error (7): Couldn't connect to server for http://mirrors.aliyuncs.com/centos/8/BaseOS/x86_64/os/repodata/repomd.xml [Failed to connect to mirrors.aliyuncs.com port 80: Connection timed out] - Status code: 404 for http://mirrors.cloud.aliyuncs.com/centos/8/BaseOS/x86_64/os/repodata/repomd.xml (IP: 100.100.2.148) Error: Failed to download metadata for repo 'base': Cannot download repomd.xml: Cannot download repodata/repomd.xml: All mirrors were tried
关键信息:Cannot download repodata/repomd.xml: All mirrors were tried。意思是说:无法下载 repodata/repomd.xml,已尝试所有镜像
解决方案
这里其实给大家一个建议,也算是自己的一个心得吧:很多时候我们看到报错,都会习惯性的复制报错信息,然后百度或者谷歌搜索看别人是如何解决的。但是很多时候,问题并不一致,或者说,报错的关键信息复制的不对的话,也很容易就走到岔路上去。很多时候,我建议是好好阅读一下报错信息,了解主要是因为什么报错,然后再去对症下药,有针对性的搜索和过滤更适合的解决方案。
所以呢,其实我最开始没有认真阅读报错信息,想当然的复制了第一行报错:Errors during downloading metadata for repository ‘base’,然后去搜索,最后走了很多弯路,试了网上别人的很多种解决方案,都不生效。最后,静下心来,好好阅读了一下报错全部信息,找到了关键报错:Cannot download repodata/repomd.xml,才发现了问题所在。
所以这里就主要说一下最终解决,其实主要还是官方的问题,详见阿里云官方文档:点击这里
1、原因分析
centos8 项目官方已于 2021 年底停止,相关源已无法使用,所以网上 22 年前的换源教程都已无法使用。
2、如何解决
(1)进入配置文件内,删除所有的.repo 文件(最好是先先备份):
# 进入配置文件夹 cd /etc/yum.repos.d/ # 删除旧的配置文件 rm *.repo # 输入“y”回车确认
(2)ls 查看下,确保该目录下的.repo 文件已完全删除
注意:必须全部删除,或全部移除备份到别处,否则就算你切换了 yum 源,也还是会报上面的错(因为我就踩了这个坑的)
(3)下载可以用的.repo 文件
wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-vault-8.5.2111.repo
如果你没有安装 wget,也可以用下面命令:
curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-vault-8.5.2111.repo
(4)清除缓存,然后再运行 yum makecache 生成缓存
yum clean all yum makecache
3、如果你是非阿里云 ECS 用户,可能回会出现 Couldn’t resolve host ‘mirrors.cloud.aliyuncs.com’ 的信息,不过不影响使用。你可以修改相关的配置:
sed -i -e '/mirrors.cloud.aliyuncs.com/d' -e '/mirrors.aliyuncs.com/d' /etc/yum.repos.d/CentOS-Base.repo
Linux 的 sed 命令设置配置文件相关信息,建议了解一下常规使用方式,还是挺好用的
具体原因分析
主要原因就是:镜像库丢了。正常的是有这个 repomd.xml 文件的,比如这个 /centos/8-stream/
PS:可以到《阿里云开源镜像目录》查看各版本情况。
比如我们可以去看 CentOS8 的情况,就会看到这样的一行提示:This directory (and version of CentOS) is deprecated. 官方都不推荐了,我们肯定就不能用啦。
扩展
其实我们了解到主要原因就是因为 centos8 的镜像库 repomd.xml 文件丢了,但是比如 centos8-stream 是有的,也就是说我们可以把 yum 源的 repo.xml 里代表 8 的这个 releasever 全部改成 releasever-stream,这样也是可以解决问题的。
如何操作呢?修改 CentOS-Base.repo 文件内容如下:替换 “releasever/” 为 “releasever-stream/”
[root@mo12-0003 ~]# sed -i 's/releasever//releasever-stream//g' /etc/yum.repos.d/CentOS-Base.repo
然后重置缓存即可:
[root@mo12-0003 ~]# yum clean all [root@mo12-0003 ~]# yum makecache
作者:古兰精