LinuxRuLinux без лишней теории
Диагностика системы

Что делать, если Linux зависает намертво: от REISUB до earlyoom

Редакция LinuxRu8 мин чтенияИнструкции

Если Linux зависает, сначала попробуйте Ctrl+Alt+F3: открылась консоль, значит ядро живо и виновный процесс можно убить. Если не помогает, зажмите Alt+SysRq и по очереди нажмите R, E, I, S, U, B, а при нехватке памяти хватит Alt+SysRq+F. Чтобы это не повторялось, поставьте earlyoom или проверьте systemd-oomd и посмотрите журнал прошлой загрузки.

Что делать, если Linux зависает намертво: от REISUB до earlyoom
Фото: Gugalcrom123, CC BY-SA 4.0, Wikimedia Commons
Содержание
  1. Что зависло
  2. Через TTY
  3. REISUB
  4. Включить SysRq
  5. Нехватка памяти
  6. Поиск в журнале
  7. Железо и ядро
  8. Частые вопросы

Зависла графика, память или ядро: как отличить за минуту

Слово "зависает" описывает очень разные поломки, и лечатся они по-разному. Прежде чем жать кнопку питания, проверьте несколько признаков.

  • Курсор двигается, окна не реагируют. Повисла оболочка рабочего стола или одно приложение. Ядро живо, все поправимо без перезагрузки.
  • Все дико тормозит, индикатор диска горит постоянно, мышь дергается раз в несколько секунд. Кончилась оперативная память, система ушла в бесконечный обмен со swap. Это самый частый случай на ПК с 8 ГБ и браузером на 40 вкладок.
  • Картинка замерла намертво, но Caps Lock переключает светодиод и отвечает ping с другого компьютера. Скорее всего упал видеодрайвер, ядро работает.
  • Светодиод Caps Lock мигает сам, клавиатура мертва. Kernel panic. Тут спасет только перезагрузка, а причину искать в журнале.

Полезно держать второе устройство: если по SSH с телефона или ноутбука удается зайти на зависший компьютер, у вас полноценный доступ к процессам и журналу.

Текстовая консоль: снять зависший процесс без перезагрузки

Нажмите Ctrl+Alt+F3 (подойдут F2-F6). Появится черный экран с приглашением входа, введите логин и пароль. Если консоль открылась, ядро в порядке, и можно разбираться.

# кто съел память и процессор
top -o %MEM
# или, если установлен
htop
# завершить процесс по PID, затем принудительно
kill 12345
kill -9 12345
# убить все процессы браузера
pkill -f firefox

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

sudo systemctl restart gdm       # GNOME: Ubuntu, Fedora Workstation
sudo systemctl restart sddm      # KDE Plasma
sudo systemctl restart lightdm   # Linux Mint, Xubuntu
# в KDE Plasma 6 иногда достаточно перезапустить панель
systemctl --user restart plasma-plasmashell

Вернуться в графику можно сочетанием Ctrl+Alt+F1 или Ctrl+Alt+F2, в зависимости от дистрибутива. Как читать top и htop, сортировать и снимать процессы, подробно описано в статье про htop и управление процессами.

REISUB: безопасная перезагрузка, когда ничего не отвечает

Magic SysRq - сочетания клавиш, которые обрабатывает само ядро, минуя графику и зависшие программы. Последовательность REISUB перезагружает компьютер аккуратнее, чем кнопка питания: файловые системы успевают сбросить буферы на диск.

Зажмите Alt и SysRq (на большинстве клавиатур это Print Screen), не отпуская их, по очереди нажимайте R, E, I, S, U, B с паузой в 2-3 секунды. На ноутбуках часто нужен еще Fn: Fn+Alt+PrtSc.

  1. R - забрать клавиатуру у графического сервера.
  2. E - послать всем процессам SIGTERM, просьбу завершиться.
  3. I - послать SIGKILL тем, кто не послушался.
  4. S - записать на диск все несохраненные буферы.
  5. U - перемонтировать файловые системы только на чтение.
  6. B - немедленно перезагрузить.

Порядок запоминается фразой "Reboot Even If System Utterly Broken" или словом BUSIER задом наперед. Вместо B можно нажать O, тогда компьютер выключится. Если после R и E ничего не происходит, это не значит, что команды не дошли: на графическом экране ядро ничего не показывает.

Отдельная полезная клавиша - F. Alt+SysRq+F вызывает OOM killer ядра вручную: он убивает самый прожорливый процесс. Если система встала из-за нехватки памяти, этого часто хватает, и перезагрузка не нужна.

Почему REISUB не работает и как включить Magic SysRq

Дистрибутивы по умолчанию разрешают только часть функций SysRq, потому что физический доступ к клавиатуре иначе позволял бы любому убивать процессы. Текущее значение:

cat /proc/sys/kernel/sysrq

Число - сумма битов из таблицы. В Ubuntu и Linux Mint по умолчанию стоит 176, то есть работают только S, U и B. В Fedora и Arch через systemd выставлено 16, остается одна синхронизация S. Поэтому REISUB "из коробки" обычно срабатывает лишь наполовину.

ЗначениеЧто разрешаетКлавиши
0SysRq полностью выключеннет
1Все функциивсе
2Уровень вывода сообщений в консоль0-9
4Управление клавиатуройR, K
8Отладочные дампы процессов и памятиT, M, W, P
16Синхронизация дисковS
32Перемонтирование только на чтениеU
64Сигналы процессам и OOM killerE, I, F
128Перезагрузка и выключениеB, O
256Понижение приоритета realtime-задачN

Для домашнего ПК разумно значение 244 (4+16+32+64+128): полный REISUB и клавиша F без отладочных дампов. Задать навсегда:

echo 'kernel.sysrq = 244' | sudo tee /etc/sysctl.d/90-sysrq.conf
sudo sysctl --system
cat /proc/sys/kernel/sysrq

Ограничение касается только клавиатуры. От root функции доступны всегда, это удобно по SSH: echo f | sudo tee /proc/sysrq-trigger вызывает OOM killer, echo b | sudo tee /proc/sysrq-trigger перезагружает. Полный список клавиш есть в документации ядра по SysRq.

Нехватка памяти: почему OOM killer опаздывает и что поставить

Ядро запускает свой OOM killer, когда памяти не осталось совсем. До этого момента оно выбрасывает из кэша код программ и тут же читает его с диска снова. Компьютер формально жив, но каждое движение мыши занимает секунды, и такое состояние может длиться десятки минут. Решение - демон, который убивает процесс заранее, пока система еще отзывчива.

systemd-oomd

В Ubuntu с 22.04 и в Fedora с 34 уже работает systemd-oomd. Он следит за давлением памяти (PSI) и завершает целый cgroup, например вкладки браузера или зависшую сборку. Проверить:

systemctl status systemd-oomd
oomctl
journalctl -u systemd-oomd -b

earlyoom

earlyoom проще и предсказуемее: смотрит на процент свободной памяти и swap и при пороге отправляет SIGTERM самому крупному процессу. Хорош для Debian, Arch, Linux Mint и слабых машин.

sudo apt install earlyoom          # Debian, Ubuntu, Mint
sudo dnf install earlyoom          # Fedora
sudo pacman -S earlyoom            # Arch
sudo systemctl enable --now earlyoom

Настройки в Debian, Ubuntu и Fedora лежат в /etc/default/earlyoom. Пример: срабатывать при 5% свободной памяти и 10% swap, в первую очередь жертвовать браузерами и не трогать сеанс рабочего стола:

EARLYOOM_ARGS="-m 5 -s 10 -r 3600 --prefer '(^|/)(firefox|chrome|electron)$' --avoid '(^|/)(gnome-shell|plasmashell|kwin_wayland|Xorg|sshd)$'"

Порог срабатывает, только когда ниже минимума и память, и swap. После правки файла выполните sudo systemctl restart earlyoom.

Два OOM-демона одновременно не нужны. Ставите earlyoom в Ubuntu или Fedora, отключите systemd-oomd: sudo systemctl disable --now systemd-oomd. Вторая половина решения - сжатый swap в памяти, он заметно отодвигает момент нехватки на ноутбуках с 8 ГБ. Как его включить, рассказано в статье про ZRAM и swap.

Если зависания повторяются при работе с браузером, IDE или сборкой проектов, начните с простого: поставьте earlyoom или проверьте, что работает systemd-oomd, и включите zram. На практике это устраняет большинство "намертво" на домашних машинах, а REISUB остается на крайний случай.

Поиск причины в журнале после перезагрузки

Все, что ядро успело сказать перед зависанием, остается в журнале systemd, если он хранится на диске. В Fedora, Arch и Ubuntu хранение постоянное по умолчанию. Проверить и включить, если каталога нет:

ls /var/log/journal
sudo mkdir -p /var/log/journal
sudo systemctl restart systemd-journald

Смотрим предыдущую загрузку, ту, что закончилась зависанием:

journalctl --list-boots
journalctl -b -1 -p err
journalctl -k -b -1 -e
journalctl -k -b -1 | grep -iE 'oom|killed process|hung_task|blocked for more|xid|gpu|ring .* timeout|hardware error|mce'

Что означают типичные находки:

  • Out of memory: Killed process - нехватка памяти, см. раздел выше.
  • task ... blocked for more than 120 seconds - процесс ждет диск. Проверьте SMART и кабель, особенно у HDD и внешних USB-дисков.
  • NVRM: Xid - ошибка драйвера NVIDIA. Обновите или откатите драйвер.
  • amdgpu: ring gfx timeout - зависание видеоядра AMD, часто лечится обновлением ядра и пакета linux-firmware.
  • mce: [Hardware Error] - процессор или память сообщают об аппаратной ошибке.

Если журнал обрывается без единой ошибки, это тоже информация: скорее всего виновато железо или питание, ядро просто не успело ничего записать. Если журнал за много месяцев раздулся до гигабайтов, ограничьте его размер, как показано в статье про journald.

Когда виновато железо или свежее ядро

Зависания без следов в журнале чаще всего приходят от оперативной памяти, перегрева или блока питания.

  • Память. Проверьте ее memtest86+. В Ubuntu и Debian он ставится пакетом memtest86+ и появляется отдельным пунктом в меню GRUB, работает и в UEFI. Оставьте тест на несколько проходов, одна ошибка уже повод менять модуль или отключить разгон XMP/EXPO.
  • Температура. Пакет lm-sensors, команда sensors. Если процессор под нагрузкой упирается в 95-100 градусов, пора менять термопасту и чистить радиатор.
  • Диск. Подвисания на секунды при обращении к файлам часто дает умирающий HDD или SSD. Как проверить накопитель, разобрано в статье про проверку диска.
  • Ядро. Начались зависания сразу после обновления? В меню GRUB откройте дополнительные параметры и загрузите предыдущее ядро. Если с ним все стабильно, оставьте его основным до следующего обновления.

Для серверов и машин без монитора полезно, чтобы после kernel panic компьютер перезагружался сам, а не висел до утра:

echo 'kernel.panic = 10' | sudo tee /etc/sysctl.d/91-panic.conf
sudo sysctl --system

Через 10 секунд после паники система уйдет в перезагрузку.

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

Почему Ubuntu зависает намертво при нехватке памяти?

Ядро до последнего вытесняет код программ из памяти и читает его с диска снова, и OOM killer срабатывает слишком поздно. Поставьте earlyoom или проверьте systemd-oomd, включите zram, а в момент зависания нажмите Alt+SysRq+F.

REISUB не работает, что делать?

Проверьте cat /proc/sys/kernel/sysrq. В Ubuntu по умолчанию 176, в Fedora и Arch 16, поэтому часть клавиш выключена. Задайте kernel.sysrq = 244 в /etc/sysctl.d/90-sysrq.conf и выполните sudo sysctl --system. На ноутбуке может понадобиться Fn.

Опасно ли включать Magic SysRq?

Риск только в физическом доступе: человек у клавиатуры сможет перезагрузить компьютер или убить процессы. Для домашнего ПК это приемлемо. На общих компьютерах и в публичных местах оставьте значение по умолчанию.

Где посмотреть, почему Linux завис?

После перезагрузки выполните journalctl -b -1 -p err и journalctl -k -b -1. Ищите строки Out of memory, blocked for more than 120 seconds, NVRM: Xid и Hardware Error.

Нужен ли earlyoom, если есть systemd-oomd?

Нет, достаточно одного. В Ubuntu и Fedora systemd-oomd уже работает. earlyoom удобнее на Debian, Arch и Linux Mint или если вы хотите задавать порог в процентах свободной памяти.

Документация и источники

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

Команды проверены на актуальных версиях дистрибутивов на момент обновления. Перед изменением системных настроек сделайте резервную копию.