Ошибка загрузки метаданных репозитория 'AppStream' [CentOS] на CentOS 8
Введение
Когда вы запускаете обновление или пытаетесь установить пакет на CentOS 8, менеджер пакетов может остановиться с такой ошибкой:
Failed to load metadata for 'AppStream' repo: Cannot prepare internal mirror list: No URLs in mirror list.
Это не сетевой сбой и не временная проблема с зеркалом. Это ожидаемое следствие того, что CentOS 8 достигла конца жизненного цикла. В этой статье объясняется, почему возникает ошибка, какое решение является правильным в долгосрочной перспективе и как временно вернуть систему в рабочее состояние, если доступ к ней всё ещё нужен.

Почему возникает эта ошибка
CentOS Linux 8 достигла конца жизненного цикла 31 декабря 2021 года. После этой даты служба списка зеркал для CentOS Linux 8 была отключена, а пакеты перенесены на архивный сервер vault.centos.org.
Файлы репозиториев в системе по-прежнему ссылаются на mirrorlist.centos.org. Поскольку эта служба больше не возвращает никаких URL, список зеркал приходит пустым, и менеджеру пакетов неоткуда загружать метаданные. Именно это сообщение вы и видите..
Пакеты не были удалены. Они перенесены на архивный сервер vault.centos.org. Именно это делает возможным временное решение, описанное ниже.
Рекомендуемое решение: миграция на AlmaLinux или Rocky Linux
Поскольку CentOS 8 больше не получает никаких обновлений, включая обновления безопасности, держать её в продакшене рискованно. Правильное решение это переход на дистрибутив, бинарно совместимый с той системой, которую вы уже используете.
AlmaLinux и Rocky Linux это бесплатные, поддерживаемые сообществом сборки на основе Red Hat Enterprise Linux. Они разработаны как прямая замена CentOS, поэтому существующее ПО и конфигурация в большинстве случаев продолжают работать без изменений. Оба проекта предоставляют скрипт миграции на месте, который преобразует CentOS 8 без переустановки сервера.
Всегда делайте полную резервную копию или снапшот перед миграцией. Преобразование на месте меняет ключевые системные пакеты, и вам нужен путь назад на случай, если что-то пойдёт не так
Оба скрипта миграции требуют рабочего менеджера пакетов для загрузки новых пакетов. На системе CentOS 8, достигшей конца жизненного цикла, репозитории мертвы, поэтому сначала примените временное решение из следующего раздела, а затем запускайте миграцию.
Для миграции на AlmaLinux 8:
curl -O https://raw.githubusercontent.com/AlmaLinux/almalinux-deploy/master/almalinux-deploy.sh bash almalinux-deploy.sh

Для миграции на Rocky Linux 8:
curl -O https://raw.githubusercontent.com/rocky-linux/rocky-tools/main/migrate2rocky/migrate2rocky.sh bash migrate2rocky.sh -r

После завершения скрипта перезагрузите сервер и подтвердите новую систему командами:
cat /etc/os-release dnf repolist


Если сервер нельзя мигрировать на месте, или вы предпочитаете начать с чистого листа, разверните новый VPS с уже установленным AlmaLinux или Rocky Linux и перенесите данные. INTROSERV предлагает Linux VPS с этими дистрибутивами, доступными при заказе.
Временное решение: перенаправление репозиториев на архив
Используйте это только тогда, когда систему нужно ненадолго вернуть в рабочее состояние, например чтобы сделать финальную резервную копию перед миграцией или чтобы поддержать некритичную машину до завершения миграции. Это не делает CentOS 8 снова поддерживаемой и не возвращает обновления.
Перед запуском команд ниже проверьте точную версию вашей установки командой cat /etc/centos-release. В этой статье в качестве примера используется 8.5.2111. Замените её на версию, которую сообщает ваша система. Если указать неверный архивный релиз, DNF может возвращать ошибки 404, потому что такого каталога для вашей установки не существует.

Команды ниже отключают мёртвый список зеркал и перенаправляют файлы репозиториев на архивный сервер vault.centos.org:
cd /etc/yum.repos.d/ sed -i 's/^mirrorlist/#mirrorlist/g' CentOS-* sed -i 's|^#baseurl=.*mirror.centos.org|baseurl=https://vault.centos.org|g' CentOS-* sed -i 's|/$contentdir/$releasever/|/8.5.2111/|g' CentOS-*
В отличие от рабочих репозиториев, архив организован по фиксированным каталогам релизов, например 8.5.2111. Из-за этого путь по умолчанию $releasever больше не указывает на действительное содержимое и должен быть заменён точным архивным релизом. Это касается всех трёх файлов репозиториев по умолчанию, AppStream, BaseOS и Extras, а не только AppStream..
После выполнения команд выше проверьте каждый файл репозитория по отдельности, а не доверяйтесь пакетной правке вслепую, поскольку массовый sed по трём файлам это лёгкое место, где незаметно может проскользнуть лишний символ или неверный разделитель.
Проверьте файл AppStream:
cat CentOS-Linux-AppStream.repo
Строка baseurl должна выглядеть точно так, с каталогом релиза, соответствующим вашей версии:
baseurl=https://vault.centos.org/8.5.2111/AppStream/x86_64/os/

Проверьте файл BaseOS тем же способом:
cat CentOS-Linux-BaseOS.repo
И файл Extras:
cat CentOS-Linux-Extras.repo
Когда все три файла подтверждены, очистите кеш и пересоберите его:
dnf clean all dnf makecache dnf repolist

Если репозиторий исправлен правильно, он теперь загружает свои метаданные без ошибок. Если в каком-то файле осталась опечатка, dnf сообщит, какой именно репозиторий не удалось загрузить, и это позволит легко вернуться и проверить только этот файл.
Архив содержит последние пакеты, выпущенные до конца жизненного цикла. Вы не получите более новых версий или патчей безопасности. Рассматривайте это как способ сохранить доступ к системе до миграции, а не как постоянное состояние.
Чтобы убедиться, что пакеты устанавливаются корректно, а не только что загружаются метаданные, проверьте на любом небольшом пакете:
dnf install -y wget


После успешного выполнения запустите само обновление:
dnf update -y
Заключение
Ошибка метаданных AppStream на CentOS 8 это признак того, что дистрибутив достиг конца жизненного цикла. Единственное долгосрочное решение это миграция на поддерживаемый, бинарно совместимый дистрибутив, такой как AlmaLinux или Rocky Linux, желательно после полной резервной копии. Обходной путь через vault.centos.org всё ещё полезен, но только как короткий мост, который позволяет серверу проработать достаточно долго, чтобы безопасно уйти с CentOS 8.