Як виправити помилку метаданих репозиторію AppStream у 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.