Сразу к делу: если pacman -Syu завис, сначала подожди пять-десять минут и посмотри, движется ли вывод. Если обновление ещё только скачивает пакеты, Ctrl+C безопасен. Если pacman уже начал устанавливать пакеты, не прерывай его, дождись конца. Если pacman умер сам и оставил блокировку, сними её командой rm /var/lib/pacman/db.lck, но только после проверки, что ни один процесс pacman не запущен.
Обновление Arch Linux выглядит как зависание по нескольким причинам. Разберём самые частые.
pacman качает пакеты с зеркал из /etc/pacman.d/mirrorlist. Если зеркало медленное или перегружено, прогресс-бар стоит на месте, а скорость падает до десятков килобайт в секунду. Большое обновление, например ядро, браузер или среда рабочего стола, качается очень долго. Это не зависание, а медленная загрузка. Порядок зеркал в списке решает, откуда pacman качает: если в начале стоят медленные серверы, обновление тянется часами.
После долгого перерыва между обновлениями pacman тянет сотни мегабайт. На слабом канале это занимает десятки минут. Вывод при этом обновляется, но медленно, и со стороны кажется, что процесс стоит. В самом начале обновления pacman показывает, сколько предстоит скачать: строки Total Download Size и Total Installed Size. Если объём большой, долгое ожидание ожидаемо.
Часть хуков pacman обращается к systemd через D-Bus. Если системная шина подвисла, хук не завершается, и обновление стоит на месте без вывода. Проверить состояние можно командой systemctl --failed: если в списке есть юниты, связанные с D-Bus, это подозрительно.
Файл /var/lib/pacman/db.lck создаётся на время работы pacman. Если второй экземпляр pacman уже запущен, например из другого терминала, новый завершится с ошибкой unable to lock database. А если первый процесс завис, блокировка висит, и все попытки обновить систему упираются в неё.
Иногда pacman останавливается и ждёт ответа. Например, если пакет хочет записать файл, который уже существует и не принадлежит ни одному пакету, pacman спросит, что делать. Вывод при этом стоит, но это не зависание: pacman ждёт ввода с клавиатуры. Посмотри внимательно на экран, возможно, там вопрос. А файлы .pacnew появляются после обновления, когда pacman не перезаписывает изменённый конфиг. К зависанию они отношения не имеют.
После свежей установки или долгого простоя pacman обновляет ключи GPG через pacman-key. Этот этап занимает несколько минут, особенно на слабом железе. Вывод при этом скудный, поэтому легко принять прогрев за зависание.
После установки пакетов pacman запускает хуки: пересборку initramfs через mkinitcpio, обновление кэша шрифтов, перезапуск служб. Некоторые хуки работают долго, особенно пересборка initramfs после обновления ядра. Вывод при этом есть, но редкий. Это тоже не зависание, а работа.
Прежде чем жать Ctrl+C, убедись, что pacman вообще работает.
pacman -Syu работает по шагам. Сначала синхронизирует базы пакетов, потом скачивает обновления, затем проверяет ключи, распаковывает и устанавливает пакеты и в конце запускает хуки. На каждом этапе вывод выглядит по-разному. Если ты знаешь, на каком шаге pacman, проще решить, ждать или вмешиваться. Скачивание можно прервать, установку нет.
Если в терминале меняются проценты, скорости и имена пакетов, процесс жив. Настоящее зависание выглядит иначе: вывод замирает на одной строке на несколько минут.
Открой второй терминал и посмотри:
ps aux | grep pacman
Если pacman в списке и тратит CPU или читает диск, он работает. Нагрузку на диск можно посмотреть через iotop.
Если вывод стоит, а pacman не тратит ресурсы, посмотри на состояние шины:
systemctl status dbus
Если юнит в состоянии failed или слишком долго в activating, хук, который обращается к D-Bus, не сможет завершиться. Тогда сначала чини шину, а потом повторяй обновление.
pacman -Syu
Если получишь unable to lock database, значит, первый pacman держит блокировку и жив. Это хороший признак: обновление идёт, просто медленно.
curl -o /dev/null -w "%{speed_download}\n" https://mirror.yandex.ru/archlinux/core/os/x86_64/core.db
Если скорость низкая, дело в зеркале, а не в pacman.
Порядок действий такой.
Сначала просто подожди. Многие «зависания» на самом деле медленные зеркала или прогрев ключей. Дай pacman время.
Если за десять минут ничего не изменилось, проверь сеть командой выше. Медленное зеркало можно заменить, но проще дождаться конца или перезапустить обновление с другим зеркалом.
Полный корневой раздел тоже останавливает обновление. pacman не может распаковать пакеты и молча ждёт. Проверь:
df -h /
Если раздел заполнен, освободи место и повтори pacman -Syu.
Если pacman на этапе скачивания, до строк checking keyring и installing, Ctrl+C безопасен. Скачанные пакеты останутся в кэше /var/cache/pacman/pkg, и при следующем запуске pacman продолжит с того же места.
Как только в выводе появились строки installing, не трогай pacman. Прерывание посреди транзакции оставляет систему с частично обновлёнными пакетами: часть пакетов новая, часть старая. Это прямой путь к поломке зависимостей. Если очень хочется вмешаться, лучше дождаться конца и разобраться с последствиями, чем получить систему с наполовину обновлёнными библиотеками.
Если Ctrl+C всё-таки случился на этапе установки, не паникуй. Сначала просто повтори обновление:
pacman -Syu
pacman доустановит то, что не успел. Если обновление завершилось с ошибками, проверь целостность пакетов:
pacman -Qkk
Команда проверит файлы установленных пакетов и покажет повреждённые. Подробный разбор есть в статье «Проверка целостности пакетов: pacman -Qkk».
Если после повторного pacman -Syu система не загружается или программы падают, загружайся с live-USB и чини систему из chroot. Но в большинстве случаев повторное обновление решает проблему.
Если pacman умер, например ты убил его через kill -9 или терминал закрылся, файл блокировки остаётся. Любая следующая команда pacman завершится с ошибкой unable to lock database.
Сначала убедись, что pacman точно не запущен:
pgrep -a pacman
Если вывод пустой, можно удалять блокировку:
rm /var/lib/pacman/db.lck
Удаляй блокировку только если ни один pacman не работает. Если удалить файл, пока pacman обновляет базу, можно повредить её. Проверь также, не висит ли pacman-key:
pgrep -a pacman-key
Настрой зеркала через reflector или вручную. Быстрые зеркала убирают главную причину «зависаний». Подробности в статье «Медленные зеркала: настройка reflector». После настройки проверь, что в начале списка стоят действительно быстрые серверы, иначе pacman снова упрётся в медленный.
Запусти обновление в tmux, чтобы закрытие терминала не убивало pacman:
tmux new -s update
pacman -Syu
Отключиться можно через Ctrl+B, D, вернуться через tmux attach -t update.
Чем реже обновляешься, тем больше пакетов качает pacman и тем дольше идёт обновление. Еженедельное обновление проходит быстрее и спокойнее, чем раз в полгода.
В /etc/pacman.conf в секции [options] добавь:
ParallelDownloads = 5
pacman будет качать несколько пакетов одновременно.
Нет. На этапе скачивания можно, на этапе установки пакетов нельзя. Прерывание установки оставляет частично обновлённую систему.
Значит, файл /var/lib/pacman/db.lck существует. Либо работает другой pacman, либо предыдущий умер и оставил блокировку. Проверь pgrep -a pacman и при необходимости удали файл.
Минут десять. За это время pacman успевает скачать заметную часть пакетов или закончить прогрев ключей. Если за десять минут не изменилось ничего, включая скорость и имена пакетов, пора проверять сеть, место на диске и процессы.
Само по себе нет. Опасен только Ctrl+C посреди установки пакетов. Если такое случилось, повтори pacman -Syu и проверь pacman -Qkk.
Это нормально. pacman не перезаписывает изменённые конфиги, а кладёт новые рядом с суффиксом .pacnew. Разбираться с ними нужно вручную, к зависанию они отношения не имеют.
Зависший pacman -Syu в большинстве случаев не зависание, а медленное зеркало или долгий этап. Сначала подожди и проверь, движется ли вывод. Ctrl+C безопасен только до начала установки пакетов. Если pacman умер и оставил блокировку, сними её через rm /var/lib/pacman/db.lck, предварительно проверив процессы. А чтобы не попадать в эту ситуацию, настрой быстрые зеркала и запускай обновления в tmux. Тогда даже самое долгое обновление пройдёт спокойно.
Задай вопрос в чате — отвечаем быстро, по делу и без воды.
Комментарии