Все об Arch Linux

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

Обновление «по частям» опасно — объясняем

Суть: обновление «по частям» опасно, потому что пакеты в Arch собраны в единую конструкцию. Свежий пакет требует свежие библиотеки, а старые библиотеки не понимают новые пакеты. Обновил glibc, но не пересобрал всё, что от неё зависит, и система превращается в смесь версий, которая разваливается при первом запуске программы. Правильный порядок один: сначала pacman -Syu, потом установка нового пакета.

Почему обновление «по частям» ломает систему

Arch это rolling release. Пакеты в репозиториях собираются против текущих версий библиотек. Когда ты обновляешь один пакет, а остальные оставляешь старыми, ты создаёшь комбинацию версий, которую никто не тестировал. Именно комбинация, а не сам пакет, чаще всего и ломает систему.

Представь мост. Каждая балка рассчитана на соседние. Замени одну балку на новую, более тяжёлую, и нагрузка перераспределится. Мост может выдержать, а может рухнуть. С пакетами так же: обновление одного элемента меняет требования ко всем остальным. Обновление «по частям» это замена балок по очереди, без расчёта на то, как они сочетаются. Пока меняешь одну, конструкция держится. Меняешь вторую, и где-то появляется трещина.

Официальная документация Arch предупреждает об этом прямо. На странице Partial upgrades написано, что частичные обновления не поддерживаются. Там есть фраза: «Please note that this is only the partial answer». Это не отговорка, а честное признание: предсказать все комбинации версий невозможно, поэтому поддерживается только целое состояние системы.

Почему пакеты в Arch связаны между собой

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

Связь видна в дереве зависимостей. Команда pactree показывает, кто от кого зависит:

pactree glibc   # кто зависит от glibc

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

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

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

Что такое soname и почему он ломает запуск

Библиотеки в Linux имеют soname: имя с номером версии ABI, например libavcodec.so.61. Программа, собранная против libavcodec.so.61, ищет именно этот файл. Если в системе лежит libavcodec.so.60, запуск падает с ошибкой error while loading shared libraries.

Частичное обновление создаёт ровно эту ситуацию. Ты поставил свежий пакет, собранный против новой библиотеки, а сама библиотека осталась старой. Динамический загрузчик не находит нужный soname, и программа не стартует.

Ошибка error while loading shared libraries выглядит пугающе, но причина почти всегда одна: версия библиотеки не совпадает с той, против которой собран пакет. В Arch это классический симптом частичного обновления. Если такая ошибка появилась после установки одного пакета, первым делом вспомни, когда ты делал pacman -Syu.

Посмотреть soname установленной библиотеки можно так:

readelf -d /usr/lib/libavcodec.so | grep SONAME

Если у свежего пакета в зависимостях указан libavcodec.so.61, а в системе только libavcodec.so.60, pacman при полном обновлении сам подтянет новую библиотеку. При частичном обновлении он этого не сделает, потому что не знает о рассинхроне.

Почему откат glibc опаснее, чем кажется

Отдельная история: откат библиотеки вниз. Допустим, обновление glibc что-то сломало, и ты решил вернуть старую версию. Проблема в том, что остальные пакеты уже обновились против новой glibc. Старая версия не содержит новых символов, и программы падают с ошибками вроде undefined symbol.

Откат glibc в одиночку почти всегда ломает систему сильнее. Правильный путь: откатывать не одну библиотеку, а весь набор пакетов, собранных против неё. Как это делается, разобрано в статье «Сломалось после обновления: откат».

Что делать, если хочется поставить один пакет без обновления

Сначала ответь на вопрос: давно ли ты обновлял систему? Если вчера делал pacman -Syu, поставить один пакет можно спокойно:

sudo pacman -Syu   # сначала полное обновление
sudo pacman -S vlc # потом установка

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

Частый вопрос: «Я поставил один пакет без обновления, и всё работает. Это нормально?». Да, пока работает. Поломка случается не в момент установки, а позже, когда свежий пакет начинает тянуть зависимости или когда следующее обновление спотыкается о рассинхрон. Один раз может пройти, привычка заканчивается сломанной системой.

Проверить, что обновления есть, можно без изменения баз:

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

Команда из пакета pacman-contrib работает с отдельной копией баз и не создаёт частичное состояние. Тот же список обновлений покажет pacman -Qu. Разница в том, что checkupdates не трогает базы, а pacman -Qu читает уже скачанные. Для быстрой проверки перед установкой хватит любой из них.

Чем подход Manjaro отличается от Arch

Manjaro держит свои репозитории и выпускает обновления пачками, с задержкой относительно Arch. Это осознанная стратегия: пакеты проходят дополнительную проверку, прежде чем попасть к пользователям. Внутри Manjaro обновление тоже должно быть полным, но сама система устроена так, что рассинхрон встречается реже.

Arch работает иначе: пакеты попадают в репозитории сразу после сборки. Никто не держит их неделями. Поэтому правило «только полное обновление» здесь критично. Перенос пакетов из Manjaro в Arch или наоборот ломает систему по той же причине: версии не совпадают. Пакет из Manjaro, поставленный в Arch, собран против других версий библиотек. Он может установиться, но работать не будет. Подробнее в статье «Импорт пакетов из Manjaro».

Как заморозить пакет легально: IgnorePkg

Иногда пакет хочется не обновлять: свежая версия сломана, фикс ещё не вышел. Легальный способ заморозки есть, и он явный: директива IgnorePkg в /etc/pacman.conf.

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

Разница между заморозкой и частичным обновлением в осознанности. Частичное обновление это случайность: ты не знаешь, что создаёшь рассинхрон. IgnorePkg это решение: ты знаешь, какой пакет заморожен и почему. Но механика та же, поэтому замораживать можно только «листовые» пакеты: ядро, драйверы, приложения. Библиотеки вроде glibc замораживать нельзя. Подробный разбор в статье «Частичное обновление и IgnorePkg».

Что такое тестовая зона и зачем она нужна

Хочешь проверить, как поведёт себя обновление, не рискуя рабочей системой? Заведи тестовую зону: виртуальную машину с Arch. Обновляй её первой, смотри, что ломается, и только потом обновляй основную систему.

# в виртуальной машине
sudo pacman -Syu

Виртуалка не заменит реальное железо: драйверы и модули ядра ведут себя по-разному. Но для библиотек, glibc и системных пакетов она отлично показывает, чего ждать. Как поднять Arch в виртуалке, описано в статье «Arch в виртуальной машине».

Тестовая зона полезна и для AUR. Собери проблемный пакет в виртуалке, посмотри, как он ведёт себя после обновления, и только потом трогай рабочую систему. Если пакет падает в виртуалке, он упадёт и на реальной машине.

Какой порядок действий правильный

Порядок всегда один:

  1. pacman -Syu: полное обновление.
  2. Установка нужного пакета.
  3. Перезагрузка, если обновилось ядро.

И никогда не игнорируй сообщения pacman. Если он пишет про downgrade, version mismatch или local is newer than core, это не шум, а сигнал рассинхрона. Разбор предупреждения в статье «Предупреждение local is newer than core».

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

Я долго не обновлялся и поставил один пакет. Это уже поломка?

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

Можно ли обновить только ядро, а остальное не трогать?

Можно, но это частичное обновление. Ядро обновится, а модули и заголовки останутся старыми. DKMS-модули перестанут собираться. Если хочется стабильности, поставь linux-lts и обновляй его как обычно.

IgnorePkg это то же самое, что частичное обновление?

По механике да: пакет остаётся старым, остальное обновляется. Разница в осознанности и в том, что замораживают обычно «листовые» пакеты. Библиотеки замораживать нельзя.

Что делать, если pacman предупреждает о version mismatch?

Не продолжай установку вслепую. Сначала выполни полное обновление pacman -Syu. Если предупреждение осталось, разберись, какой пакет рассинхронизирован, и откати его.

Где тестировать обновления, если нет второй машины?

Виртуальная машина. Arch в VirtualBox или QEMU занимает пару гигабайт и полностью повторяет поведение пакетов. Для проверки обновлений этого достаточно.

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

  • Partial upgrades на ArchWiki: официальное объяснение, почему частичные обновления не поддерживаются.
  • System Maintenance на ArchWiki: правила обслуживания Arch.

Заключение

Обновление «по частям» опасно, потому что пакеты в Arch связаны между собой. Свежий пакет требует свежие библиотеки, а старые библиотеки не понимают новые пакеты. Правильный порядок один: pacman -Syu, потом установка. Хочешь заморозить пакет, делай это явно через IgnorePkg и только для «листовых» пакетов. Хочешь проверить обновление заранее, используй тестовую зону. И никогда не игнорируй предупреждения pacman о версиях.



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

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

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

Комментарии

Загрузка…

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

Telegram Max