Все об Arch Linux

Arch Linux будет тем, что вы из него сделаете!

Arch Linux Archive: откат пакетов на историческую версию

Сразу к делу: Arch Linux Archive (ALA) — это официальный архив всех когда-либо опубликованных версий пакетов Arch Linux, он живёт на archive.archlinux.org. Если свежее обновление сломало систему, откат делается в три шага: находишь рабочую версию пакета в каталоге packages/, скачиваешь её командой pacman -U и ставишь поверх текущей. ALA — источник старых версий, а не способ установки: сам процесс разобран в статье «Установка конкретной версии пакета из кеша».

Что такое Arch Linux Archive и зачем он нужен?

ALA — это снимок всего, что когда-либо публиковалось в официальных репозиториях Arch. Каждый пакет, каждая версия, каждая сборка попадает в архив в момент публикации и остаётся там. Зачем это нужно? Rolling release живёт по принципу «всегда свежее», но свежее не всегда значит лучше. Новая версия ядра, glibc или драйвера может принести регрессию, и тогда единственный быстрый способ вернуть рабочую систему — поставить предыдущую версию пакета.

Когда это нужно? Три типичных сценария. Первый: обновил систему, и что-то перестало работать — откатываешь подозрительный пакет. Второй: новая версия принесла регрессию, о которой уже пишут на форумах, а фикс ещё не вышел. Третий: нужно сравнить поведение старой и новой версии, чтобы понять, кто виноват — пакет или твоя конфигурация.

Архив решает именно эту задачу: он хранит историю, по которой можно откатиться. Официальные зеркала такой истории не дают — там только текущее состояние репозиториев.

Как устроен archive.archlinux.org?

Архив состоит из двух больших деревьев: packages/ и repos/.

Дерево packages/ — это каталог по именам пакетов. Путь строится так: первая буква имени, затем имя, затем файл пакета. Например, для glibc:

https://archive.archlinux.org/packages/g/glibc/glibc-2.40-3-x86_64.pkg.tar.zst

Первая буква в пути — это первая буква имени пакета. Так каталоги не разрастаются до нечитаемых размеров: все пакеты на «g» лежат в одной папке, на «l» — в другой. Имя файла всегда заканчивается на .pkg.tar.zst — это формат, который pacman понимает напрямую.

Дерево repos/ — это полный снимок репозитория на конкретный момент времени. Путь выглядит так:

https://archive.archlinux.org/repos/2024/08/01/core/os/x86_64/

Здесь 2024/08/01 — дата снимка. Внутри — полный набор пакетов core на тот день. Снимки снимаются регулярно, обычно раз в день. Если нужно состояние «как было первого августа» — берёшь каталог 2024/08/01 и ставишь пакеты из него. Это удобно, когда откатить нужно сразу много пакетов до одной даты.

В дереве repos/ есть не только core, но и extra, multilib и testing. Снимок каждого репозитория снимается отдельно, поэтому даты в путях могут отличаться. Для отката обычно хватает core и extra — именно там живут системные библиотеки и большинство программ.

Как найти старую версию пакета?

Самый простой способ — открыть каталог пакета в браузере или через curl:

curl https://archive.archlinux.org/packages/g/glibc/

Вывод — это HTML-листинг со всеми версиями glibc. Имена отсортированы, так что легко увидеть, какие версии доступны и за какой период. Листинг можно отфильтровать прямо в терминале, чтобы не листать сотни строк:

curl -s https://archive.archlinux.org/packages/g/glibc/ | grep glibc-2.40

Так ты увидишь только нужные версии. Обрати внимание: в листинге есть и каталоги, и файлы. Файлы пакетов — это .pkg.tar.zst, остальное можно игнорировать.

Если нужной версии в листинге нет — проверь соседние даты в repos/. Иногда пакет публиковался несколько раз за день, и в архиве лежат обе сборки. Сравни даты файлов и бери ту, что ближе к моменту, когда система работала.

Если нужен снимок репозитория целиком — смотри дерево repos/ по дате. Дата в пути — это дата публикации снимка, а не дата сборки пакетов.

Как откатить пакет через pacman -U?

Когда версия найдена, установка тривиальна:

sudo pacman -U https://archive.archlinux.org/packages/g/glibc/glibc-2.40-3-x86_64.pkg.tar.zst

pacman скачает файл, проверит подпись и поставит его поверх текущей версии. Проверка подписи работает автоматически: пакеты в архиве подписаны теми же ключами, что и в обычных репозиториях, поэтому подмену или повреждение файла pacman отклонит.

Команда pacman -U умеет работать и с локальными файлами, и с URL. Разница только в источнике: локальный файл pacman не скачивает, а URL — скачивает и кладёт в кеш. Флаги те же, что у обычной установки: –noconfirm пропустит вопросы, –needed не тронет уже установленные версии.

Скачанный из архива файл pacman кладёт в /var/cache/pacman/pkg, как и при обычном обновлении. Так что после отката у тебя в кеше появится копия старой версии — на случай, если понадобится вернуть её снова.

Важно: pacman -U не трогает зависимости. Если старая версия требует другие версии библиотек, pacman предупредит о конфликте и откажется ставить пакет. Это защита, а не баг. Полный разбор команд pacman — в статье «pacman от А до Я: команды».

Что делать, если пакет тянет за собой старые зависимости?

Типичный случай — откат приложения, собранного против старой glibc. Ставить его поверх новой glibc нельзя: бинарник может просто не запуститься. Тогда откатываешь и зависимости, причём из снимка той же даты.

Порядок такой:

  1. Найди в packages/ версию пакета, которая работала.
  2. Посмотри, от каких библиотек она зависит.
  3. Скачай из архива те же версии этих библиотек — желательно из снимка той же даты.
  4. Установи всё одной командой:
sudo pacman -U https://archive.archlinux.org/packages/g/glibc/glibc-2.40-3-x86_64.pkg.tar.zst \
             https://archive.archlinux.org/packages/l/libxcrypt/libxcrypt-4.4.36-2-x86_64.pkg.tar.zst

Точный список зависимостей конкретной версии смотри в файле .PKGINFO внутри пакета:

tar -xOf glibc-2.40-3-x86_64.pkg.tar.zst .PKGINFO | grep depend

Команда pacman -Si показывает зависимости только актуальной версии, а .PKGINFO — именно той, которую ты собираешься ставить.

Перед откатом проверь, что ещё зависит от пакета, который ты собираешься понизить. Команда pacman -Qi покажет установленные пакеты, которым он нужен. Если таких много — откат заденет всю систему, и это уже не разовая починка, а полноценный частичный откат.

Такой откат называют частичным: часть пакетов остаётся новой, часть возвращается к старым версиям. Это нормально для разовой починки, но держать систему в таком состоянии постоянно не стоит — pacman при следующем обновлении всё равно предложит вернуть всё к актуальным версиям.

Отдельный случай — ядро. Версии ядра, заголовков и модулей должны совпадать между собой. Нельзя взять ядро из одного снимка, а заголовки из другого. Подробнее о выборе ядра — в статье «Какое ядро выбрать: linux, lts, zen, hardened».

Почему нельзя полагаться на архив как на вечную гарантию?

ALA хранит версии пакетов с 2010 года, но это не строгая гарантия. Политика хранения менялась, часть старых версий могла быть удалена. Если нужной версии в архиве нет — откатиться через ALA не получится.

Поэтому порядок действий при откате такой: сначала проверь, что нужная версия вообще существует в архиве, и только потом удаляй локальный кеш. Кеш pacman — первый и самый быстрый источник старых версий, архив — запасной. Очистка кеша разобрана в статье «Чистка кеша пакетов paccache».

Ещё один нюанс: архив не работает как зеркало в обычном смысле. Он не участвует в обновлениях, с него нельзя настроить mirrorlist. Это хранилище истории, а не рабочий репозиторий.

Как автоматизировать откат?

Вручную искать версии в архиве утомительно, особенно когда пакетов несколько. Для этого есть утилита downgrade из AUR. Она умеет:

  • показывать список доступных версий пакета из кеша и из ALA;
  • ставить выбранную версию через pacman -U;
  • запоминать выбор, чтобы pacman не перезаписал её при следующем обновлении.

Установка стандартная для AUR:

yay -S downgrade

После установки запускаешь downgrade с именем пакета и выбираешь версию из списка. Утилита сама скачает файл из архива и поставит его, а в конце предложит добавить пакет в IgnorePkg — тогда следующее обновление не вернёт всё назад.

Частые вопросы

Откат через ALA безопасен?

Да, если версия пакета подписана корректно. pacman -U проверяет подпись автоматически и откажет установку повреждённого или неподписанного файла. Риск не в самом откате, а в несовместимости старых версий с новыми зависимостями — поэтому откатывай зависимости вместе с пакетом.

Чем ALA отличается от обычного зеркала?

Зеркало хранит только текущее состояние репозиториев. ALA хранит все когда-либо опубликованные версии. Обновляться с ALA нельзя, откатываться — можно.

Что делать, если нужной версии нет в архиве?

Проверь кеш pacman (/var/cache/pacman/pkg) — там могут лежать старые версии. Если и там пусто, остаётся собрать пакет из старого PKGBUILD или жить с текущей версией. Зеркала в этой ситуации не помогут: там только актуальные версии.

Можно ли откатить ядро через ALA?

Можно, но вместе с ядром откатывай linux-headers и модули той же версии. Смешивать версии ядра и заголовков нельзя — сборка модулей сломается.

Полезные ресурсы

Заключение

Arch Linux Archive — это официальная история всех версий пакетов Arch. Когда свежее обновление ломает систему, откат через ALA занимает пару минут: нашёл версию в packages/, поставил через pacman -U, при необходимости откатил зависимости из снимка той же даты. Помни про два ограничения: архив не гарантирует вечное хранение каждой версии, а ядро, заголовки и модули откатываются только вместе. Кеш pacman держи до тех пор, пока не убедишься, что нужная версия есть в архиве.



Не получилось? Поможем настроить

Задай вопрос в чате — отвечаем быстро, по делу и без воды.

Читайте также

Комментарии

Загрузка…

Откроется GitHub: создайте новый issue с вашим комментарием (кнопка «Submit new issue»). После отправки обновите эту страницу — комментарий появится ниже.

Telegram Max