Частичное обновление ломает 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
Что происходит на уровне системы:
-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 это список пакетов, которые 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 будет знать, что для этих пакетов есть новые версии.
Три нюанса, которые важно помнить:
-Su и -Syu. Явная установка pacman -S linux поставит свежую версию, несмотря на список.pacman -Syu --ignore=linux. Несколько пакетов перечисляются через запятую: --ignore=linux,linux-headers.И ещё один момент: IgnorePkg не замораживает зависимости. Ты игнорируешь openssl, а пакеты, которые от него зависят, обновляются дальше. Рано или поздно свежий пакет потребует новую версию openssl, и всё встанет. Заморозка одного пакета не замораживает его окружение.
Полный разбор закрепления версий читай в статье «Закрепление версий через IgnorePkg».
IgnorePkg создаёт то же частичное состояние, только руками. Ты замораживаешь один пакет, а остальная система продолжает обновляться.
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, его можно посмотреть:
pacman -Qc <пакет> # changelog установленного пакета
pacman -Si <пакет> # информация о пакете в репозитории
Если обновление крупное, загляни на страницу пакета и в changelog. Там часто пишут о сломанных конфигах и ручных действиях.
Перед обновлением ядра, 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 - # переустановить все установленные пакеты
Команда берёт список установленных пакетов и ставит их заново. Это долго, но чинит битые файлы. Подробный разбор в статье «Переустановка всех пакетов».
Базы пакетов лежат в /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: где лежат».
После частичного обновления или отката pacman может ругаться: warning: local is newer than core. Это значит, что установленная версия пакета новее, чем в репозитории. Такое бывает, когда ты поставил свежий пакет на старую систему или откатил базы.
Само по себе предупреждение не опасно, но это маркер рассинхрона. Система в промежуточном состоянии, и следующее обновление может споткнуться. Разбор в статье «Предупреждение local is newer than core».
Технически можно. Практически плохая идея. Система уедет вперёд, а замороженный пакет останется. Через несколько месяцев он перестанет работать с остальными. Заморозка это временная мера.
pacman -Sy и поставил один пакет?Не паникуй. Сразу выполни полное обновление:
sudo pacman -Syu
Если система уже сломана и пакет не запускается, откати его на версию из кэша или из архива. Инструкции есть в статьях про откат пакетов.
IgnorePkg игнорирует конкретные пакеты. IgnoreGroup игнорирует целые группы, например IgnoreGroup = base. В остальном работают одинаково.
pacman -Syuw безопасен?Да, если доводишь дело до конца. Скачал, посмотрел, выполнил pacman -Su. Опасен не сам -Syuw, а остановка на полпути: обновлённые базы при старых пакетах.
Из кэша pacman или из архива пакетов Arch. Обе инструкции есть в статьях про откат пакетов.
Заключение простое. Частичное обновление ломает систему, а IgnorePkg не делает его безопаснее, он лишь откладывает проблему. Обновляйся только через pacman -Syu. Перед крупным обновлением скачай пакеты через -Syuw, прочитай новости Arch и сделай снапшот. Тогда обновление перестанет быть лотереей.
Задай вопрос в чате — отвечаем быстро, по делу и без воды.
Комментарии