Skip to content

CentOS 8 yum 安装错误:无法下载 appstream 仓库元数据

在使用 CentOS 8 系统时,你可能会遇到以下错误信息:

Error: Failed to download metadata for repo 'appstream': Cannot prepare internal mirrorlist: No URLs in mirrorlist

这个问题通常出现在尝试使用 yumdnf 安装软件包时,特别是在 Docker 容器或 AWS EC2 实例中。

问题原因

重要说明

CentOS 8 已于 2021 年 12 月 31 日停止维护(EOL),官方镜像仓库已经迁移。原来的镜像链接不再可用,导致 yum 无法找到可用的镜像源。

当你看到这个错误时,意味着系统无法从标准的 CentOS 镜像服务器获取软件包信息,需要调整仓库配置以使用存档镜像或迁移到 CentOS Stream。

解决方案

方法一:修改仓库配置指向存档镜像(推荐快速修复)

这是最常见的解决方法,适用于需要快速恢复软件包安装功能的情况:

bash
# 进入 yum 仓库配置目录
cd /etc/yum.repos.d/

# 注释掉所有 mirrorlist 配置行
sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-*

# 启用 baseurl 并指向存档镜像服务器
sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-*

# 更新系统(可选)
yum update -y

Dockerfile 中的用法

如果你在 Dockerfile 中遇到此问题,可以这样处理:

dockerfile
FROM centos:8

RUN sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-* && \
    sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-*

RUN yum -y install java

CMD /bin/bash

方法二:迁移到 CentOS Stream(官方推荐)

CentOS 官方推荐将 CentOS Linux 8 迁移到 CentOS Stream 8:

bash
# 安装必要的 GPG 密钥(如果尚未安装)
wget 'http://mirror.centos.org/centos/8-stream/BaseOS/x86_64/os/Packages/centos-gpg-keys-8-3.el8.noarch.rpm'
rpm -i 'centos-gpg-keys-8-3.el8.noarch.rpm'

# 迁移到 CentOS Stream
dnf --disablerepo '*' --enablerepo=extras swap centos-linux-repos centos-stream-repos

# 同步系统软件包
dnf distro-sync

CentOS Stream 说明

CentOS Stream 是一个滚动发布的发行版,位于 RHEL 上游。迁移到 CentOS Stream 可以获得持续更新和支持。

方法三:手动编辑仓库文件

如果需要更精细的控制,可以手动编辑仓库配置文件:

  1. 进入配置目录:

    bash
    cd /etc/yum.repos.d/
  2. 编辑相关的 .repo 文件(如 CentOS-Linux-BaseOS.repo):

    bash
    vi CentOS-Linux-BaseOS.repo
  3. 注释掉 mirrorlist 行:

    ini
    #mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=BaseOS
  4. 取消注释并修改 baseurl

    ini
    baseurl=http://vault.centos.org/$contentdir/$releasever/BaseOS/$basearch/os/
  5. 对其他仓库文件重复相同操作。

总结

CentOS 8 停止维护后,原有的镜像源不再可用,导致出现 "No URLs in mirrorlist" 错误。你可以:

  1. 临时解决方案:修改仓库配置指向 vault.centos.org 存档镜像
  2. 长期解决方案:迁移到 CentOS Stream 8 获取持续更新
  3. 手动配置:根据需要精细调整各个仓库配置

注意事项

  • 修改镜像源后,建议运行 yum makecache 刷新缓存
  • 在生产环境中,考虑迁移到仍在维护的发行版,如 CentOS Stream、AlmaLinux 或 Rocky Linux
  • Docker 用户应考虑使用更新的基础镜像,避免依赖已停止维护的系统版本

根据你的具体需求选择最适合的解决方案,确保系统的稳定性和安全性。