Úvodní poznámka: Funkce klávesy SysRq není v Linuxu žádnou novinkou, je to věc z opravdové linuxové prehistorie. Přesto se o ní příliš nemluví, i když vás dokáže dostat z mnoha problémů. Neškodí si proto o její funkci říct, začátečníky třeba tahle funkce překvapí.
Kouzelná klávesa SysRq (anglicky magic SysRq key) je kombinace kláves, pomocí kterých je možné jádru posílat příkazy bez ohledu na to, v jakém stavu se nachází uživatelské prostředí. Hlavní výhoda SysRq je v tom, že obvykle funguje i v případě zamrznutí prostředí nebo v situaci, kdy si některá aplikace přivlastní vstup z klávesnice a systém na ni přestane reagovat. Dokud jádro běží, je možné s ním takto komunikovat. Až „kernel panic“ zastaví i SysRq.
V takové situaci přichází řada na SysRq, pomocí které můžeme například bezpečně odpojit souborové systémy a restartovat počítač. Zmíněnou klávesu nalezneme obvykle v horní řadě kláves, za klávesou F12. U některých klávesnic je o jednu řadu níže, nebo někde úplně jinde. V každém případě je kombinována s funkci Print Screen. Klávesu najdeme i na noteboocích, kde je její umístění ještě variabilnější. Často je ale pro její stisknutí třeba navíc podržet klávesu Fn.
Aktivace SysRq
Aby bylo možné vůbec funkci klávesy začít využívat, je třeba ji v jádře zapnout. Některé distribuce mají ve výchozím stavu SysRq vypnutou kvůli bezpečnosti. Náhodný návštěvník, který by se dostal ke klávesnici, by totiž mohl začít provádět věci, které nechceme. Mohl by třeba zavřít šetřič obrazovky, který chrání počítač heslem. Pokud SysRq zapnete, dejte pozor na to, kdo se vám dostane ke klávesnici.
Nastavení svého systému zjistíte přečtením příslušného souboru v /proc
:
$ cat /proc/sys/kernel/sysrq
Pokud v něm máte zapsanou jedničku, máte SysRq aktivní. Nula znamená vypnuto. Aktivaci provedete prostým zápisem jedničky do tohoto souboru (samozřejmě jako root).
# echo "1" > /proc/sys/kernel/sysrq
Toto nastavení vydrží ale jen do příštího restartu systému. Pokud chcete, aby bylo permanentní, budete muset konfigurační volbu zapsat do
/etc/sysctl.conf
. To provedete následujícím příkazem:
# sysctl -w kernel.sysrq=1
Pro pokročilé: Je možné také nastavit vyšší hodnotu, která nepovolí kompletní funkčnost SysRq, ale jen některé vlastnosti. Jde o devítibitovou hodnotu, ve které každý bit označuje jednu funkci. Zprava je to: kompletní povolení SysRq (jednička), ovládání logování, ovládání klávesnice, debugování dumpů, sync, remount na read-only, posílání signálů procesům, reboot a změna nice. Kombinací těchto bitů můžete povolit jen konkrétní možnosti. V mém Debianu je ve výchozím stavu nastaveno 438.
Teď už můžeme přejít k tomu hlavnímu: k zasílání příkazů jádru. To se provádí pomocí kombinace tří kláves: Alt+SysRq+příkaz. Nezapomeňte, že jádro předpokládá standardní rozložení QWERTY. Pokud používáte vlastní rozložení, bude jej jádro ignorovat a vy na to nesmíte zapomenout. Jinak budete posílat úplně jiné příkazy, než chcete.
Zamrzlý X server
Pokud zamrzne X server nebo některá aplikace, která vám zablokovala klávesnici, jste od systému odstřiženi. Zbytek systému ale funguje a pokud byste se dostali ke konzoli, můžete problém odstranit. Máte v zásadě dvě možnosti:
Alt + SysRq + r přepne klávesnici z raw módu zpět pod nadvládu jádra. Tím odeberete vládu nad vstupem zlobivé aplikaci. Pak můžete například pomocí Ctrl + Alt + F1 přepnout na textovou konzoli a začít řešit.
Alt + SysRq + k zabije všechny procesy na aktuální virtuální konzoli. Dojde tedy k zavření X serveru včetně všech aplikací, které pod ním běží. Je to podobné jako zaslání signálu pomocí Ctrl + Alt + Backspace, ale SysRq je jistější.
Bezbolestný restart systému
Pokud dojde k větší havárii a vy musíte restartovat počítač, můžete to udělat pomocí SysRq. To vám (na rozdíl od klasického resetu) umožní čistě odpojit souborové systémy, provést na nich synchronizaci a až poté provést reboot.
Někdo si pamatuje jen kombinaci kláves „sub“, tedy Sync, Umount, Boot. Pokud ale chcete předem pozavírat běžící aplikace, je lepší si pamatovat „reisub“. Jednotlivé klávesy jsou:
- r – přepne klávesnici z raw módu a odebere ovládání z X
- e – požádá slušně všechny procesy, aby se vypnuly (SIGTERM)
- i – sestřelí zbývající procesy, které nereagovaly (SIGKILL)
- s – zapíše cache na disky (jako
sync
) - u – odpojí svazky (jako
mount -o remount -r -a
) - b – okamžitý restart
Nejprve samozřejmě stisknete kombinaci Alt + SysRq a poté teprve postupně pomalu namačkáte klávesy „reisub“.
Další možnosti
Samozřejmě to není jediná možnost, existuje řada dalších příkazů, které takto můžete jádru předat. Například se vám mohou hodit:
- Alt + SysRq + n – real time procesům je možné nastavovat nice
- Alt + SysRq + f – zavolá OOM killer, který se zbaví náročné aplikace v paměti
- Alt + SysRq + h – vypíše na terminál nápovědu ke klávesám (dobře se pamatuje)
- Alt + SysRq + 0 – 9 – nastaví úroveň logování na konzoli
- Alt + SysRq + w – vypíše úlohy v nepřerušitelném stavu
- Alt + SysRq + o – vypne počítač
Toto je jen několik příkladů, prakticky každá klávesa na klávesnici posílá nějaký ten příkaz. Ostatní se ale hodí spíše vývojářům jádra než běžným uživatelům. Kompletní možnosti naleznete v dokumentaci jádra v sysrq.txt.
Na závěr ještě jednu zajímavost: SysRq můžete použít i na vzdáleném stroji. Buďto jako v nedávném našem článku Reboot serveru pingem můžete využít iptables a předem se připravit, nebo, pokud se ještě můžete přihlásit, můžete využít rozhraní v /proc
, do kterého jednoduše zapisujete jednotlivé znaky, jako byste je mačkali na klávesnici.
# echo u > /proc/sysrq-trigger
Výše uvedený příkaz odpojí souborové systémy. Znaky samozřejmě posíláte už bez Alt a SysRq.
Zdroje
- Kouzelná klávesa aneb PrintScreen jak ho neznáte
- Use the Magic SysRq Key on Linux to Fix Frozen X Servers, Cleanly Reboot, and Run Other Low-Level Commands
- Dokumentace s linuxovému jádru