Systemd - Linux steuern

Systemd

Mit Systemd steuern Sie die Dienste Ihres Linux-Systems nach Ihren Wünschen

Informationen

Systemd ist das neue Init-System unter Linux und hat vor allem bei der Einführung unter Debian GNU/Linux großen Wirbel ausgelöst, vor allem dadurch das Systemd so ziemlich alles rund um das System kontrolliert – manche meinen auch das durch Systemd das vor allem von Red Hat – einer kommerziellen Linux-Distribution – eine einzige Firma zu viel Kontrolle über Linux erhält. Doch Systemd ist open Source – mehr muss man dazu denke ich nicht sagen.

Nun was ist Systemd? Dazu muss man ein wenig in die Vergangenheit zurück greifen, die Dienste unter Linux sind ziemlich zahlreich, dazu zählen der Start von System-Diensten wie auch von Software wie etwa der Apache-Webserver oder auch Log-Dienste und vieles mehr. In der Vergangenheit nutzte man das so genannte Init-Protokoll, ein System das jeden dieser Dienste der Reihe nach und in folge auch nach Abhängigkeiten gestartet hatte, dies dauerte natürlich seine Zeit. Systemd wiederum kann mehrere Dienste zur selben Zeit starten und noch dazu ohne auf Abhängigkeiten zwischen Diensten zu achten, dies beschleunigt den Prozess des Startens des Betriebssystems massiv. So startet ein aktuelles Debian in rund 7 bis 8 Sekunden in einen voll funktionsfähigen Desktop.

Durch die Einführung von Systemd haben sich aber auch so einige Befehle rund um das System geändert (die meisten alt bekannten funktionieren zwar immer noch, werden aber langsam und sicher durch die neuen ersetzt). Hier muss man gleich einmal beschreiben das der einfache Nutzer damit nichts zu tun hat, mit Systemd kommen eigentlich nur Administratoren in Verbindung die mehr als nur einen normalen Desktop-Rechner haben wollen. Nun, die wichtigsten Befehle aus diesem neuen Init-System wollen wir jetzt ein wenig näher kennen lernen.

Dienste anzeigen

Als erstes möchte der Administrator – root natürlich wissen welche Dienste auf seinem System laufen, wichtig – Systemd nutzt nur der Nutzer “root”. Um sich nun alle laufenden Dienste anzusehen nutzt man auf dem Terminal:

systemctl
Systemd – Steuerzentrale für Linux

Systemd – Steuerzentrale für Linux

Somit wird eine Übersicht über alle laufenden Dienste angezeigt, mit der Eingabe-Taste oder mit den Pfeil-Tasten (rauf / runter) blättert man weiter. Hierbei zeigen sich jedoch nicht nur Dienste – mit der Endung “.service” sondern auch noch einige weitere, so etwa “.device” das mit Geräte-Dateien arbeitet, “.mount” das Partitionen einhängt, “.socket” das Verbindungen zwischen einzelnen Prozessen her stellt und “.timer” das ähnlich wie Cron Aufgaben erledigen kann. Es gibt noch einige weitere mit denen der einfach Nutzer jedoch wenig zu tun hat. Hinter jedem Dienst steht eine kurze Status-Meldung sowie eine kurze Beschreibung wozu der Dienst eigentlich gut ist. Mittels der Taste q wird die Ansicht beendet.

Ist uns diese Übersicht über alles möglich zu viel lassen wir uns nur die eigentlichen Dienste anzeigen, dazu nutzt man die Option “--type=” und den gewünschten Begriff, in unserem Fall also “service“:

systemctl --type=service
Systemd – Steuerzentrale für Linux

Systemd – Steuerzentrale für Linux

Automatischen Start von Diensten aktivieren / deaktivieren

Da es ein Init-System ist lassen sich damit natürlich auch beliebige Dienste aktivieren und deaktivieren, als kleines Beispiel hat sich der Nutzer den Apache-Webserver installiert um Webseiten zu testen bevor er sich diese auf den Server tatsächlich in das Internet stellt. So benötigt er den Server natürlich nur dann wenn er auch wirklich Seiten testen will.

Im Beispiel habe ich nun Virtualbox installiert um andere Linux-Systeme auszuprobieren, brauche ich natürlich nur dann wenn ich solche auch gerade probieren will, ich sehe mir also mit einem der voran gegangenen Befehle an wie sich der Dienst nennt – in diesem Fall “virtualbox.service“, damit dieser nicht automatisch mit dem System startet – also extra Strom vom Akku benötigt nutze ich “systemctl disable” inklusive den gewünschten Dienst – also:

systemctl disable virtualbox.service

Möchte ich den Auto-Start mit dem System dann doch wieder aktivieren nutzt man statt “disable” natürlich “enable“:

systemctl enable virtualbox.service

Dienste stoppen, starten, neu starten

Hat man einen Dienst für den Auto-Start deaktiviert und benötigt diesen muss man diesen natürlich starten können, dies läuft ganz einfach, etwa frei nach meinem Beispiel oben:

systemctl stop virtualbox.service

Will man ihn wieder stoppen ersetzt man “start” durch “stop” oder für einen Neustart (etwa weil man die Konfiguration geändert hat) “restart” oder “reload” um nur die Konfiguration neu einzulesen.

Status von Diensten genauer ansehen

Ganz oben haben wir schon gesehen das Systemd eine kurze Status-Meldung zu jedem Dienst in der Übersicht anzeigt, wie schon beschrieben ist diese Meldung schon sehr kurz. Um sich diese Meldung etwas genauer anzusehen nutzt man einfach – nach meinem kleinen Beispiel:

systemctl status virtualbox.service
Systemd – Steuerzentrale für Linux

Systemd – Steuerzentrale für Linux

Zustand des Systems ändern

Mittels Systemd lässt sich natürlich wie es sich gehört auch der Zustand des Systems ändern, so etwa durch “poweroff” herunter fahren, durch “reboot” neu starten, durch “suspend” in Bereitschaft versetzen und durch “hibernate” in den Ruhezustand versetzen, als kleines Beispiel:

systemctl poweroff

Log-Dateien anzeigen

Log-Dateien sind unter Linux natürlich ein besonderes Thema, das System ist freizügig und meldet eigentlich so ziemlich alles, angefangen bei Fehlern, positive Geschichten, wenn die Firewall jemanden ausgebremst hat oder auch nur wenn man ein Gerät anschließt. Auch hier zeigt Systemd alles was der Nutzer brauchen könnte.

Das komplette Log anzeigen

Folgender Befehl zeigt alles was das ganze System inklusive Kernel seit dem letzten Start des Systems aufgezeichnet hat:

journalctl -b

Es beginnt mit dem ersten Log das aufgezeichnet wurde, mittels der Eingabe-Taste oder der Pfeil-Nach-Unten-Taste scrollt man weiter. Mittels der Taste q kommt man direkt wieder an den Eingabe-Prompt.

Das komplette Log rückwärts

Wie der letzte Befehl, jedoch in umgekehrter Reihenfolge – das letzte Log wird also zuerst angezeigt:

journalctl -b -r

Log live betrachten

Die wohl gebräuchlichste Methode die früher durch den Befehl “tail -f /var/log/messages” genutzt wurde, neue Log-Meldungen werden live angezeigt:

journalctl -f

Mittels der Tastenkombination “Strg + c” beendet man die Ausgabe wieder.

Nur Log-Dateien des Kernels anzeigen

Bisherige Befehle zeigten alle Log-Meldungen des kompletten Systems an, folgende Option zeigt nur solche des Kernels an – damals nutzte man “dmesg”:

journalctl -k

Meldungen ab einem bestimmten Datum anzeigen

Um sich die Meldungen ab einem bestimmten Tag anzuzeigen gibt man dieses einfach nach der Syntax “JJJJ-MM-TT HH:MM:SS” an, also etwa:

journalctl --since 2016-05-12 14:00:00

Meldungen nach Priorität anzeigen lassen

Zu jeder Log-Meldung in den Log-Dateien wird die Priorität hinzu gefügt, natürlich kann man sich auch nur gewünschte anzeigen lassen. Die Prioritäten: emerg, alert, crit, err, warning, notice, info und debug:

journalctl -p err

Ältere Log-Dateien anzeigen

Standardmäßig erhält man nur die Logs seit dem letzten Start des Systems, außer man gibt etwa das Datum an. Kennt man jedoch nicht das Datum hat man natürlich Probleme – nein, es gibt eine weitere Möglichkeit. Mittels:

journalctl --list-boots

erhalten Sie eine Liste aller System-Starts seit der Installation:

Systemd – Steuerzentrale für Linux

Systemd – Steuerzentrale für Linux

Vor jedem Eintrag sehen Sie eine Nummer, ganz hinten das Datum und Uhrzeit wie lange das Log läuft. Als Beispiel möchte ich mir nun die Nummer “9” ansehen:

journalctl -b 9

Log-Dateien nach Begriffen durchsuchen

Auch die Möglichkeit die Ausgaben von Log-Dateien zu durchsuchen besteht natürlich noch immer. Wie damals übergibt man die Ausgabe per Pipe “|” ganz einfach an Grep. Im Beispiel möchte ich ganz einfach nach Einträgen von “modem” suchen:

journalctl -b | grep -i modem

Runlevel ändern

Es gibt unter Linux fünf Runlevel, Runlevel “0” bedeutet das System ist abgeschaltet oder fährt dieses herunter, Runlevel “1” – hier läuft das System ohne grafische Oberfläche und ohne Netzwerk (gut für Wartung) des Systems, Runlevel “2” ist derzeit nicht besetzt, “3” ist ebenfalls noch ohne grafische Oberfläche jedoch mit Netzwerk – etwa ideal um manuell proprietäre Grafikkarten-Treiber zu installieren (NVIDIA) auch Server und dergleichen laufen hier schon, Runlevel “5” ist der Standard-Modus – also mit grafischer Oberfläche und Netzwerk, Runlevel “6” startet das System wiederum neu.

Den Runlevel wiederum ändert man im nicht eingeloggten Zustand, also am Login-Bildschirm, man wechselt auf das virtuelle Terminal mit der Tastenkombination “Strg + Alt + F1” und nutzt nun den Befehl:

systemctl isolate runlevel3.target

Die restlichen Runlevels wären also “runlevel1.target runlevel2.target runlevel4.target runlevel5.target runlevel6.target“.

Seit Systemd gibt es nun auch weitere Runlevel – welche dies sind zeigt der Befehl:

systemctl list-units --type=target

Eine Beschreibung findet sich gleich inbegriffen, jedoch finden sich hier unsere alten Runlevels nicht mehr:

Systemd – Steuerzentrale für Linux

Systemd – Steuerzentrale für Linux

Der Beschreibung nach erkennt man jedoch deren Sinn – unser Runlevel 5 wäre in diesem Fall der Runlevel “multi-user.target“.

Journal-Größe ändern

Wie wir nun schon wissen loggt Systemd alles seit der Installation des Systems. Das Log wächst somit natürlich mit der Zeit und verschlingt immer mehr Platz. Die Größe des Logs lässt sich natürlich in Grenzen halten. Dazu editiert man als Administrator die Datei “/etc/systemd/journald.conf“. Hier sucht man die Zeile:

#SystemMaxUse=

Man entfernt die Raute (#) und fügt die gewünschte Größe in Megabyte an, etwa für 512MB:

SystemMaxUse=512M

Nach einem Neustart des Systems sind die Einstellungen aktiv.

Selbst Log’s erstellen

Möchte man selbst Log-Meldungen einfügen, etwa bei der Ausführung von eigenen Scripts ist auch dies problemlos möglich. Die nötigen Zeilen:

echo 'Ihre gewünschte Meldung' | systemd-cat -t someapp -p info

Statt “Ihre gewünschte Meldung” geben Sie den gewünschten Text ein. Kleines Beispiel als Ausgabe für diese Zeile im Log:

Aug 10:06:26 rechner-name someapp[Prozess-ID]: Ihre gewünschte Meldung

Statt “info” lässt sich auch “warning” einsetzen was jedoch die selbe Zeile erzeugen würde aber auch “emerg” was schon eine eindringlichere Meldung erzeugen würde:

Broadcast message from systemd-journald@rechner-name (Mo 2016-08-08 10:06:26 CEST): someapp[Prozess-ID]: Ihre gewünschte Meldung

“someapp” ersetzen Sie wenn gewünscht ganz einfach durch den Namen Ihres Scripts.

Bootcharts und ähnliches

Systemd beinhaltet natürlich auch nötige Software um sich diverse Charts anzusehen um etwa den Start des Systems zu optimieren oder Probleme zu finden. Das nötige Kommando nennt sich dazu “systemd-analyze“

Zeit anzeigen bis das System benutzbar ist

Die folgende Option zeigt an wie lange das System benötigt hat bis es tatsächlich benutzbar wurde, also vollständig bereit ist:

systemd-analyze
Systemd – Steuerzentrale für Linux

Systemd – Steuerzentrale für Linux

Start-Zeit der einzelnen Komponenten anzeigen

Um sich die Zeit anzusehen die die einzelnen Komponenten zum Start benötigt haben nutzen wir:

systemd-analyze blame
Systemd – Steuerzentrale für Linux

Systemd – Steuerzentrale für Linux

Start-Zeit nach Abhängigkeiten ansehen

Ja, man muss auch zu geben das es unter Systemd einige Abhängigkeiten unter den einzelnen Diensten gibt, wollen wir uns also ansehen welche Dienste auf andere warten mussten um tatsächlich gestartet zu werden:

systemd-analyze critical-chain
Systemd – Steuerzentrale für Linux

Systemd – Steuerzentrale für Linux

Die ganze Geschichte grafisch ausgeben

Diese ganze Geschichte lässt sich natürlich auch grafisch ausgeben – jedoch nur im SVG-Format, die Datei lässt sich jedoch in jedem Webbrowser öffnen. Als Beispiel möchte ich die Datei “speed.svg” erstellen:

systemd-analyze plot > speed.svg