Systemd und Systemctl

Systemctl ist das wichtigste Werkzeug zur Kontrolle und Steuerung des Linux-Dienstes Systemd – aber nur eines von vielen. Der Funktionsumfang dieser Tools ist so beeindruckend (und anstrengend) wie der generelle Allmachtsanspruch von Systemd. Der primäre Init-Daemon Systemd herrscht über alle weiteren Systemprozesse und hält für den Benutzer eine ganze Palette von Tools bereit, wie die nachfolgende Liste zeigt:

Eine nähere Auseinandersetzung mit systemd und seinen Steuerungsprogrammen ist mittlerweile alles andere als ein Nischenthema, nachdem fast alle namhaften Linux-Distributionen systemd verwenden, unter anderen Arch, Debian, Fedora (und Red Hat Enterprise sowie Cent OS), Mageia, Mandriva, Opensuse (und Suse Enterprise), Siduction, insbesondere aber auch Ubuntu mit sämtlichen Derivaten (wie Mint, Peppermint, Chromium, Netrunner, Bodhi, Elementary, Zorin…). Dieser Init-Prozess systemd ist allerdings ein Kosmos für sich – ein logischer, aber hochkomplexer mit Allmachtsanspruch, und dabei reichlich verkopft. Von den uferlosen Kommandos und Optionen werden selbst professionelle Administratoren kaum 10 Prozent im Alltag benötigen und höchstens fünf Prozent verinnerlichen. Natürlich ist das gesamte Potential ein Fall für das Terminal, wobei Infobefehle in der Regel mit Benutzerrecht arbeiten, Änderungen jedoch „sudo“ erfordern. Grafische Frontends wenigstens für die allerwichtigsten Funktionen sind in Arbeit, aber bislang ist keines über die Beta-Phase hinausgekommen, weswegen wir dazu auch keine Empfehlung abgeben.

Systemd-Werkzeuge: Eine Übersicht

Der einfachste und fast alternativlose Weg, sich über den enormen Toolbestand von systemd zu informieren, ist der Blick in das Gesamtpaket:

dpkg-query -L systemd

Neben systemctl treffen Sie hier auf eine Armee von Hilfsprogrammen. Eine Auswahl zeigt die nebenstehende Tabelle. Die man-Pages aller systemd-Werkzeuge könnten mühelos eine komplette LinuxWelt füllen – und dabei ist Vieles noch unzureichend kommentiert. Die nachfolgenden Beispiele beschränken sich auf wenige alltagstaugliche Aufgaben.

networkctl

zeigt zunächst nur die Netzwerksschnittstellen. Wenn Sie dort erfahren, dass der Ethernetadapter „eth0″ oder “ enp2s0″ heisst, dann erfragen Sie mit

networkctl status enp2s0

alle Parameter von der IP- und MAC-Adresse bis zu MTU, Speed und Gateway-Adresse (Router) oder noch ausführlicher mit

networkctl status enp2s0 --stats

zusätzlich die gesendeten und empfangenen Bytes. Das eher funktionsarme Kommando hostnamectl zeigt ohne Parameter

hostnamectl

den Hostnamen des Rechners sowie auch einige Basisinfos zu System, Kernel und Architektur. Mit dem Befehl

hostnamectl set-hostname bolide

vergeben Sie umstandslos einen neuen Rechnernamen.

Systemd für Netzwerkabfragen: Hier wie in vielen anderen Belangen haben traditionelle Tools eigentlich ausgedient.

Journalctl:  Dieses Tool ist ein sehr präzises Werkzeug, um das Systemprotokoll zu zeigen, zu filtern und zu bearbeiten. Da eine ungefilterte Ausgabe des Journals uferlos ausfällt, eignen sich zur Analyse folgende Filteroptionen: Die Befehle

journalctl --boot
journalctl --since today

bringt nur die Meldungen seit dem letzten Systemstart beziehungsweise die des heutigen Tages. Nach journalctl –list-boots kann auch jede beliebige Boot-ID mit journalctl –boot [ID] abgefragt werden. Ebenfalls systematisch ist die Eingrenzung nach einem Systemdatum

journalctl --since "2020-09-18"

oder zusätzlich nach einem bestimmten Ereignislevel:

journalctl --priority "crit" --since
"2020-09-18"

Priority-Level wie hier („crit“) können durch ein Schlüsselwort oder durch eine Kennziffer übergeben: „emerg“ (0), „alert“ (1), „crit“ (2), „err“ (3), „warning“ (4), „notice“ (5), „info“ (6), „debug“ (7). Ein Level kumuliert immer alle Meldungen der niedrigeren Stufen, das heißt: „crit“ (2) präsentiert auch die Level 0 und 1.

Wer genau weiß, wo er ein Problem zu suchen hat, kann auch gleich nach dem betreffenden Dienst („unit“) eingrenzen. Die Protokollausgabe von

journalctl --unit apache2.service --since
"2020-08-01"

zeigt alle Meldungen des Apache-Servers ab dem angegebenen Datum.

Nicht zuletzt kann journalctl den Umfang der Systemprotokollierung steuern. Mit

journalctl --disk-usage

fragen Sie die den aktuellen Umfang ab. Befehle wie

journalctl --vacuum-size=300M
journalctl --vacuum-time=30d

können das Journal auf 300 MB reduzieren oder auf die Aufzeichnung der letzten 30 Tage kürzen. Wer dies nicht manuell erledigen will, kann auch die /etc/systemd/journald.conf ändern, um ein solches Limit dauerhaft einzustellen.

Homectl: Dieses hochkomplexe Tool ist ein großes Versprechen, weil es das Home-Verzeichnis portabel macht und etwa auf einem USB-Laufwerk einrichtet:

homectl create linux --real-name="Linux Welt"
--image-path=/dev/disk/by-id/usb-WD_My_Passport_476fff954b2b5c44-0:0

Solche Homes können dann nach Bedarf am System ein- und ausgehängt werden. Alle Probleme bei Dateisystemen und Benutzerrechten sind aber offenbar noch nicht gelöst, sodass homectl derzeit noch auf den allermeisten Distributionen fehlt.

Weitere Beispiele: Ein weiteres systemd-Werkzeug hat gewisse Popularität erreicht, da es Startprobleme, also Verzögerungen des Systemstarts, in aller Präzision offenlegt. Die simpelste Form („time“ kann auch entfallen)

systemd-analyze time

zeigt nur eine knappe Angabe zur Dauer des Systemstarts, differenziert aber bereits Bios/Firmware, Bootloader, Kernel und Benutzerkonto. Die Befehle

systemd-analyze blame
systemd-analyze plot > start.svg
systemd-analyze dump > dump.txt

bringen in unterschiedlicher Darstellung die millisekundengenaue Abfolge des Systemstarts, wobei mindestens die Option „dump“ über das Informationsbedürfnis normaler Anwender deutlich hinausgeht.

Wer sich über die geltenden Systempfade und ihre Funktion informieren will, ist mit dem einfachen Befehl

systemd-path

bestens beraten. Eine ebenfalls vergleichsweise einfache Funktion erfüllt dieses Kommando (Beispiel):

systemd-cat lsblk

Eigentlich ist systemd-cat ein interner Befehl für systemd-Dienste, um an das Systemjournal zu berichten. Der Benutzer kann dies aber auch manuell tun: Die Befehlsausgabe von lsblk würde hier an das Journal angehängt und kann mit journalctl jederzeit wieder abgefragt werden.

Startanalyse mit systemd: Dieser Befehl entwickelt sich zum verbreiteten Standard, um Startverzögerungen von Linux-Systemen zu ermitteln.

Basis-Kommandos von Systemctl

Systemctl ist aktuell das wichtigste und mächtigste Werkzeug von systemd. Die lehrbuchmäßige Syntax folgt – wie bei allen systemd-Tools – diesem Muster:

systemctl Befehl [--Option]

Einige besonders einfache, aber nützliche Systemkommandos wie

systemctl poweroff 
systemctl suspend
systemctl rescue

benötigen keine weiteren Optionen. Typischer ist folgendes konkrete Beispiel:

systemctl list-units --type=service
Gute Übersicht bei geänderten Systemdiensten: Die Spalte „Vendor Preset“ informiert über den Standard der jeweiligen Distribution

Dies liefert eine Übersicht der laufenden und beendeten Dienste. Dieser Befehl ist nicht so weit entfernt vom altgedienten service –status-all, ist aber auch nur ein Vorgeschmack der Möglichkeiten. Der Filter „–type=service“ zeigt schon, dass systemctl eine wesentlich größere Reichweite hat. Weitere „unit“-Klassen sind „socket“, „device“, mount“, „automount“, „swap“, „target“, „path“, „timer“, „snapshot“, „slice“ und „scope“. Das Kommando ohne weitere Filter

systemctl list-units

zeigt alle Systemd-Klassen. Wir müssen uns im Folgenden auf wenige Beispiele zur Dienste-, Target- und Timer-Verwaltung beschränken. Beachten Sie, dass jede einzelne Unit ihre eigene Konfigurationsdatei besitzt, die mit

systemctl edit --full [unit.name]

bearbeitet werden und folglich auch vom Systembenutzer selbst angelegt werden kann.

Target-Units: Um alle geladenen „targets“ aufzulisten, ist dieser Befehl geeignet:

systemctl list-units --type=target --state=loaded

Hier tauchen dann unter anderem „emergency“ oder „rescue“ als inaktive „targets“ auf. Das Kommando

systemctl isolate rescue.target

ist eine gravierende Aktion, da sie ohne Umschweife in die Wiederherstellungskonsole führt und „isolate“ alles beendet, was für das angeforderte „target“-Ziel nicht benötigt wird. Ein weiterer praxisnaher Einsatz von systemd-„targets“ ist der Wechsel vom Desktop- zum Serverbetrieb. Wenn ein Desktop läuft (multi-user.target), aber auf einem Server unnötig ist, dann schaltet

systemctl set-default multi-user.target

die Oberfläche ab und spart damit viel Ressourcen. Der Befehl

systemctl set-default graphical.target

kann den Desktop wieder einschalten.

Service-Units: Die wichtigsten Befehle zur Diensteverwaltung lauten wie folgt:

systemctl status [name].service
systemctl stop [name].service
systemctl start [name].service
systemctl restart [name].service

Diese Kommandos, angewandt etwa konkret auf den Dienst ssh.service, sind weitgehend selbsterklärend. „stop“ und „start,“ oder einfacher „restart“ sind häufig erforderlich, wenn der betreffende Dienst eine Konfigurationsänderung neu einlesen und berücksichtigen soll. Zum nachhaltigen Beenden eines Dienstes ist diese Abfolge einzuhalten:

systemctl stop [name].service
systemctl disable [name].service
systemctl mask [name].service

„disable“ deaktiviert einen Dienst, verhindert aber nicht, dass diesen ein anderer Systemdienst unter der Haube neu aktiviert. Der „mask“-Befehl macht auch dieses unmöglich. Gegebenenfalls kann

systemctl unmask [name].service

den Dienst wieder zugänglich machen.

Diverse Dienste zeigen als Status den Eintrag „static“. Diese lassen sich weder stoppen noch deaktivieren. In dieser LinuxWelt finden Sie im Special „Linux in Tabellen“ auch eine Tabelle mit den typischen Linux-Diensten: Die knappe Übersicht informiert, welche Dienste eventuell entbehrlich sind.

Eingriffe in die Systemdienste sind immer heikel, aber systemctl kann diese nicht nur erledigen, sondern bietet auch gute Kontrolle. Eine hervorragend lesbare Übersicht mit farbigen Markierungen („disabled“ rot, „enabled“ grün) zeigt dieser Befehl, der nicht die Dienste, sondern die darunterliegenden Konfigurationsdateien abfragt:

systemctl list-unit-files --type=service

Zusätzlich zur Farbmarkierung erscheint in der rechten Spalte die Distributionsvorgabe („Vendor Preset“). Somit erkennt man sofort, was am System nachträglich geändert wurde.

Timer-Units: Systemd ist auf dem Weg, zahlreiche alte Zöpfe abzuschneiden. Dienste, Netzwerk, Geräte, Umgebungsvariablen, Mount-Aktionen sind ebenso betroffen wie die alten Cronjobs, denn systemd kann auch zeitgesteuerte Aufgaben übernehmen („timer“). Ganz trivial ist das allerdings nicht, denn damit steckt man mitten in der systemd-Verwaltung. Der Aufbau einer Timer-Unit sieht etwa so aus:

  • [Unit]
  • Description=Backup
  • [Timer]
  • OnCalendar=10:00
  • [Install]
  • WantedBy=basic.target

Die Zeitsteuerung geschieht im Abschnitt “Timer”. Die Beispieleinträge bedeuten, dass der Job „Mein Backup“ täglich um 10 Uhr ausgeführt wird, und die Install-Sektion stellt mit „basic.target“ klar, dass der Job immer ausgeführt werden soll. Nun muss aber unter /etc/systemd/system für jede Timer-Unit (etwa fstrim.timer) eine gleichlautende Service-Unit existieren (fstrim.service). Diese Datei enthält dann als „ExecStart=…“ das Kommando oder Script, das periodisch ausgeführt werden sollen. Diese Datei könnte dann so aussehen:

  • [Unit]
  • Description=Backup
  • [Service]
  • ExecStart=/home/lw/backup.sh

Um einen so definierten Timer interaktiv zu laden, hilft wieder systemctl:

systemctl start backup.timer

Der weitere Befehl

systemctl enable backup.timer

aktiviert die neue Timer-Unit dauerhaft.