«Магический» SysRq

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

Кто это, что это?

Если мы заглянем в документацию к ядру, то увидим там:
«It is a ‘magical’ key combo you can hit which the kernel will respond to regardless of whatever else it is doing, unless it is completely locked up».
Что означает примерно следующее:
«Это «магическое» сочетание клавиш, нажав которое ядро ответит вам независимо от того, чем занято, если оно окончательно не заблокировано».
SysRq – это, пожалуй, лучший способ (а иногда и единственный) определить, чем занимается машина. Это сочетание особо полезно, когда кажется, что система «повисла», или для диагностики проблем, связанных с ядром.

Как включить и как выключить?

В большинстве дистрибутивов данное сочетание включено по-умолчанию, но, например, в RHEL, по соображениям безопасности – отключено.
Чтобы сделать доступной «волшебную» комбинацию SysRq, ваше ядро должно быть скомпилировано с опцией CONFIG_MAGIC_SYSRQ. Если это не так, нужно всего лишь перекомпилировать его :) Чтобы проверить, включена ли данная возможность, наберите cat /proc/sys/kernel/sysrq
Если на экране появится 1 – значит включена, если 0 – нет.

Есть несколько способов включить и выключить SysRq.
1. Включить: echo 1 > /proc/sys/kernel/sysrq
Выключить: echo 0 > /proc/sys/kernel/sysrq
2. Чтобы включать SysRq автоматически при загрузке, поправьте файл
/etc/sysctl.conf. Найдите там переменную kernel.sysrq и установите её в 1.
Вот так: kernel.sysrq = 1
Этот метод годится только, если в Вашем дистрибутиве есть файл /etc/sysctl.conf.
Если же нет, тогда поместите echo 1 > /proc/sys/kernel/sysrq в Ваш скрипт начальной инициализации.

Как вызвать?

Напрямую вход в режим SysRq нельзя вызвать из X Window System – только из консоли. Поэтому, переключитесь на какой-либо из виртуальных терминалов с помощью сочетания Ctrl+Alt+F1. А затем нажмите Alt+SysRq+[Командная клавиша]
(клавиши SysRq и PrintScreen это одно и тоже). Например, выведем информацию о памяти: Alt+SysRq+m. Результат тут же появится на экране.
Все обращения к SysRq также пишутся в /var/log/messages. В связи с этим, можно предложить ещё один способ вызова SysRq (например из скриптов). Этот способ будет действовать и в «Иксах»:
echo ‘Командная клавиша’ > /proc/sysrq-trigger
Результат можно посмотреть в /var/log/messages.

Команды

k: Клавиша безопасного доступа. Она убивает все процессы, запущенные на текущей виртуальной консоли, так, чтобы никакая излишне любопытная программа не могла захватить ваши нажатия клавиш, в то время как Вы печатаете ваш пароль.
u: Попытка отмонтировать корневую файловую систему («/») и перемонтировать её в режиме Read Only. Может пригодиться, например, для выполнения fsck или редактирования файловой системы.
s:
Записывает содержимое буферов на диск.
b: Перезагрузка.
c: «Крэш» дамп.
d: Отображает все блокировки в системе.
f: Полная информация о памяти.
n: Nice all RT tasks.
o: Отключение питания (если поддерживается ядром).
p: Печатает содержимое регистров процессора.
m: Отображает информацию о памяти.
t: Отображает информацию о запущенных задачах.
0-9: Устанавливает указанный уровень вывода отладочной информации для консоли.
e: Посылает сигнал SIGTERM (приказ завершить работу) всем процессам кроме init.
i: Посылает сигнал SIGKILL (безусловное завершение) всем процессам кроме init.
l: Посылает сигнал SIGKILL всем процессам, включая init (вы ничего не сможете сделать после этого).
r: Переключает клавиатуру из режима скан-кодов (raw mode) и устанавливает в режим XLATE (8-битный ASCII режим)
Остальные клавиши отображают справку по использованию.

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

Оставлять включённой данную возможность не безопасно. Любой, у кого имеется физический доступ к компьютеру, даже без прав администратора, может «убить» систему. Сигнал BREAK, посланный удалённо в течение 5 секунд, будет интерпретирован как Alt+SysRq. О последствиях говорить не приходится.

Используем на практике

Смоделируем ситуацию, которая очень часто встречается в жизни. Для эксперимента выбран дистрибутив ASPLinux 11.2 с ядром 2.6.17-1.2157.1asp.
1. Запустим X Window System.
2. Для пущего реализма наберём реферат страниц на 20, который мы должны завтра сдать.
3. Запустим kppp.
4. kill -9 kppp_pid
5. Снова запустим kppp и согласимся продолжить работу, не обращая внимания на сообщение о том, что kppp уже запущен.
6. Завершим нормальным образом работу kppp, вследствие чего он повиснет.
7. Оставим выполняться cat /dev/zero >> ~/temp (таким образом, если сейчас нажать RESET, то мы имеем все шансы получить «убитую» файловую систему).
8. Выйдем из «Иксов» по Ctrl+Alt+Backspace.

В итоге всех этих манипуляций мы получили систему, которая абсолютно не отвечает на ввод пользователя (ни мышь, ни клавиатура), не сохранённый реферат и потенциальную возможность потерять его, т.к. в этот самый момент cat /dev/zero >> ~/temp делает своё чёрное дело.
Выйти из этой неприятной ситуации нам поможет «магический» SysRq.
Alt+SysRq+e – убьёт все процессы.
Alt+SysRq+s – синхронизирует буферы жёстких дисков.
Alt+SysRq+u – отмонтирует корень.
Alt+SysRq+b – перезагрузит систему.

В итоге, после перезагрузки мы получаем «живую» систему.

Ссылки по теме