问题描述
今天在 Docker 中安装了一个 CentOS 镜像,默认的镜像中没有 vim
命令,需要单独安装。在执行下面命令时,便出现了错误:
yum -y install vim
错误内容:
CentOS Linux 8 - AppStream 42 B/s | 38 B 00:00
Error: Failed to download metadata for repo 'appstream': Cannot prepare internal mirrorlist: No URLs in mirrorlist
截图:
原因分析
这个错误通常表示 CentOS 无法从 appstream
仓库获取镜像列表,可能是由于网络连接问题或镜像服务器的问题。
网络问题排除很简单,这里不再赘述。而该问题大概率是因为镜像服务器的问题。
因为 CentOS 已经停止维护,官方公告:《CentOS Project shifts focus to CentOS Stream》。如果想要更新 CentOS,需要将镜像地址由 mirror.centos.org 更改为 vault.centos.org。
通过下面命令,可以看到 CentOS 的镜像地址:
cd /etc/yum.repos.d/
:切换到 /etc/yum.repos.d/ 目录;ls -l
:列出当前目录中的文件;cat CentOS-Linux-AppStream.repo
:显示 CentOS-Linux-AppStream.repo 文件中的内容。
通过上面截图可以看到appstream
的地址,下面的解决方案将介绍如何将该目录中的文件批量修改地址,并详细介绍执行的每个命令。
解决方案
下面三行命令的作用是修改 CentOS 的 YUM 仓库配置文件,将镜像源从默认的
mirror.centos.org
改为vault.centos.org
。
-
切换到
/etc/yum.repos.d/
目录:cd /etc/yum.repos.d/
这行命令将当前工作目录切换到
/etc/yum.repos.d/
目录,该目录包含所有的 YUM 仓库配置文件。 -
注释掉
mirrorlist
配置项:sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-*
这行命令使用
sed
命令在/etc/yum.repos.d/
目录下的所有以CentOS-
开头的文件中,将所有以mirrorlist
开头的行注释掉(在行的开头加上#
)。具体来说,sed -i 's/mirrorlist/#mirrorlist/g'
的意思是:sed
:流编辑器,用于文本处理。-i
:直接编辑文件,而不是输出到标准输出。's/mirrorlist/#mirrorlist/g'
:使用正则表达式将mirrorlist
替换为#mirrorlist
,并在全局范围内(即整行)进行替换。
-
启用
baseurl
并将其指向vault.centos.org
:sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-*
这行命令使用
sed
命令在/etc/yum.repos.d/
目录下的所有以CentOS-
开头的文件中,将被注释掉的baseurl
配置项启用,并将其 URL 从mirror.centos.org
改为vault.centos.org
。具体来说,sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g'
的意思是:sed
:流编辑器,用于文本处理。-i
:直接编辑文件,而不是输出到标准输出。's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g'
:使用正则表达式将#baseurl=http://mirror.centos.org
替换为baseurl=http://vault.centos.org
,并在全局范围内(即整行)进行替换。这里使用|
作为分隔符,而不是传统的/
,是因为 URL 中包含斜杠/
,使用|
可以避免冲突。
最后,更新并安装 vim
即可:
yum update -y
yum -y install vim