Linux Problembehebung im systemd
In diesem Beitrag schauen wir uns an, wie wir auf Linux Debian basierten Systemen mit systemd Problembehebung durchführen, und mit einem Script, mögliche Ursachen herausfinden und erkennen können. Linux läuft in der Regel sehr stabil. Auch die Zeiten von fehlenden Hardwaretreibern gehören fast der Vergangenheit an. Ausnahmen sind immer noch "exotische" Geräte von Herstellern, die ausschließlich auf Windows setzen.
Ebenso kennt Linux (noch) keinen Blue-Screen, der jeden Windowsanwender in Schrecken versetzt.
Allerdings gibt es auch bei Linux immer wieder kleine Stolpersteine: Der Bootvorgang läuft länger als erwartet, ein Programm startet nicht problemlos oder ein neu angeschlossenes Gerät verlangt nach einem nicht installierten Treiber.
Einführung
Glücklicherweise hat nahezu jede neue Linux-Distribution alles an Bord, was es für eine erste Fehleranalyse benötigt: Läuft der Init-Bootprozess über systemd, so haben wir erst einmal alles, was wir benötigen. Systemd ist eine mächtige Programmsammlung, die mittlerweile viele Prozesse steuert. Hierzu gehören z. B. der erwähnte Bootprozess, das automatische Starten von Daemons bzw. Units, die für einen reibungslosen Betrieb von Linux benötigt werden, und das Logging von Prozessen, Aktionen und Fehlern. Genau dieses Logging werden wir uns in diesem Artikel ein wenig näher anschauen.
Einer unsere helfende Freunde heißt hier:
sudo journalctl [Parameter]
sudo systemctl [Parameter]
Diese werden im Terminal ausgeführt, meist mit einem "sudo
" vorangestellt, da ansonsten nur eine Rückmeldung aus dem Userspace erfolgt; die Aussagefähigkeit wäre damit sehr eingeschränkt oder gleich null.
Journalctl ist mittlerweile so mächtig geworden, dass es über 60 und systemctl weit über 100 unterschiedliche Optionen und Parameter kennt. Der Autor dieses Artikels ist oftmals daran verzweifelt, sich auch nur die wichtigsten zu merken. Daher bietet es sich an, für die gängisten Befehlsketten ein kleines Script zu schreiben, das einem diese Gedächtnisleistung abnimmt. Dieses Script liegt hier im Downloadbereich und unterliegt der GNU General Public License, damit könnt ihr es einfach herunterladen, bearbeiten und ergänzen. Die GNU General Public License sieht vor, dass die veränderten Programme der Community auch wieder zur Verfügung gestellt werden.
Also, erweitert gerne das Script oder teile mir Änderungswünsche mit, die ich in eine neue Version einfließen lassen kann.
Vorbereitungen für Problembehebungen via Script
Nun zum Script selber. Am Ende dieses Artikels gibt es eine Schaltfläche. Hierüber könnt ihr es herunterladen. Nach traditionellen Linuxvorgaben werden manuell installierte Programme unter /opt
oder /usr/local/bin
abgelegt. Ich habe mich für die zweite Variante entschieden. Hierzu muss noch der Besitzer und die Berechtigung des Ordners und alle darin enthaltenen Dateien eingerichtet werden. Öffnet dafür ein Terminalprogramm und gebt folgendes ein:
sudo chown [Dein_Benutzername] /usr/local/bin/ -R #Change Owner - Ihr werdet zum Besitzer des Ordners
sudo chmod u+rwx /usr/local/bin/ -R #Change Modification - Der Besitzer hat vollen Zugriff
Legt das Script in diesem Ordner ab. Da es sich tatsächlich um ein Script handelt, müssen wir es noch ausführbar machen:
sudo chmod +x /usr/local/bin/fehlantoo.sh
Ihr könnt es jetzt direkt mit einem Editor wie nano öffnen und euch das Script, bevor ihr es ausführt, genauer anschauen. Der Download Button unten, gibt euch auch eine Vorschau des Scripts aus, bevor ihr es herunterladen könnt. Starten könnt ihr das Script dann mit:
bash /usr/local/bin/fehlantoo.sh
oder etwas anwenderfreundlicher mit einem Mausklick aus dem Desktopmenü. Hierfür benötigen wir einen Menü-Editor, wie z. B. "menulibre". Zum installieren unter einem debianbasiertem (Debian, Ubuntu, Linux Mint und andere) System folgenden Befehl ausführen:
sudo apt install menulibre
Nun führt ihr menulibre im Terminal aus und wählt im linkenen Bereich "System".
Anschließend klickt ihr links oben auf das "+"(Plus)-Zeichen und "Starter hinzufügen". Im rechten Bereich gebt ihr nun folgendes ein (WICHTIG: "Im Terminal ausführen" einschalten):
Sucht euch links oben noch ein nettes passendes Symbol aus. Anschließend klickt ihr im Menü von menulibre auf das Diskettensymbol und der neue Menüeintrag ist gespeichert. Nun könnt ihr das Tool als Menüeintrag öffnen.
Startet ihr das Script, so werdet ihr eine Übersicht der Funktionen des Scripts bekommen:
Mit der Angabe der vorstehenden Zahl und Enter, könnt ihr die entsprechenden Funktionen abrufen, die euch das Script bereitstellt.
Scriptaufbau Erklärung
Ganz am Ende (Zeile 171) liegt der eigentliche Programmstart. Hierüber wird das Auswahlmenü (Zeile 130 - 167) aufgerufen. Je nach Eingabe des gewünschten Auswahlpunktes, springt das Script in die jeweilige Funktion. Die Funktionen finden sich namentlich in der case-Abfrage in den Zeilen 154 - 166.
Wählst Du z. B. den Punkt 1 aus dem Menü an, so erkennt die case-Abfrage, dass das Script zur Funktion "msboot" springen soll.
Die eigentlichen Funktionen befinden sich in den Zeilen 20 - 127, die wir uns nun etwas genauer anschauen.
Kurze grundsätzliche Anmerkungen:
Für eine bessere Darstellung sollte das Terminalfenster vergrößert werden. Anzeigen können mit den Cursortasten gescrollt und grundsätzlich mit "q
" abgebrochen werden.
Funktion "msboot":
Hier hilft uns der Befehl "systemd-analyze blame", um einen zeitlichen Verlauf der geladenen Units des letzten Bootvorgangs aufzuzeigen. Zum Einen lässt sich erkennen, ob eine Unit gestartet wurde, zum Anderen, ob es einen erheblichen zeitlichen Versatz beim Laden einer Unit gibt.
Funktion "kompboot":
Wieder eine Anzeige des letzten Bootvorgangs. Rote Einträge weisen darauf hin, dass Daemons/Units verzögert gestartet wurden (mit zeitlicher Angabe hinter dem "+"). Dies muss nicht unbedingt auf einen Fehler hindeuten, da viele Units erst in Abhängigkeit zu anderen ausgeführt werden und deshalb ihren eigenen Start dadurch verzögern. Liegt der zeitliche Wert allerdings in einem relaiv hohem Bereich, so könnte hier ein Problem vorliegen.
Funktion "letztboot":
Ab hier kommt nun das mächtige "journalctl" ins Spiel. Mit dieser Funktion lässt sich der komplette Bootvorgang zeitlich auflisten. Freundlicherweise arbeitet "journalctl" mit farblichen Darstellungen, so dass Fehlermeldungen rot hervorgehoben werden. Die Funktion bietet zusätzlich noch die Möglichkeit, die Ausgabe nach einem bestimmten Begriff zu filtern. Damit wird die Ansicht wesentlich überschaubarer.
Funktion "letztshutdown":
Funktioniert wie "letztboot", allerdings wird der letzte Shutdown angezeigt.
Funktion "gesternerr":
Diese Funktion zeigt uns alle Fehlermeldungen des Systems seit gestern.
Funktion "echtausgabe":
Wir erhalten eine Ausgabe in Echtzeigt. Diese Funktion ist so mächtig, dass jede kleinste "Bewegung" des Systems aufgezeichnet wird; hierzu zählen auch jede Tastatureingabe und jede Mausbewegung. Da die Ausgabe schnell unübersichtlich werden kann, wird zur Vereinfachung die Anzeige in eine Datei ("Echtzeit.log") umgeleitet, die im /home-Verzeichnis des Benutzers liegt. Diese kann nach Beendigung der Funktion in Ruhe durchgeschaut werden.
Nützlich ist diese Funktion, wenn z. B. ein neues Gerät an den Rechner angeschlossen wird, welches nicht korrekt erkannt wird. Ebenso ist es sehr dienlich bei Programmen, die fehlerbehaftet starten oder gar nicht starten.
Achtung: Dies ist die einzige Funktion, die mit Strg+c
abgebrochen wird!
Funktion "instdienste":
Zeigt die Zustände aller installierten Daemons/Units in tabellarischer Darstellung an. Hierfür wird der Befehl "systemctl" verwendet.
Funktion "detaildienst":
Möchte man das Startverhalten eines Dienstes/Unit seit gestern genauer betrachten, so hilft diese Funktion weiter. Hierfür wird die genaue (!) Bezeichnung dieser Unit benötigt, welche man aus der Funktion "instdienste" (siehe oben), also Menüpunkt 7, erhält. Am besten kopiert ihr euch den exakten Namen der Unit und fügt ihn dann hier als Filterkriterium ein.
Funktion "beenden":
Diese Funktion beendet sauber das Script.
Fazit
Das Script wird sicherlich nicht jeden Fehler aufspüren, kann aber bei der ersten Analyse äußerst hilfreich sein. Der Autor hat hiermit oftmals sehr schnell Fehler auf unterschiedlichen Systemen eingrenzen und ermitteln können.
Ist das Problem erst einmal lokalisiert, hilft die bevorzugte Suchmaschine im Internet weiter, um an die Beseitigung zu gehen. Oftmals ist die Ursache ganz banal, wie z. B. ein fehlender Treiber.
In nicht seltenen Fällen sind die angezeigten Fehlerangaben aber auch obsolet, da es um nicht systemkritische Fehler (z. B. veraltete oder nicht benötigte Hardware) handelt. Hier müsst ihr selber entscheiden, inwieweit ihr an die Beseitigung gehen möchtet oder ob ihr mit dieser Fehlermeldung leben könnt.
Ziemlich cooler Script, spart Zeit, Nerven und Gehirnzellen. Beinhaltet so ziemlich alles was man für eine anständige Fehleranalyse so benötigt.
Danke dafür!
Danke, das freut mich sehr. Mein nächster Gastbeitrag (Thema „Android) ist bereits in Bearbeitung und wird wieder ein nettes Script enthalten. Also, ab und zu mal in die Beiträge schauen.