Magic Key

Published: 14-12-2014

Updated: 21-11-2018

By: Maxime de Roucy

tags: kernel sysrq system

Lorsque vous n’avez plus la main sur la machine et que tout à l’aire « freezé » plutôt que de faire un hard-reset il est possible de passer directement au noyau les commandes permetant de faire un reboot « propre » compte tenu de la situation.

Sources :

activation

Pour ce faire vous devez préalablement avoir activé les magic SysRq keys via sysctl.

Pour la session courante :

root@laptop # sysctl -w kernel.sysrq=1

Pour le prochain démarrage, via le fichier /etc/sysctl.d/99-sysrq.conf :

kernel.sysrq = 1

Utiliser la commande suivante Pour vérifier que les magic SysRq keys sont actives, la signification des différentes valeurs est décrite dans la documentation officiel du noyau Linux :

max@laptop % sysctl kernel.sysrq

reboot

Lorsque la machine est « freezé », pour redémarrer « proprement » le système utiliser la combinaison de touches suivante :

SysRq correspond à la touche PrtScrn soit « Impression Écran ». Il est possible qu’il faille utiliser la touche fn pour accèder à SysRq.

Attention, quelque soit votre layout il faut considéré que vous êtes en qwerty. Par exemple sur un clavier bépo typematrix Alt+SysRq+r devient fn+Alt+prt.sc+o et REISUB devient OPDUVK.

Moyen mnémotechnique pour se rappeler de la suite de touches :

Pour le bépo j’ai trouvé « On Peut Démarrer Un Vieux Koukou » (c’est con que coucou s’écrive avec un C… ça sonnait plutôt bien)

Avec systemd, il est possible que le « display manager » (gdm, kdm…) soit redémarré directement après Alt+SysRq+e. Cela est du à la clause Restart=always dans le fichier de configuration systemd du service correspondant.

via ssh (/proc)

Il est possible de déclencher ces évènement (sysrq) sur un server distant. Il faut cependant déjà être connecté en ssh dessus (encore heureux…).

Par exemple, avoir la liste des processus bloqué en « uninterruptible sleep » (généralement IO, état D dans ps) :

root@laptop # echo w > /proc/sysrq-trigger
root@laptop # dmesg
…
[32227.618675] sysrq: SysRq : Show Blocked State
[32227.618685]   task                        PC stack   pid father
[32227.619300] systemd-udevd   D    0 17760    306 0x00000100
[32227.619310] Call Trace:
[32227.619328]  __schedule+0x22f/0x700
…

Pour restart une machine distante qui ne répond plus :

root@server # echo s > /proc/sysrq-trigger
root@server # echo u > /proc/sysrq-trigger
root@server # echo b > /proc/sysrq-trigger

En ssh, r (récupère le clavier) ne sert à rien et e et i (sigterm & sigkill) couperait le service ssh et on serait comme des con… il ne faut donc pas les utiliser. Il n’est pas possible de passé plusieurs commande d’un coup, on ne peut pas faire echo 'reisub' > /proc/sysrq-trigger.