Все об Arch Linux

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

Частичное обновление Arch: почему нельзя и как не вляпаться

Частичное обновление ломает Arch по механике, а не по случайности. Пакеты в репозиториях собираются против свежих библиотек, поэтому свежий пакет на старой системе не заведётся. Правило одно: только pacman -Syu. А если хочется закрепить версию через IgnorePkg, сначала прочитай, чем это грозит.

Почему pacman -Sy и установка одного пакета ломает систему

pacman -Sy обновляет только базы пакетов. Сами пакеты на диске не трогаются. Теперь pacman знает про новые версии, а система осталась старой.

Дальше ты ставишь один пакет, например pacman -S vlc. pacman берёт свежую версию из репозитория. А собрана она против новых библиотек, которых в системе нет.

Пример. Новый VLC собран против свежего ffmpeg и требует libavcodec.so.61. На диске лежит libavcodec.so.60. Динамический загрузчик не находит нужную библиотеку, и запуск падает с ошибкой error while loading shared libraries.

Вся цепочка выглядит так:

sudo pacman -Sy        # обновил только базы пакетов
sudo pacman -S vlc     # поставил свежий пакет на старую систему
vlc                    # error while loading shared libraries

Что происходит на уровне системы:

  • Свежий пакет требует новую версию библиотеки, а старая осталась на месте. Программа не стартует.
  • Даже если библиотека найдётся, версии могут не совпасть по ABI. Программа запустится и упадёт в случайном месте.
  • pacman тянет зависимости свежего пакета. Часть обновится, часть нет. Получается смесь старых и новых версий в одной системе.
  • Позже полный -Syu может споткнуться о конфликты версий, и разгребать их придётся вручную.

Классический сценарий выглядит так. Утром ты делаешь pacman -Sy, чтобы поставить один пакет. Вечером вспоминаешь, что пора обновить систему, и запускаешь pacman -Syu. А pacman упирается в конфликт: часть пакетов уже обновлена вручную, часть нет, зависимости не сходятся. Вместо пяти минут обновления ты получаешь час разбора полётов.

Это и есть частичное обновление. Arch работает как rolling release: пакеты собираются против текущих версий библиотек, промежуточных состояний система не поддерживает. Подробнее про механику поломки читай в статье «Частичное обновление pacman».

Почему только pacman -Syu безопасно

pacman -Syu делает два дела за один проход: обновляет базы пакетов и обновляет все пакеты. Система переходит из старого состояния в новое целиком, без промежуточных версий.

sudo pacman -Syu   # обновление баз и всех пакетов за один проход

Сначала pacman обновляет базы, потом вычисляет список обновлений, скачивает пакеты и только затем устанавливает. Если скачивание прервётся, ничего не установится, система останется в прежнем состоянии.

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

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

Отдельная история: AUR. Пакеты из AUR собираются на твоей машине против установленных библиотек. Если система частично обновлена, сборка может пройти, а программа упадёт при запуске. Поэтому перед сборкой из AUR система должна быть полностью обновлена.

То же касается AUR-хелперов. yay -Sy пакет делает ровно то, что и pacman -Sy: обновляет базы и ставит один пакет. Хелпер не спасает от частичного обновления, он просто повторяет команду pacman. Обновляйся через yay -Syu или paru -Syu.

Официальная позиция Arch: частичные обновления не поддерживаются. Документация по этому вопросу собрана в разделе «Полезные ресурсы».

Как работает IgnorePkg в /etc/pacman.conf

IgnorePkg это список пакетов, которые pacman пропускает при обновлении. Настраивается в секции [options] файла /etc/pacman.conf:

# /etc/pacman.conf
[options]
IgnorePkg = linux    # не обновлять ядро
IgnorePkg = glibc    # не обновлять glibc

Можно перечислить пакеты одной строкой через пробел:

IgnorePkg = linux glibc

В списке работают glob-шаблоны. IgnorePkg = linux* заморозит ядро, заголовки и всё остальное, что начинается с linux:

IgnorePkg = linux*   # ядро, linux-headers и похожие пакеты

Проверить, что сейчас в списке, можно так:

grep -E '^IgnorePkg|^IgnoreGroup' /etc/pacman.conf   # текущий список

Как это работает

pacman -Syu обновит все пакеты, кроме перечисленных. Они останутся на старых версиях. Базы при этом обновятся, и pacman будет знать, что для этих пакетов есть новые версии.

Три нюанса, которые важно помнить:

  • IgnorePkg действует только на -Su и -Syu. Явная установка pacman -S linux поставит свежую версию, несмотря на список.
  • Разовый пропуск пакета без правки конфига: pacman -Syu --ignore=linux. Несколько пакетов перечисляются через запятую: --ignore=linux,linux-headers.
  • IgnoreGroup работает так же, но для целых групп пакетов.

И ещё один момент: IgnorePkg не замораживает зависимости. Ты игнорируешь openssl, а пакеты, которые от него зависят, обновляются дальше. Рано или поздно свежий пакет потребует новую версию openssl, и всё встанет. Заморозка одного пакета не замораживает его окружение.

Полный разбор закрепления версий читай в статье «Закрепление версий через IgnorePkg».

Чем опасен IgnorePkg

IgnorePkg создаёт то же частичное состояние, только руками. Ты замораживаешь один пакет, а остальная система продолжает обновляться.

Заморозка glibc

glibc это базовая библиотека, от неё зависит почти всё. Пока ты держишь старую glibc, остальные пакеты обновляются против новой. Рано или поздно свежий пакет потребует символы, которых в старой glibc нет. Программа не запустится, а откатывать придётся пачками.

Заморозка ядра

Ядро заморожено, а linux-headers обновилось. DKMS-модули пересоберутся против новых заголовков и не загрузятся в старое ядро. Wi-Fi, видеодрайвер или виртуализация отвалятся в самый неудобный момент.

Понятно, почему ядро хочется заморозить: обновление иногда ломает загрузку или модули. Но правильный ответ не IgnorePkg, а ядро LTS. Оно обновляется реже и стабильнее, а свежие версии продолжают приходить. Заморозка же оставляет тебя с устаревшим ядром без обновлений безопасности.

Главная ловушка

IgnorePkg легко забыть. Строка в конфиге лежит месяцами, ты привыкаешь, что всё обновляется. Потом снимаешь заморозку и получаешь прыжок через десятки версий сразу. Пакет, который не обновлялся полгода, может не завестись на свежей системе.

Когда запускаешь pacman -Syu, игнорируемые пакеты пропускаются, а в выводе появляются предупреждения вида warning: linux: ignoring package upgrade. Если таких строк становится много, это повод пересмотреть список.

Правило такое: IgnorePkg это временный инструмент. Заморозил, решил проблему, снял. Не оставляй его в конфиге навсегда.

Как безопасно тестировать обновления

Полный -Syu это норма. Но перед крупным обновлением можно посмотреть, что придёт, и подготовиться.

Скачай, но не ставь

sudo pacman -Syuw   # скачать обновления, не устанавливая
sudo pacman -Su     # установить скачанное

Флаг -w скачивает пакеты в кэш, но не устанавливает. Ты видишь список обновлений и их размер. Когда решишься, заверши обновление.

Важно: -Syuw это всё ещё частичное обновление, если остановиться на полпути. Скачал, посмотрел, сразу ставь. Не оставляй систему с обновлёнными базами и старыми пакетами.

Список обновлений без изменения баз покажет checkupdates из пакета pacman-contrib:

checkupdates   # список обновлений, базы не трогает

Команда работает с отдельной копией баз и не создаёт частичное состояние. Удобно для быстрой проверки перед решением обновляться. Тот же список даёт pacman -Qu.

Перед скачиванием проверь место в кэше:

df -h /var/cache/pacman/pkg   # хватит ли места под обновление

Если кэш забит, почисти его заранее. Как это сделать, читай в статье «Чистка кэша пакетов paccache».

Смотри changelog

У пакетов, которые ведут changelog, его можно посмотреть:

pacman -Qc <пакет>   # changelog установленного пакета
pacman -Si <пакет>   # информация о пакете в репозитории

Если обновление крупное, загляни на страницу пакета и в changelog. Там часто пишут о сломанных конфигах и ручных действиях.

Читай новости Arch

Перед обновлением ядра, glibc или systemd проверь ленту новостей на сайте Arch:

curl https://archlinux.org/news/   # лента новостей Arch

Там пишут о ручных действиях, которые нужны до или после обновления. Пропустил такое объявление, получил сломанную систему.

Сделай снапшот

Перед крупным обновлением сделай снапшот системы. На btrfs это одна команда, на LVM другая. Если что-то сломалось, откатываешься за минуту.

Снапшота нет? Остаётся откат пакетов. Старые версии лежат в кэше pacman, как их поставить, читай в статье «Установка конкретной версии из кэша». Если пакета в кэше нет, поможет архив пакетов Arch, разбор в статье «Откат пакетов из архива Arch».

Отлавливай ошибки разом

Если хочешь увидеть все проблемы обновления сразу, а не по одной, смотри статью «Обновление с отловом ошибок».

Что делать, если система уже сломана

Если ты уже сделал pacman -Sy и поставил пакет, не жди, пока сломается что-то ещё. Сразу приведи систему к целому состоянию:

sudo pacman -Syu   # полное обновление, закрывает рассинхрон

Проверь целостность пакетов

Если после обновления что-то не запускается, проверь, не повреждены ли файлы пакета:

pacman -Qk <пакет>    # быстрая проверка файлов
pacman -Qkk <пакет>   # подробная проверка с размерами и правами

-Qkk сверяет не только наличие файлов, но и их размеры, права и контрольные суммы. Сломанный пакет переустанови:

sudo pacman -S <пакет>   # переустановка поверх битых файлов

Переустанови всё разом

Крайний случай: рассинхрон затронул много пакетов. Тогда переустанови всё:

pacman -Qqn | sudo pacman -S -   # переустановить все установленные пакеты

Команда берёт список установленных пакетов и ставит их заново. Это долго, но чинит битые файлы. Подробный разбор в статье «Переустановка всех пакетов».

Где pacman хранит базы пакетов

Базы пакетов лежат в /var/lib/pacman/sync. Каждый репозиторий это файл с расширением .db:

ls /var/lib/pacman/sync/   # core.db, extra.db, multilib.db

pacman -Sy перекачивает именно эти файлы. Сами пакеты при этом не трогаются, поэтому базы и система расходятся. Установленные пакеты описаны в /var/lib/pacman/local:

ls /var/lib/pacman/local/   # каталоги установленных пакетов

Эта раскладка объясняет, почему -Sy ничего не ставит, а только обновляет базы. Подробнее в статье «Базы pacman: где лежат».

Почему появляется предупреждение «local is newer than core»

После частичного обновления или отката pacman может ругаться: warning: local is newer than core. Это значит, что установленная версия пакета новее, чем в репозитории. Такое бывает, когда ты поставил свежий пакет на старую систему или откатил базы.

Само по себе предупреждение не опасно, но это маркер рассинхрона. Система в промежуточном состоянии, и следующее обновление может споткнуться. Разбор в статье «Предупреждение local is newer than core».

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

Можно ли заморозить пакет через IgnorePkg навсегда?

Технически можно. Практически плохая идея. Система уедет вперёд, а замороженный пакет останется. Через несколько месяцев он перестанет работать с остальными. Заморозка это временная мера.

Что делать, если я уже сделал pacman -Sy и поставил один пакет?

Не паникуй. Сразу выполни полное обновление:

sudo pacman -Syu

Если система уже сломана и пакет не запускается, откати его на версию из кэша или из архива. Инструкции есть в статьях про откат пакетов.

IgnorePkg и IgnoreGroup: в чём разница?

IgnorePkg игнорирует конкретные пакеты. IgnoreGroup игнорирует целые группы, например IgnoreGroup = base. В остальном работают одинаково.

pacman -Syuw безопасен?

Да, если доводишь дело до конца. Скачал, посмотрел, выполнил pacman -Su. Опасен не сам -Syuw, а остановка на полпути: обновлённые базы при старых пакетах.

Как откатить пакет после неудачного обновления?

Из кэша pacman или из архива пакетов Arch. Обе инструкции есть в статьях про откат пакетов.

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

  • System Maintenance на ArchWiki: официальные правила обслуживания Arch, включая раздел про частичные обновления.
  • Pacman на ArchWiki: документация по пакетному менеджеру.
  • Команды pacman от А до Я: шпаргалка по флагам и командам.

Заключение

Заключение простое. Частичное обновление ломает систему, а IgnorePkg не делает его безопаснее, он лишь откладывает проблему. Обновляйся только через pacman -Syu. Перед крупным обновлением скачай пакеты через -Syuw, прочитай новости Arch и сделай снапшот. Тогда обновление перестанет быть лотереей.



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

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

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

Комментарии

Загрузка…

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

Telegram Max