Информационные технологииStfw.Ru 🔍

SysRq: Убийца процессов

Итак, вы думаете, что можете убить любую зависшую программу при помощи команды kill -9? Но, что если у вас упал X-сервер или ваша программа, использующая "замечательную" библиотеку svgalib? Вот где нам поможет волшебная SysRq. Vikas G P
🕛 02.12.2010, 16:16
Что это

Волшебная SysRq - это комбинация клавиш, перехватываемая непосредственно ядром, которая может быть использована также, как и некоторые другие комбинации, чтобы произвести экстренное выключение. Всё это описано в Documentation/sysrq.txt и реализовано в drivers/char/sysrq.c в исходниках ядра. Это сделано, преимущественно, для разработчиков ядра, но может быть полезно и обычным людям. Так как это выполнено как часть драйвера клавиатуры, это работает всегда, пока работает ядро.

Примечание: в конце статьи, когда я буду упоминать "клавиша SysRq" - это означает одну клавишу (слева от клавиши Scroll lock). А когда я упомяну "волшебная SysRq" - это будет означать комбинацию < Alt+SysRq >.

Включить

Чтобы сделать доступной волшебную комбинацию SysRq, ваше ядро должно быть скомпилировано с опцией CONFIG_MAGIC_SYSRQ. Большинство дистрибутивов по умолчанию включают её. Если же это не так, то вам надо его просто перекомпилировать... :)

[Прим.ред. - это автор так шутит. Вряд ли сборку ядра можно отнести к категории "просто". ;-) Но, как правило, создатели дистрибутивов включают эту опцию. А теперь то, что касается собственно пересборки. В настоящий момент Kernel-HOWTO находится на пересмотре. Этим занимается Kwan Lowe. В дальнейшем документ будет называться Kernel Rebuild Guide. Более-менее законченный вариант в настоящий момент доступен по адресу http://www.digitalhermit.com/~kwan/kernel.html
К этому можно добавить, что Brian Ward, автор оригинального Kernel HOWTO, планирует опубликовать альтернативную версию этого документа.]
После того, как закончите с ядром, проверьте - разрешена ли SysRq по умолчанию.

$ cat /proc/sys/kernel/sysrq

0

Если вы видите 0 - значит не разрешена. Запишите любое ненулевое число в файл /proc/sys/kernel/sysrq, чтобы разрешить её.

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

Для того чтобы она всегда была разрешена, добавьте эти строки в один из ваших инициализационных скриптов (предпочтительно в rc.local).

#Enable SysRq

echo -e "Enabling SysRq\n"

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

Как альтернативный вариант вы можете использовать файл /etc/sysctl или /etc/sysctl.conf, если такой присутствует в вашем дистрибутиве (например, у меня в RedHat такой файл есть). Для включения sysrq добавьте в него следующую строку:

kernel.sysrq = 1

Волшебная комбинация SysRq уникальна. Каждая клавиша при нажатии или отпускании генерирует код, называемый скан-кодом. Не смотря на то, что для волшебной комбинации SysRq используется две клавиши (Alt+SysRq), посылается только один скан-код (0x54, десятичное 84). Можете проверить это при помощи команды showkey -s.

[Прим.ред. - напоминание новичкам: необходимо ничего не нажимать на клавиатуре в течении 10 сек, чтобы программа showkey закончила свою работу. И ещё - в "иксах" showkey отказывается работать, поэтому запускайте её в текстовой консоли.]
И как это использовать?

Волшебная SysRq вызывается как < Alt+SysRq > + < клавиша >. (Напоминаю, что клавиша SysRq также обозначается как Print Screen). В сочетании с < Alt+SysRq > можно использовать следующие клавиши:

k: Клавиша безопасного доступа. Она убивает все процессы, запущенные на текущей виртуальной консоли, так, чтобы никакая излишне любопытная программа не могла захватить ваши нажатия клавиш, в то время как Вы печатаете ваш пароль.

u: Попытка отмонтировать корневую файловую систему ("/") и перемонтировать её в режиме только-для-чтения. В дополнение к экстренному выключению, эта команда может пригодится, если у вас в Linux только один раздел и необходимо выполнить fsck или низкоуровневое редактирование файловой системы (например, восстановление удалённых файлов на файловой системе ext2. Смотрите Ext2fs Undeletion Howto (Прим.ред. - чтобы восстановить удалённые файлы на ФС ext3 смонтируйте её как ext2.)

s: Эта команда сбрасывает содержимое буферов на диск. Это надо сделать до размонтирования.

b: Производит непосредственную перезагрузку, прямо как кнопка Reset. Для безопасного выключения необходимо предварительно сбросить буферы и размонтировать систему.

p: Печатает содержимое регистров процессора.
(Прим.перев. - право, мне, как программисту, непонятно - зачем? Они ведь меняются с бешеной скоростью.)
(Прим.ред. - согласен. Обращаю ваше внимание, что информация пишется в системные логи.)

m: Отображает информацию о памяти.

t: Отображает информацию о запущенных задачах.

0-9: Устанавливает указанный уровень вывода отладочной информации для консоли.

e: Посылает сигнал SIGTERM (приказ завершить работу) всем процессам кроме init.

i: Посылает сигнал SIGKILL(безусловное завершение) всем процессам кроме init.

l: Посылает сигнал SIGKILL всем процессам, включая init (вы ничего не сможете сделать после этого).
'r' - переключает клавиатуру из режима скан-кодов (raw mode) и устанавливает в режим XLATE (8-битный ASCII режим) (Прим.перев. - более подробно о режимах клавиатуры читайте в man kbd_mode или в FAQ console-tools).
'h' - Отображает помощь (на самом деле, любая другая клавиша, кроме указанных выше, вызовет справку. Но 'h' проще запомнить :-)

Выключение

Как можно выключить режим SysRq? В документации (sysrq.txt) нет ничего определенного на этот счёт. Там говорится насчёт нажатия левого и правого Ctrl, клавиш Alt и Shift, но у меня работает более простой способ. Просто нажмите Alt+SysRq ещё раз, и вы выйдете из этого режима.

Что я понял: ядро запоминает состояние волшебной SysRq: нажато или отпущено. Когда вы нажимаете клавишу первый раз, состояние изменяется на нажатое. А когда вы нажимаете любую клавишу, пока SysRq нажата, ядро интерпретирует её как команду. Если вы нажимаете SysRq ещё раз, её состояние изменится на отпущенное, и дальнейшие нажатия клавиш обрабатываются так, как этого требует программа. (Вообще-то, это не так просто. Иногда вышеупомянутый метод не работает. Думаю, это потому, что ядро использует отдельные таблицы трансляции кодов, когда волшебная SysRq нажата.)

Клавиша SysRq изначально означала, как вы можете догадаться, "Системный Запрос". Она использовалась на первых терминалах IBM для запроса центрального компьютера выполнить команду. Эта клавиша теперь редко где используется, кроме, пожалуй, ядра Linux.

Безопасность

Делать доступной волшебную SysRq на работающей машине (сервере) может быть потенциально опасным. Любой, у кого есть физический доступ к машине, может "уронить" машину. Также необходимо запретить SysRq, если другие люди могут удалённо зарегистрироваться на вашей машине. Сигнал < break >, посланный с удалённой консоли, будет интерпретирована как < Alt+SysRq >, и последствия могут быть ужасны. Для получения дополнительной информации, смотрите Remote-Serial-Console-HOWTO.

(Прим.перев. - по адресу http://www.ibiblio.org/pub/Linux/docs/HOWTO/translations/ru/html/ можно найти переводы на русский язык некоторых HOWTO. К сожалению самые поздние из них датируются 2000-м годом, хотя большая часть из них не потеряла своей актуальности и на сегодняшний день.)
Заключение

Хак волшебной SysRq иногда может быть очень удобным. Как бы то ни было, пользуйтесь ею осторожно. Она также даёт вам немного понимания внутренней работы ядра. Если пожелаете, то можете сами добавить несколько команд!

Vikas G P

Я заканчиваю среднюю школу и живу в Хассане, штат Карнатака, Индия, (Hassan, Karnataka in India) пытаюсь балансировать между учёбой и изучением Linux.

Linux   Теги: Linux

Читать IT-новости в Telegram
Информационные технологии
Мы в соцсетях ✉