Ich hatte neulich mal wieder das Problem, daß mir ein Server quasi unter den Händen abgestürzt ist (keine Sorge: es war kein Kundenserver) und ich per SSH nicht so recht wußte, wie ich ihn noch halbwegs geordnet neustarten kann, da er auf Befehle wie reboot
und shutdown -r now
bereits nicht mehr reagierte, bzw. diese blockiert wurden. In diesem Moment wünschte ich mir am Server zu sitzen und ihn über die Tastatur mit SysRQ neustarten zu können. Eine flinke Suche mit Google später wußte ich, daß ich SysRQ auch über eine Konsole oder gar SSH auslösen kann, indem ich nach /proc/sysrq-triger
schreibe. Nachdem mir also mit SysRQ wiedereinmal geholfen war und ich diese Funktion inzwischen sehr schätze, habe ich das zum Anlaß genommen, hier mal etwas darüber zu schreiben:
SysRQ ist ein viel zu unbekanntes Feature des Linux-Kernels. Hinter dem etwas sperrigen Namen verbirgt sich die Fähigkeit des Kernels, über bestimmte Tastenkombinationen direkt Notfall- und Debuggingbefehle entgegenzunehmen. (In der offiziellen Dokumentation wird auch gerne von magischen Tastenkombinationen gesprochen. Da ich auf das Wort Magie im Zusammenhang mit Software allergisch reagiere — dahinter verbirgt sich meiner Erfahrung nach fast nie etwas so geniales und nützliches wie SysRQ — lasse ich diese Umschreibung hier mal unter den Tisch fallen.)
Wenn man z.B. bemerkt wie einem ein lausiger Graphikkartentreiber eines der beiden großen Weltmarktführer das System in den Abgrund reißt, dann kann man mit SysRQ versuchen den Schaden zu minimieren, etwa indem man den laufenden Programmen befielt sich zu beenden, den Kernel anweist die Dateisystemcaches zu leeren (in anderen Worten: die darin vorhandenen Daten auf die Festplatten zu schreiben) und die Dateisysteme zu unmounten bzw. schnell read only zu remounten. Das ganze ist auch sehr nützlich, wenn ein System aus anderen Gründen kaum noch oder gar nicht mehr zu reagieren scheint. Ein Versuch lohnt sich allemal, denn ein kontrollierter Absturz ist immer noch besser als ein unkontrollierter.
Ob SysRQ auf einem System aktiviert ist kann man sehr leicht mit folgendem Befehl abfragen:
cat /proc/sys/kernel/sysrq
Lautet die Antwort 0
ist SysRQ ausgeschaltet, lautet sie 1
ist es aktiviert.
Dementsprechend kann man es sehr leicht einschalten:
echo 1 > /proc/sys/kernel/sysrq
und ebenso leicht ausschalten:
echo 0 > /proc/sys/kernel/sysrq
Will man es dauerhaft einschalten, sollte man in seiner /etc/sysctl.conf
die Zeile
kernel.sysrq = 1
eintragen, bzw. eine eventuell schon vorhandene Zeile für kernel.sysrq
entsprechend anpassen.
(Dauerhaft ausschalten geht wieder mit kernel.sysrq = 0
.)
Hat man SysRQ aktiviert, muß man sich damit befassen wie man es auslösen kann. Auf typischen PCs mit normalen Tastaturen mit deutschem Layout ist die Tastenkombination für SysRQ Alt+Druck
. Den meisten PC-Besitzern und Laptop-Usern sollte damit geholfen sein, es gibt aber gerade in letzter Zeit immer mehr Modelle, bei denen die Druck-Taste nicht direkt vorhanden ist (also etwa nur durch zusätzliches Halten einer fn
-Taste oder dergleichen ausgelöst werden kann, z.B. bei Netbooks) oder ganz fehlt (z.B. bei den Intel-basierten MacBooks und MacBookPros von Apple – die alten PowerBooks und iBooks mit PPC hatten SysRQ nur auf einer anderen Taste). Das ist sehr ärgerlich und es gibt keine wirklich guten Lösungen für dieses Problem. Mit einer Xmodmap ist einem nicht geholfen, da sie nur für den X-Server und nicht für den Kernel gilt. Mit den in der offizellen Dokumentation empfohlenen Tools showkey
und setkeycodes
ist einem nur bei PS/2-Tastaturen geholfen (die meisten Laptops binden Tastaturen schon lange per USB an) und den Treiber für USB-Tastaturen werden nur die wenigsten Leute selbst patchen wollen. Wenn ich jemals einen Weg finde, der auch mit modernen USB-Tastaturen funktioniert, wird mir das hier garantiert einen weiteren Artikel wert sein.
Immerhin: Es gibt eine Methode, die auf jeder Architektur und Tastatur funktioniert: Wenn man auf dem System eine Konsole offen hat (zur Not tut es auch eine Verbindung per SSH, auch wenn man dann vorsichtig sein sollte, welche SysRQ-Befehle man sendet), dann kann man den entsprechenden SysRQ-Befehl in /proc/sysrq-trigger schreiben, etwa so:
echo s > /proc/sysrq-trigger
Für die Freunde der Seriellen Konsole gibt es noch die Möglichkeit einen BREAK zu senden und binnen 5 Sekunden einen SysRQ-Befehl hinterher.
Nun zu den SysRQ-Befehlen:
Die Tastenkombination Alt+SysRQ
und die anderen Wege um SysRQ auszulösen allein genügen nicht, man muß sie immer mit bestimmten Befehlen kombinieren, die über Buchstabentasten abgekürzt sind (bzw. man muß bei seriellen Verbindungen den jeweiligen Buchstaben binnen 5 Sekunden nach einem BREAK schicken oder über proc
den Buchstaben eingeben).
Einige SysRQ-Befehle sind nur für Entwickler interessant, wer sich damit beschäftigen möchte, dem empfehle ich die oben verlinkte offizielle Dokumentation. Hin und wieder kommen auch neue Befehle hinzu und ganz selten verändern Befehle ihre Funktion. Wer wissen möchte welche SysRQ-Befehle sein Kernel unterstützt, kann es mit Alt+SysRQ+h
leicht herausfinden. Die für die allgemeine Benutzung nützlichsten Befehle sind:
Tastenkombination | Funktion |
---|---|
Alt+SysRQ+b | System wird sofort, ohne Leerung der Dateisystemcaches und ohne Unmount der Dateisysteme neugestartet (es sei denn, man hat vorher genau diese Schritte selbst ausgeführt). |
Alt+SysRQ+e | Allen Prozessen außer init wird das Signal SIGTERM gesendet und damit gesagt, daß sie sich beenden sollen. |
Alt+SysRQ+f | Ruft eine Funktion auf, die versucht arg Speicher fressende Prozesse zu beenden. |
Alt+SysRQ+h | Gibt eine Liste der unterstützten SysRQ-Befehle aus (genau genommen wird jede für SysRQ unbelegte Taste diese Liste ausgeben, aber mit h kann man nicht verkehrt liegen). |
Alt+SysRQ+i | Allen Prozessen außer init wird das Signal SIGKILL gesendet und damit befohlen, daß sie sich jetzt zu beenden haben. |
Alt+SysRQ+j | Es wird versucht, festgefahrene Dateisysteme zu unmounten – auf eher rabiate Weise. |
Alt+SysRQ+o | System wird per ACPI bzw. APM ausgeschaltet, wenn es das unterstützt. |
Alt+SysRQ+r | Versetzt die Tastatur in den RAW Modus, nützlich wenn Graphiktreiber oder der X-Server ärger machen. |
Alt+SysRQ+s | Es wird versucht alle gemounteten Dateisysteme auf die Festplatten zu synchronisieren, z.B. durch Leerung der Dateisystemcaches. So können Daten gerettet werden die von Programmen zwar schon geschrieben wurden, vom Betriebssystem aber noch nicht abschließend auf die Festplatte geschrieben wurden. |
Alt+SysRQ+u | Es wird versucht alle gemounteten Dateisysteme in den read only Modus zu versetzen. |
Von diesen Befehlen ausgehend haben sich mit der Zeit ein paar Rezepte durchgesetzt, deren Benutzung zum halbwegs kontrollierten Neustarten eines abstürzenden Systems empfohlen wird. Die häufigsten Varianten sind REISUB
oder RSEISUB
, für die es die Merksätze „Raising Elephants Is So Utterly Boring“ und „Raising Skinny Elephants Is So Utterly Boring“ gibt (für REISUB
gibt es noch die Eselbrücke, daß es das englische Wort busier rückwärts geschrieben ist). Von dem Merksatz mit den Elephanten leitet sich auch die Bezeichnung „raising elephants“ für das Benutzen von SysRQ ab.
Man sollte nach dem Absetzen jedes Befehls einen Moment warten und dem System Zeit zum Handeln lassen, insbesondere nach den Befehlen Alt+SysRQ+E
, Alt+SysRQ+I
und vor dem Befehl Alt+SysRQ+B
.
Um es nochmal am Bespiel zu erklären, die Befehlsfolge RSEISUB
hat zur Folge, daß zunächst die Tastatur in den RAW-Modus versetzt wird und ein weiterer Zugriff auf den Kernel über die Tastatur damit sichergestellt ist. Dann werden die Dateisysteme auf die Festplatten synchronisiert. Als nächstes werden alle laufenden Prozesse außer init freundlich aber bestimmt mit dem Signal SIGTERM dazu aufgefordert sich zu beenden. Wer sich einige Sekunden später immer noch nicht beendet hat, wird mit SIGKILL auf die harte Tour beendet. Dann folgt eine weitere Synchronisation der Dateisysteme auf die Festplatten (damit von den Programmen beim Beenden geschriebene Daten und Logs auch auf der Platte landen). Schließlich werden die Dateisysteme in den read only Modus gebracht und nachdem ihnen so nichts mehr passieren sollte, wird das System ohne weiteres Federlesen neugestartet.
Wenn man diese Schritte befolgt, kann man mit etwas Glück Datenverlust vermeiden und sich oft sogar das lästige Überprüfen der Dateisysteme sparen. (Wenn Synchronisation und Remount im read only Modus geklappt haben, sollten Dateisysteme keinen Schaden davontragen beim Reboot. Sollte das System beim Neustart trotzdem auf einer Überprüfung der Dateisysteme bestehen, dann sollte man es gewähren lassen.)
> Wenn ich jemals einen Weg finde, der auch mit modernen USB-Tastaturen funktioniert, wird mir das hier garantiert einen weiteren Artikel wert sein.
Möglicherweise gibt es den. Hast du dir einmal /proc/sys/kernel/sysrq-key angesehen? Dort scheint ein Keycode hinterlegt zu sein. Wenn man den ändert…