Конкретную версию пакета в Arch Linux ставят из файла. Команды pacman -S пакет=1.2.3 не существует: pacman умеет брать из репозитория только то, что лежит там сейчас. Поэтому сначала получаешь файл .pkg.tar.zst нужной версии — из кэша pacman или из архива Arch Linux Archive, — а потом устанавливаешь его командой pacman -U /путь/к/файлу.pkg.tar.zst. Pacman проверит подписи и поставит ровно ту версию, что в файле. Ниже — где искать файлы, как их ставить и как не потерять откаченную версию при следующем обновлении.
Pacman работает с репозиториями, а в зеркалах всегда лежат только актуальные версии пакетов. Синтаксиса pacman -S пакет=1.2.3 нет — pacman не умеет выбирать версию из репозитория, такой запрос он просто не поймёт.
Команда pacman -S всегда ставит самую свежую версию из базы репозитория. База обновляется вместе с зеркалами, и старых версий в ней нет в принципе. Запрос с версией pacman просто не поймёт и выдаст ошибку. Это не особенность конкретной сборки: так работает pacman в любом дистрибутиве на его основе. Откат — это всегда работа с файлами, а не с репозиторием.
Поэтому единственный способ поставить старую версию — установить её из файла через pacman -U. Файл можно взять в двух местах: в собственном кэше pacman или в историческом архиве пакетов.
Каждый скачанный пакет pacman сохраняет в /var/cache/pacman/pkg. Если ты недавно обновлялся, предыдущая версия пакета почти наверняка ещё там. Сначала посмотри, какая версия установлена сейчас:
pacman -Q имя-пакета
Потом проверь, что лежит в кэше:
ls /var/cache/pacman/pkg/ | grep имя-пакета
Имя файла содержит версию и номер сборки: имя-пакета-1.2.3-1-x86_64.pkg.tar.zst. Если в списке есть версия старше текущей — это твой файл. Если файла нет — значит, кэш уже почищен, иди в архив.
Кэш не вечный: утилита paccache чистит его по расписанию и по умолчанию оставляет три последние версии каждого пакета. Чтобы предыдущая версия была под рукой всегда, настрой -rk2 — тогда в кэше остаются текущая и предыдущая версии. Как это сделать, разобрано в статье «Чистка кэша пакетов paccache».
Если в кэше пусто, иди в официальный архив пакетов. Там лежат все версии всех пакетов из официальных репозиториев, отсортированные по первой букве имени. Структура каталогов простая: packages/<первая буква имени>/<имя пакета>/<имя пакета>-<версия>.pkg.tar.zst.
Открой страницу пакета, найди нужную версию и скачай файл. Следи за архитектурой: для x86_64 нужен суффикс x86_64, для ARM — aarch64. Версия и номер сборки в имени файла должны совпадать с тем, что ты ищешь:
wget https://archive.archlinux.org/packages/l/linux/linux-6.12.10-1-x86_64.pkg.tar.zst
Отдельно в архиве хранятся базы репозиториев по датам: repos/<год>/<месяц>/<день>/. С их помощью можно откатить целую систему, а не один пакет. Но для точечного отката одного приложения достаточно скачать один файл.
Зеркала тут не помогут: в них всегда только текущие версии. Старые версии исчезают из зеркал сразу после обновления репозитория. Для отката используй кэш или архив. Искать старую версию в зеркале — пустая трата времени.
Ручной путь — это два шага: найти файл и установить. Скрипт downgrade из AUR автоматизирует оба. Он сканирует кэш и архив, показывает список доступных версий, а выбранную ставит через тот же pacman -U. Установка:
yay -S downgrade
Запуск:
downgrade имя-пакета
Скрипт спросит, какую версию поставить, и предложит добавить пакет в IgnorePkg. Удобно, когда откатываешь часто: не нужно вручную разбираться в структуре архива и запоминать имена файлов.
Когда файл на руках, установка занимает одну команду:
pacman -U /var/cache/pacman/pkg/имя-пакета-1.2.3-1-x86_64.pkg.tar.zst
Если файл скачан из архива — укажи путь к нему:
pacman -U ~/Загрузки/имя-пакета-1.2.3-1-x86_64.pkg.tar.zst
Pacman проверит подпись файла (GPG), разберётся с зависимостями и установит ровно эту версию. Команда pacman -U принимает и локальные файлы, и URL: если пакет лежит в сети, можно указать ссылку напрямую, без скачивания. Проверь результат:
pacman -Q имя-пакета
В выводе увидишь установленную версию. Если она совпадает с нужной — всё сделано правильно. Сразу после установки запусти приложение и проверь, что проблема ушла.
Если нужно откатить несколько пакетов сразу — перечисли все файлы в одной команде через пробел. Pacman установит их за один проход и сам разберётся с зависимостями между ними.
Собери всю процедуру в один список, чтобы не пропустить шаг:
pacman -Q имя-пакета.pacman -U /путь/к/файлу.pkg.tar.zst.pacman -Q имя-пакета.IgnorePkg.Пункты 6 и 7 пропускают чаще всего, и через неделю пакет снова обновляется, а проблема возвращается. Откат без закрепления — это временное решение.
Откат одного пакета часто требует отката связанных. Классический пример — ядро: linux и linux-headers должны совпадать по версии. Если откатываешь ядро, откатывай оба пакета одной командой:
pacman -U /var/cache/pacman/pkg/linux-6.12.10-1-x86_64.pkg.tar.zst \
/var/cache/pacman/pkg/linux-headers-6.12.10-1-x86_64.pkg.tar.zst
Посмотреть, от чего зависит пакет и что зависит от него, можно так:
pacman -Qi имя-пакета
В выводе будут списки Depends On и Required By. Если откатываемый пакет тянет за собой библиотеку — откатывай её вместе с ним. Pacman сам сообщит о несовпадении зависимостей, а вывод команды подскажет, каких версий не хватает.
Если pacman отказывается ставить пакет из-за зависимостей, а ты уверен, что они на месте, есть флаг -dd — он пропускает проверку зависимостей. Это крайняя мера: система может сломаться. Сначала откати недостающие зависимости, а -dd оставь на самый крайний случай. После установки с -dd обязательно проверь, что приложение вообще запускается.
После установки из файла откаченная версия становится текущей. Следующий pacman -Syu снова обновит пакет до свежей — и проблема может вернуться.
Чтобы закрепить версию, добавь пакет в IgnorePkg в /etc/pacman.conf:
IgnorePkg = имя-пакета
В IgnorePkg можно перечислить несколько пакетов через пробел. После закрепления pacman будет пропускать пакет при обновлениях, пока ты не уберёшь его из списка. Подробно про закрепление версий — в статье «Замораживание версий пакетов через IgnorePkg».
Закрепляй осознанно. Запиши, почему откатил пакет и при каких условиях можно вернуть свежую версию. Как только апстрим починит проблему — убери пакет из IgnorePkg и выполни pacman -Syu.
Если после отката проблема осталась или система перестала загружаться — дело может быть не в пакете, а в ядре или загрузчике. Откат ядра и GRUB разобран в статье «Откат обновления GRUB».
Посмотри журнал последней загрузки:
journalctl -b -p err
Он покажет, какой компонент падает. Если виновата конфигурация, а не версия пакета — откат не поможет, ищи причину в настройках.
В архиве лежат почти все версии всех пакетов из официальных репозиториев. Если пакета там нет — скорее всего, он из AUR. Готовых бинарных файлов старых версий для AUR не существует: откат выглядит иначе. Берёшь старый PKGBUILD из git-истории и пересобираешь пакет заново. Если PKGBUILD с тех пор менялся — придётся разбираться с изменениями вручную.
Проверь, что файл скачан целиком и с официального источника. Ошибка подписи часто появляется, когда файл не докачался или взят с постороннего сайта. Если ошибка про неизвестный ключ — обнови ключи: pacman-key --refresh-keys. Если файл повреждён — скачай его заново. Скачивай пакеты только из официального архива или из кэша pacman.
Проверь, что initramfs соответствует версии ядра. Загрузись с live-USB, сделай arch-chroot и пересобери образ: mkinitcpio -P. Проверь также, что в загрузчике указана правильная версия ядра. Если не помогло — возможно, понадобится откат GRUB.
pacman -Q имя-пакета покажет установленную версию. Чтобы сравнить её с версией в репозитории, выполни pacman -Si имя-пакета.
Откат одного пакета — это pacman -U с одним файлом. Откат всей системы — это переустановка всех пакетов из архивных баз репозиториев по состоянию на нужную дату. Такой способ тяжелее и нужен редко: обычно хватает точечного отката одного-двух пакетов. К тому же полный откат требует осторожности — версии пакетов в архиве должны быть совместимы между собой.
Конкретную версию пакета ставят из файла: pacman -U — единственный способ, синтаксиса pacman -S пакет=версия не существует. Файл берёшь из кэша /var/cache/pacman/pkg или из официального архива пакетов. После установки проверь версию через pacman -Q, сразу протестируй приложение, при необходимости закрепи пакет в IgnorePkg и не забудь откатить связанные пакеты — особенно ядро и его заголовки. Если кэш настроен с -rk2, предыдущая версия всегда под рукой, и откат занимает одну команду.
Задай вопрос в чате — отвечаем быстро, по делу и без воды.
Комментарии