7/16/2007

Волшебная клавиша SysRq / Printscreen

Достаточно редко, когда я провожу над своей системой бесчеловечные ядерные эксперименты, она зависает наглухо - ничто не совершенно в этом мире. Именно для этих целей в ядре Линукс имеется замечательная возможность: Волшебная клавиша SysRq или Magic SysRq Key.


Что это такое?

Если внимательно посмотреть на клавиатуру, там обнаружится кнопка PrtSc / SysRq. Подавляющее большинство пользователей Windows полагают, что она специально присутствует на клавиатуре для скриншотов. Однако
кнопка Magic SysRq Key появилась на клавиатурах задолго до Microsoft.

На самом деле эта клавиша - наша единственная прямая связь с ядром, которая работает всегда. При помощи некоторых комбинаций клавиш можно заставить систему аварийно сбросить данные на диски, размонтировать все файловые системы в режим "только-чтение" и перезагрузиться даже при наглухо зависшей системе.




Magic SysRq это комбинация клавиш, напрямую перехватываемая ядром и может быть использована для аварийного выключения. Так как Magic SysRq выполнена как часть драйвера клавиатуры, она гарантировано работает всегда - или почти всегда, если только ядро само по себе работоспособно.


Как ей пользоваться?
Сначала нужно убедиться, что она включена: в конфиге ядра CONFIG_MAGIC_SYSRQ должно иметь значение Y (по крайней мере в дефолтном ядре Дебиана это так). Дальше применение такое: нажимаем и держим ALT, нажимаем SysRq, отпускаем всё и нажимаем одну из "командных" клавиш - ниже их краткое описание.


Командные клавиши
Ниже перечислены наиболее полезные клавиши, которые могут пригодиться для тех, кто проводит бесчеловечные эксперименты над системой или устанавливает проприетарные драйвера. Чтобы их легче было запомнить, будет написано слово, в котором эта буква есть по смыслу. Всё сказанное ниже актуально по крайней мере для ядер 2.6.20 и выше.

Одновременное нажатие клавиш Alt + SysRq +

'H'elp - выводит все доступные возможности SysRq, выделяя большой буквой клавишу действия;

loglevel'0'-'8' - позволяет менять уровень подробности вывода от 0 (только критические сообщения) до 8 (самый подробный режим);

re'B'oot - немедленная перезагрузка системы, прямо как клавиша RESET (без синхронизации и размонтирования файловых систем);

'C'rashdump - выполняет директиву kexec для перезагрузки, чтобы получить сведения об ошибках;

hol'D's - показывает все блокировки, которые держат устройства или файлы;

power'O'ff - корректно выключает систему (если настроено и поддерживается, обычно это прямая команда отключения);

'S'ync - пытается синхронизировать все примонтированные файловые системы, при этом пишет в консоли "Emergency Remount R/O" - когда этот процесс закончится, должно написать "Emergency Remount Complete";

'U'nmount - пытается перемонтировать все примонтированные файловые системы в режим "только-чтение";

show'T'asks - выдаст список текущих задач и информацию о них в текущую консоль;

'N'ice - используется для того, чтобы сделать задачи реального времени с изменяемым приоритетом;

sho'W'-blocked-tasks - выдаст список всех непрерываемых (заблокированных, ждущих окончание ввода-вывода) задач;

show'M'em - выдаст информацию о доступной и занятой оперативной памяти, а так же степени использования своп-файла;

'F'ull - вызвать oom_kill (out-of-memory kill) для прерывания приложений, забравших слишком много памяти (может занять продолжительное время);

secure acces 'K'ey - убивает все программы на текущей консоли, но не применяйте её на консоли, где запущены иксы (графический сервер будет остановлен и вы не сможете увидеть то, что печатаете и то, что ответит SysRq);

un'R'aw - забирает контроль над мышью и клавиатурой у Х-сервера, что полезно, если Х-севрвер завис: так можно перейти в консоль, убить Х-сервер или проверить логи;

t'E'rm - послать сигнал завершения работы SIGTERM всем процессам, кроме init.

K'I'LL - послать сигнал немедленного завершения работы SIGKILL всем процессам, кроме init.

То есть, например, для аварийной синхронизации данных жмём ALT+SysRq + s, далее ALT+SysRq + u и после этого можно жать на ресет или, что тоже самое ALT+SysRq+b

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

31 комментарий:

  1. >>secure acces 'K'ey - убивает все программы на текущей консоли, но не применяйте её на консоли, где запущены иксы (графический сервер будет остановлен и вы не сможете увидеть то, что печатаете и то, что ответит SysRq);
    Хм, иногда удобно, если просто нужно перегрузить X'ы...
    >>вы не сможете увидеть то ... что ответит SysRq
    dmesg и messages еще никто не отменял =).

    ОтветитьУдалить
  2. УХ ТЫ! Нет слов. СПАСИБО за наводку на столь интересный факт.

    ОтветитьУдалить
  3. а как быстро убедиться, что CONFIG_MAGIC_SYSRQ включена?
    У меня в этче не работает
    И непонятно - откуда нажимать на эти комбинации - из терминала, запущенного из иксов, или перейти чисто консольный режим?
    (кстати не посоветуете русскоязычный форум по дебиан)

    ОтветитьУдалить
  4. Определить, включена ли опция CONFIG_MAGIC_SYSRQ можно так:

    # grep CONFIG_MAGIC_SYSRQ /proc/config.gz

    или так:

    # grep CONFIG_MAGIC_SYSRQ /usr/src/.config

    ОтветитьУдалить
  5. Если быть точным, то
    $ zgrep CONFIG_MAGIC_SYSRQ /proc/config.gz
    (_z_grep!)

    ОтветитьУдалить
  6. Кстати, при следующей чистке постов, думаю было бы полезным добавить в этот пост способ определения того, как проверить "включенность" соответствующей опции ядра

    ОтветитьУдалить
  7. А разве на надо включать предварительно?

    echo "1" > /proc/sys/kernel/sysrq


    P.S. Могу заблуждатся, дело было давно...

    ОтветитьУдалить
  8. Анонимному: главный русский форум по Debian — это его рассылка. Читать через веб-интерфейс её можно, например, здесь: http://groups.google.com/group/linux.debian.user.russian/topics

    ОтветитьУдалить
  9. Спасибо. Отличная и полезная статья. Хочу тоже написать чего-нибудь полезного, да идей все нет. Впрочем, я все не о том. :)

    Михаил, когда-то давно я у тебя интересовался, что же ты думаешь по поводу использования RSS для переправки читателям полных постов. И, насколько я помню, ты говорил, что собираешься сделать отдельный RSS-фид для тех, кто хочет читать твои посты целиком из RSS-читалок. Есть ли какие-то движение в этом направлении?

    ОтветитьУдалить
  10. 2 Ni@m пишет...
    dmesg и messages еще никто не отменял =)
    Иногда они бывают недоступны.

    2 JaGoTerr пишет...
    УХ ТЫ! Нет слов.
    Ага, точно :-) Я на это набрёл, когда в ядре открыл Kernel hacking. Полезная вещь - иногда требуется.

    СПАСИБО за наводку на столь интересный факт
    Это возможность ядра. Кстати, от версии к версии назначение и наименование кнопок меняется.

    2 Анонимный пишет...
    У меня в этче не работает
    Не может быть - оно включено в дистрибутивном ядре. Проверял.

    И непонятно - откуда нажимать на эти комбинации
    ОТКУДА УГОДНО! В том вся соль и есть - это прямая связь с ядром, где бы вы ни были.

    2 JaGoTerr пишет...
    Кстати, при следующей чистке постов, думаю было бы полезным добавить в этот пост способ определения того, как проверить "включенность" соответствующей опции ядра
    Разумно. Поместил в список исправлений.

    2 Dormestmass пишет...
    А разве на надо включать предварительно?
    Нет, если оно включено в ядре, то не надо. Так можно выключить это на время и включить снова. Но лушче не выключать :-)

    2 vonderer@darkstar пишет...
    Спасибо. Отличная и полезная статья.
    Пожалуйста. Собственно, я распечатал её и повесил у себя рядом с монитором. На всякий случай :-)

    Хочу тоже написать чего-нибудь полезного, да идей все нет.
    Скромность тебе, Андрей, идёт. :-)

    Михаил, когда-то давно я у тебя интересовался, что же ты думаешь по поводу использования RSS для переправки читателям полных постов.
    Ммм... копаюсь в feedburner. Пока вразумительного ничего не нашёл. На самом деле, у многих людей трафик лимитный (например, у меня :-)) и сильно бесит грузить всю ленту с картинками на пару мегабайт.
    Лент надо делать две. Кто крут в веб-дизайне и хаках блоггера - буду очень признателен.

    ОтветитьУдалить
  11. Ну класс :)
    /коммент считать трэкбэком ;)/
    http://blog.rizn.org/magic-sysrq/

    ОтветитьУдалить
  12. Поправка:

    >> нажимаем и держим ALT, нажимаем SysRq, **отпускаем всё** и нажимаем одну из "командных" клавиш

    Нажимать командную клавишу нужно не отпуская Alt + SysRQ.

    Кстати, для корректной перезагрузки системы в случае зависания используется последовательность командных клавиш REISUB (Raising Elephants Is So Utterly Boring).

    ОтветитьУдалить
  13. 2 Анонимный комментирует...
    Это только в Linux такое есть, или в Unix тоже?
    Юниксов много, я за них не в ответе :-) По крайней мере под Линуксом пашет.

    ОтветитьУдалить
  14. Спасибо, полезная инфа,
    на Кубунту работает :)

    http://ramalokehrota.blogspot.com/2007/07/magic-sysrq.html

    ОтветитьУдалить
  15. А что делать, если на клавиатуре нет такой кнопки Logitech Y-SAE71?

    ОтветитьУдалить
  16. Есть еще и демон sysrqd, занимется теми же "чудесами" но удаленно.

    ОтветитьУдалить
  17. нажимаем и держим ALT, нажимаем SysRq, отпускаем всё и нажимаем одну из "командных" клавиш - ниже их краткое описание.

    Мелкая поправочка или конкретная особенность в *ubuntu командные клавиши надо нажимать удерживая Alt.

    ОтветитьУдалить
  18. 2 Pavel A. Bragin пишет...
    А что делать, если на клавиатуре нет такой кнопки Logitech Y-SAE71?
    Она должна где-то быть. Может быть, её клавиатурный код принадлежит другой кнопке... Кстати, надо будет выяснить.

    ОтветитьУдалить
  19. Pavel A. Bragin пишет...
    А что делать, если на клавиатуре нет такой кнопки Logitech Y-SAE71?

    Клавиша Print Screen (над * на дополнительной клавиатуре) - это она и есть, просто на ней не написано SysRq. На всякий случай скан-код: keycode 111 (keysym 0xff61, Print)

    ОтветитьУдалить
  20. Mr.Floppy пишет...
    Клавиша Print Screen (над * на дополнительной клавиатуре) - это она и есть, просто на ней не написано SysRq. На всякий случай скан-код: keycode 111 (keysym 0xff61, Print)

    А вот и неправда ваша....по нажатии на Alt+этот самый Print Screen (еще что-то даже нажать не успеваю) на моей Ubuntu 7.04 выскакивает окошко сохранения экрана. В ядре вае необходимые функции включены. на счет скан-кода посмотрю на досуге что выдает.

    ОтветитьУдалить
  21. Pavel A. Bragin пишет...
    по нажатии на Alt+этот самый Print Screen (еще что-то даже нажать не успеваю) на моей Ubuntu 7.04 выскакивает окошко сохранения экрана.
    Обычная гномовская привязка, на функционирование клавиш, перехватываемых ядром, никак не влияющая.
    нажимаем и держим ALT, нажимаем SysRq, отпускаем всё и нажимаем одну из "командных" клавиш

    ОтветитьУдалить
  22. Я не знаю почему, но у меня уже давным-давно перестала работаь перезагрузка (alt+sysrq+b). Ума не приложу, в чём тут дело.

    ОтветитьУдалить
  23. Интересная фича. Попробовал потестить, не работало. Поэкспериментировал, выяснилось, что
    >> нажимаем и держим ALT, нажимаем SysRq, **отпускаем всё** и нажимаем одну из "командных" клавиш
    не срабатывает, правильно:
    нажимаем и держим ALT, нажимаем SysRq, **отпускаем SysRq** и нажимаем одну из "командных" клавиш
    По крайней мере, в Debian Lenny (testing, amd64) так...

    ОтветитьУдалить
  24. [user@localhost ~]$ sudo grep CONFIG_MAGIC_SYSRQ /usr/src/.config
    Пароль:
    grep: /usr/src/.config: Нет такого файла или каталога
    [user@localhost ~]$ sudo grep CONFIG_MAGIC_SYSRQ /proc/config.gz
    grep: /proc/config.gz: Нет такого файла или каталога
    [user@localhost ~]$ zgrep CONFIG_MAGIC_SYSRQ /proc/config.gz
    gzip: /proc/config.gz: No such file or directory
    [user@localhost ~]$ sudo echo "1" > /proc/sys/kernel/sysrq
    bash: /proc/sys/kernel/sysrq: Отказано в доступе

    Ваши проверки не работают на Fedora 8.
    [user@localhost ~]$ uname -a
    Linux localhost.localdomain 2.6.23.1-42.fc8 #1 SMP Tue Oct 30 13:55:12 EDT 2007 i686 athlon i386 GNU/Linux

    ОтветитьУдалить
  25. 2Fast4U, конечно не работает)) это же блог для Дебиана и его вытекающих...
    а для нас с вами вот, к примеру:

    # grep CONFIG_MAGIC_SYSRQ /usr/src/kernels/2.6.27.12-78.2.8.fc9.i686/.config
    CONFIG_MAGIC_SYSRQ=y


    влючайте мозги и гугл, товарищ))

    ОтветитьУдалить
  26. > [user@localhost ~]$ sudo echo "1" > /proc/sys/kernel/sysrq
    > bash: /proc/sys/kernel/sysrq: Отказано в доступе

    Ну что вы, действие sudo на перенаправления ни разу не распространяется. echo "1" выполнится с привилегиями и вернет шеллу текст, а шелл (то есть bash) запушен под пользователем user, который прав писать в /proc/sys/... не имеет, о чем bash и рапортует.

    ОтветитьУдалить
  27. Хорошая и весьма полезная статья. Впрочем, хватит о хорошем. :)
    Очень неудобно, что на блоге нет кнопки "версия для печати".

    ОтветитьУдалить
  28. @Анонимный комментирует...
    Хорошая и весьма полезная статья.
    Плохих не держим-с. :-) Ну, почти...

    Очень неудобно, что на блоге нет кнопки "версия для печати".
    О, это ты правильно говоришь, Анонимус. Вот если б ты ещё сказал, как это сделать - цены б тебе не было. Я гуглил-гуглил, да так и не загуглил решение. Может тебе улыбнётся золотая рыбка? Если что - таки не стесняясь отгружай в комменты. Выкрою время и сделаю.

    ОтветитьУдалить
  29. на иксах Alt+SysRq+* не работает, нужен Ctrl+Alt+SysRq+*

    ОтветитьУдалить
  30. Да, работает, но сначала не получалось почему-то с командой "H", всяко тыкал :D
    Alt+SysRq+k сработало, иксы перезапустились, инет вырубило и музыку.

    ОтветитьУдалить
  31. zgrep CONFIG_MAGIC_SYSRQ /proc/config.gz & other commands - not worked at Kubuntu 15.04

    ОтветитьУдалить