Linux Magic System Request Key Hacks (sysrq)

Автор: | 24/03/2022

В ядре Linux существует поддержка «магического» сочетания клавиш. С их помощью можно отправить команду напрямую в ядро Linux и оно тут же её исполнит. Самый простой пример, где это может пригодиться — аварийная перезагрузка сервера. Если у вас проблемы с системным диском, то стандартный reboot может не сработать, так как по сути это обычный бинарник, который нужно прочитать с диска, а потом еще корректно размонтировать все подключенные хранилища. Это может подвесить сам процесс перезагрузки. Но отправив команду напрямую в ядро, вы сможете моментально инициировать перезагрузку.

Проверить поддержку ядром sysrq можно следующим образом:

cat /proc/sys/kernel/sysrq
▪️ 0 - sysrq отключен
▪️ 1 - sysrq полностью включен

Так же возможны другие варианты значений. Не буду приводить все их здесь, можно прочитать в ядерной документации — https://www.kernel.org/doc/html/latest/admin-guide/sysrq.html

Включить весь функционал sysrq можно так:

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

Если вы подключены напрямую к консоли сервера, то отправлять команды в ядро можно следующей комбинацией клавиш: ALT-SysRq-. Клавиша SysRq часто совмещена с PrtSc. Когда я первый раз тестировал эти функции, то пытался их ввести при SSH соединении. Работать не будет. При удалённом подключении команды можно отправлять так:

echo > /proc/sysrq-trigger 

Полное описание команд можно посмотреть в документации, на которую дал ссылку выше. Перечислю те, которые чаще всего могут пригодиться:

◽️ b - моментальная перезагрузка;
◽️ o - моментальное завершение работы;
◽️ d - показывает блокировки, которые держат устройства или файлы;
◽️ e - посылает SIGTERM всем процессам, кроме init;
◽️ l - посылает SIGKILL всем процессам, кроме init;
◽️ f - принудительно запускает oom killer;
◽️ u - попытка перемонтировать все файловые системы в read-only;
◽️ s - синхронизация подмонтированных файловых систем;

На основе перечисленных команд, можно прикинуть комбинацию, которую стоит попробовать сделать, если у вас подвис сервер и штатный reboot не проходит:

e + l + s + u + b

То есть завершаем все процессы, синхронизируем файловые системы, отключаем запись на них и перезагружаемся. Не факт, что всё отработает без ошибок, но мы хотя бы попытались.

Больше примеров проблем, которые можно решить с помощью SysRq: https://www.kernel.org/doc/html/latest/admin-guide/sysrq.html

https://t.me/srv_admin/1758