Beim Wettstreit zwischen dem klassischen Init und dem recht jungen Systemd trifft jahrzehntelang gewachsene Technik auf neue Konzepte.
Direkt nach dem Booten des Kernels startet ein Dienst, der das restliche System und den weiteren Betrieb bis zum Herunterfahren begleitet. Er trägt stets die Prozess-ID 1 und hörte bislang auf Linux-Rechnern in der Regel auf den Namen init; das System dahinter nannte sich SysVinit [1]. Mit Systemd [2] drängt ein neues Programm an die gleiche Stelle. Allerdings gibt sich der Neue nicht immer gleich zu erkennen: Mit einer Abfrage über den Prozessstatus-Monitor Ps ermitteln Sie, ob das System den klassischen Init oder Systemd benutzt.
Mit den oft genutzten Optionen ax des Ps-Kommandos erhalten Sie allerdings auf einem von Systemd verwalteten Rechner nicht die korrekte Ausgabe (Listing 1, erste Abfrage). Erst wenn Sie die Option -e verwenden, liefert Ps ein korrektes Ergebnis (zweite Abfrage). Dasselbe gilt für ein System, das SysVinit benutzt (dritte Abfrage). Pstree liefert grundsätzlich eine zutreffende Ausgabe.
Listing 1
$ ps -ax | head -2
PID TTY STAT TIME COMMAND
1 ? Ss 0:01 /sbin/init
$ ps -e | head -2
PID TTY TIME CMD
1 ? 00:00:01 systemd
$ ps -e | head -2
PID TTY TIME CMD
1 ? 00:00:00 init
Old School
Linux und artverwandte Systeme unterscheiden verschiedene Systemzuständen, die sogenannten Runlevel, denen gegebenenfalls Dienste (Daemons) zugeordnet sind. Die Tabelle “Runlevel” zeigt die für ein Linux-System typischen Zustände. Bis auf S erhalten dabei alle einen numerischen Wert zwischen 0 und 6. Die Runlevel von 2 bis 5 dienen je nach Distributionen unterschiedlichen Zwecken.
Runlevel
| Wert | Vorgang |
|---|---|
0 |
kontrolliertes Beenden aller Prozesse, anschließendes Abschalten |
S |
Single-User für root, ohne Netzwerk, Zugriff nur über Konsole |
1 |
Single-User ohne Netzwerk, Zugriff nur über Konsole |
2 bis 5 |
Mehrbenutzerbetrieb; Zugriff, Netzwerkzugriff und GUI distributionsspezifisch |
6 |
kontrollierter Neustart |
Welchen Runlevel das System beim Start standardmäßig anstrebt, können Sie der Datei /etc/inittab entnehmen; Listing 2 zeigt den entsprechenden Ausschnitt. Der Standard-Runlevel (initdefault) steht in der Zeile, die mit id beginnt – im Beispiel startet das System also in den Runlevel 2.
Listing 2
# The default runlevel. id:2:initdefault: # Boot-time system configuration/initialization script. # This is run first except when booting in emergency (-b) mode. si::sysinit:/etc/init.d/rcS # What to do in single-user mode. ~~:S:wait:/sbin/sulogin
Vor dem Standard-Runlevel durchläuft das System den Single-User-Modus (si:), ausgenommen bei Störungen während des Boot-Vorganges. Einen wichtigen Eintrag finden Sie in der letzten Zeile von Listing 2: Damit das System im Modus für Einzelbenutzer überhaupt funktioniert, führt Init einen automatischen Login für root aus.
Alles auf Start
Der Init-Prozess ruft die zum jeweiligen Runlevel gehörenden Start- und Stop-Skripte auf, um den gewünschten Zustand herzustellen. Bei Debian-basierten Systemen finden Sie diese unter /etc/init.d. Das Paketmanagement einer Distribution legt diese Skripte bei der Installation eines Diensts in der Regel an. Müssen Sie doch einmal ein solches Skript von Hand erstellen, sollten Sie sich an bereits existierende Dateien als Muster halten. Ändern Sie die Konfiguration eines Diensts, erlaubt es ein solches Skript, den Daemon zu stoppen und wieder zu starten oder den Status abzufragen (Abbildung 1). Die gewünschte Aktion – start, stop oder status – geben Sie beim Aufruf mit an.

Abbildung 1: Stoppen, Starten und den Status eines Dienstes abfragen – mittels Init-Skript brauchen Sie dazu nur das passende Schlüsselwort als Parameter.
Richtig abgelegt
Alle im Folgenden angegebenen Pfade beziehen sich auf Debian und verwandte Systeme. Andere Distributionen verwenden oft alternative Verzeichnisse.
Für jeden Runlevel existiert ein eigenes Verzeichnis, in dem sich Links befinden, die nach /etc/init.d/Skript zeigen. Der Name des symbolischen Links beginnt bei einem Startskript mit einem S, ein führendes K kennzeichnet das Skript zum Beenden (“Kill”). Es folgt eine Nummer, die die Reihenfolge bestimmt, in der das System die Skripte abarbeitet. Installieren Sie Dienste per Paketmanagement, erhalten die Links die passenden Namen; bei selbst kompilierten Programmen müssen Sie selbst Hand anlegen, auch hinsichtlich der Reihenfolge. So funktioniert beispielsweise ein Webserver erst dann ordnungsgemäß, wenn das Netzwerk bereits läuft.
Im klassischen Init-System von Debian liegen unter /etc die Verzeichnisse für die Runlevel: rc0.d, rc1.d, rc2.d, rc3.d, rc4.d, rc5.d, rc6.d und rcS.d. Bei Debian 7 enthalten rc3.d, rc4.d und rc5.d fast identische Daten wie rc2.d, kommen aber in der Regel nicht zum Einsatz. Sie bieten damit die Möglichkeit, eigene Vorstellungen zu verwirklichen [3].
Das Skript für den Dienst atd liegt auf einem solchen System mit gleichem Namen unter /etc/init.d. Unter /etc/rc2.d befindet sich der Link S15atd für den Start. Die Links, die der Init-Prozess aufruft, um diesen Daemon zu beenden, liegen in mehreren Verzeichnissen: rc0.d, rc1.d und rc6.d und heißen jeweils K01atd.
Konfiguration
Die Datei /etc/inittab definiert nicht nur das Standard-Runlevel, sondern steuert das Verhalten des Systems auch über weitere Einträge, die in der folgenden Form vorliegen:
id:Runlevel(s):Aktion:Kommando
Das erste Feld bezeichnet den Eintrag eindeutig und einmalig. Im zweiten Feld führen Sie einen oder mehrere Runlevels auf, für die der Eintrag gilt. Bei mehreren Einträgen sortieren Sie diese aufsteigend. Das dritte Feld gibt die Art der gewünschten Aktion an, deren Bedeutung die Tabelle “Aktionen” aufführt.
Aktionen
| Aktion | Bedeutung |
|---|---|
initdefault |
Standard-Runlevel |
respawn |
Wurde der angegebene Prozess beendet, startet das System das Programm neu |
wait |
Init wartet beim Wechsel des Runlevels das Ende des angegebenen Prozesses ab |
ctrlaltdel |
Aktion für die Tastenkombination [Strg]+[Alt]+[Entf] |
boot |
Aktion nur beim Start, nicht beim Wechsel des Runlevels ausführen |
once |
Aktion einmalig beim Erreichen des angegebenen Runlevels ausführen |
powerwait |
Bei vorhandener USV Prozess bei Stromausfall starten. |
powerfail |
Bei vorhandener USV Prozessende des aufgerufenen Programms nicht abwarten. |
powerfailnow |
Bei vorhandener USV System herunterfahren, sobald die USV leere Batterien meldet. |
powerokwait |
Bei vorhandener USV Ende des Prozesses des aufgerufenen Programms abwarten, sobald Netzverbindung wiederhergestellt ist. |
In Listing 3 finden Sie einen weiteren Auszug aus /etc/inittab. Zu Beginn steht die Anweisung, den Durchlauf des Skripts /etc/init.d/rc für den angegebenen Runlevel abzuwarten. Zeile 12 definiert, was beim Drücken von [Strg]+[Alt]+[Entf] geschehen soll – in diesem Fall für alle Runlevel außer 0 und 6 ein Neustart des Rechners. Die Einträge pf, pn und po regeln, wie das System beim Stromausfall bei vorhandener USV reagiert.
Der Block ab Zeile 33 aktiviert die Konsolen. Die erste (tty1) kommt in den Runleveln 1 bis 5 zum Einsatz. Die virtuellen Konsolen tty2 bis tty6 sind den Runleveln 2 und 3 vorbehalten. Auf tty7 liegt bei Debian die grafische Oberfläche. Benötigen Sie zusätzliche virtuelle Konsolen, bestünde die Möglichkeit, ab tty8 weitere anzulegen.
Listing 3
l0:0:wait:/etc/init.d/rc 0 l1:1:wait:/etc/init.d/rc 1 l2:2:wait:/etc/init.d/rc 2 l3:3:wait:/etc/init.d/rc 3 l4:4:wait:/etc/init.d/rc 4 l5:5:wait:/etc/init.d/rc 5 l6:6:wait:/etc/init.d/rc 6 # Normally not reached, but fallthrough in case of emergency. z6:6:respawn:/sbin/sulogin # What to do when CTRL-ALT-DEL is pressed. ca:12345:ctrlaltdel:/sbin/shutdown -t1 -a -r now # Action on special keypress (ALT-UpArrow). #kb::kbrequest:/bin/echo "Keyboard Request--edit /etc/inittab to let this work." # What to do when the power fails/returns. pf::powerwait:/etc/init.d/powerfail start pn::powerfailnow:/etc/init.d/powerfail now po::powerokwait:/etc/init.d/powerfail stop # /sbin/getty invocations for the runlevels. # # The "id" field MUST be the same as the last # characters of the device (after "tty"). # # Format: # <id>:<runlevels>:<action>:<process> # # Note that on most Debian systems tty7 is used by the X Window System, # so if you want to add more getty's go ahead but skip tty7 if you run X. # 1:2345:respawn:/sbin/getty 38400 tty1 2:23:respawn:/sbin/getty 38400 tty2 3:23:respawn:/sbin/getty 38400 tty3 4:23:respawn:/sbin/getty 38400 tty4 5:23:respawn:/sbin/getty 38400 tty5 6:23:respawn:/sbin/getty 38400 tty6
Den laufenden und vorhergehenden Runlevel ermitteln Sie über die Anweisung who -r (Abbildung 2). Den Wechsel eines Runlevels – dazu gehört auch das Anhalten oder Neustarten des Rechners – nehmen Sie mit den Kommandos aus der Tabelle “Runlevel-Wechsel” vor. Mit dem Befehl kill -1 1 liest Init seine Konfiguration neu ein, ohne dass dazu das System neu starten müsste. Mittels kill -9 1 fahren Sie das System herunter.
Runlevel-Wechsel
| Runlevel | Kommandos |
|---|---|
| 0 | init 0, shutdown -h now, halt |
| 1 bis 5 | init n |
| 6 | init 6, shutdown -r now, reboot |
Abbildung 2: Mit einem einfachen Kommando ermitteln Sie den aktuellen und den vorhergehenden Runlevel.
Eigenschaften von Systemd
Im Gegensatz zu Init startet Systemd die gewünschten Dienste parallel, was das Laden des Betriebssystems beschleunigt. Damit das gelingt, legt der Daemon Sockets an, über die die Dienste kommunizieren, und puffert die an die Programme gerichteten Daten so lange, bis diese erfolgreich starten. Stürzt ein Dienst ab, startet Systemd ihn neu. Die Zugriffe der Client-Anwendungen landen während dieser Phase wieder im Puffer; anschließend arbeitet der Daemon sie dann ab. Das Konzept erlaubt es, von Systemd angelegte Sockets zwischen Programmen zu verschieben.
Neuere Kernel stellen eine Funktion namens Cgroup [4] bereit, die es erlaubt, Prozesse mit ihren Kindprozessen in hierarchisch aufgebauten Gruppen zusammenzufassen. Systemd erstellt für jeden Dienst eine eigene Cgroup, die ihren Namen entsprechend dem Dienst erhält. Dieses Konzept beseitigt das Chaos, das in der Vergangenheit durch externe Prozesse entstand, die viele Dienste starten. Ferner vermeidet es, dass bei einem Absturz des Diensts einige dieser externen Prozesse weiterlaufen.
Es brauchen nicht alle Dienste beim Start des Systems loszulaufen, vielmehr geschieht dies bei Bedarf. Dazu überwacht Systemd die Aktivität auf einem Netzwerk- oder IPC-Socket oder einem FIFO-Puffer. Insofern übernimmt der Daemon hier teilweise die Funktionalität von Inetd. Darüber hinaus erlaubt es das Konzept der Software, viele Aufrufe ohne administrative Rechte vorzunehmen. Systemd verwaltet außerdem die Mountpoints, erstellt auf Wunsch Snapshots des Systems und stellt diese bei Bedarf wieder her. Diese Aggregation von Funktionen, die weit mehr als die hier stellvertretend genannten umfasst, brachte dem Ansatz erhebliche Kritik ein.
Die Runlevel existieren in Form von Zielen (“Targets”) weiter. Meist geht aus den Namen der Dateien mit der Endung .target deren Zweck hervor. So regelt die Datei halt.target das Herunterfahren des Systems. Die Datei /etc/inittab spielt für Systemd keine Rolle mehr. Allerdings unterstützt der Daemon die traditionellen Skripte zum Verwalten der Dienste.
Je nach verwendeter Distribution unterscheiden sich die Äquivalente zwischen Runleveln und Targets. Die Tabelle “Runlevel vs. Targets” bietet eine Gegenüberstellung, die Angaben stammen von einer Installation mit Debian 8. Darüber hinaus gibt es weitere Targets, die es ermöglichen, die Zustände des Systems feiner zu unterteilen.
Runlevel vs. Targets
| Runlevel | Target | Erläuterung |
|---|---|---|
| 0 | poweroff.target |
Rechner herunterfahren und abschalten |
| 1 | rescue.target |
Single-User-Modus ohne Netzwerk |
| 2 | multi-user.target |
Mehrbenutzermodus |
| 3 bis 5 | – | – |
| 6 | reboot.target |
Neustart des Rechners |
Systemd konfigurieren
Die Anweisungen für die Konfiguration und zum Ausführen von Programmen liegen bei Systemd in Unit-Dateien. Die Endung der Dateien gibt einen Aufschluss darüber, welche Funktion eine Unit hat – eine Zusammenstellung dazu finden Sie in der Tabelle “Units”. Die einzelnen Konfigurationsdateien liegen als Klartext vor und weisen einen ähnlichen Aufbau wie Ini-Dateien auf, was es ermöglicht, sie mit einem Texteditor zu bearbeiten.
Units
| Endung | Funktion |
|---|---|
.automount |
konfiguriert einen Einhängepunkt zum automatischen Einhängen eines Datenträgers |
.device |
verwaltet Geräte analog zu Udev |
.mount |
definiert einen Einhängepunkt, durch den Fstab-Generator erzeugt und von Systemd verwaltet |
.path |
startet weitere Dienste, wenn sich im angegebenen Pfad Objekte geändert haben |
.scope |
automatisch erzeugte Dateien zum Verwalten von Systemprozessen |
.service |
Informationen über einen Prozess |
.slice |
dient dem Verwalten der Ressourcen von Prozessen |
.snapshot |
erlaubt den Zustand des Systems vor dem Ändern während einer Sitzung wiederherzustellen |
.socket |
beschreibt einen Netzwerk-, IPC-Socket oder FIFO-Puffer, den Systemd für das Socket-basierte Aktivieren benutzt |
.swap |
Angaben zur Auslagerungsdatei |
.target |
fasst mehrere Units zu einem Synchronisationspunkt zusammen (ehemals Runlevel) |
.timer |
setzt einen Timer für eine zurückgehaltene oder vorgesehene Aktivität |
Grundsätzlich liegen diese Dateien und die symbolischen Links hierzu unter /lib/systemd, damit die Software diese beim Booten erreicht. Zumindest bei Debian finden sich weitere Unit-Dateien unter /usr/lib/systemd. Geänderte Unit-Dateien befinden sich unter /etc/systemd/system. Vom System selbst zur Laufzeit geschaffene Dateien finden Sie unter /run/systemd/system. Listing 4 zeigt den Aufbau einer Unit-Datei für den At-Daemon.
Listing 4
[Unit] Description=Deferred execution scheduler Documentation=man:atd(8) [Service] ExecStart=/usr/sbin/atd -f IgnoreSIGPIPE=false [Install] WantedBy=multi-user.target
Eigene Unit-Dateien
Falls Sie in den Ablauf beim Booten eingreifen möchten, empfiehlt es sich, beim Anlegen oder Ändern von Unit-Dateien einige Regeln zu beachten. Möchten Sie eine Datei ändern, kopieren Sie diese zuerst von /lib/systemd/ nach /etc/systemd/system/. Neue Unit-Dateien legen Sie ebenfalls dort an: Geänderte oder neue Dateien unter /lib/systemd/ überschreibt das System unter Umständen.
Die Unit-Dateien bestehen aus verschiedenen Sektionen, denen Sie wiederum Anweisungen zuordnen. In der Tabelle “Sektionen und Anweisungen” finden Sie eine Auswahl dazu. In einer Unit-Datei kommt immer nur eine Sektion zusätzlich zum Abschnitt [Unit] und gegebenenfalls [Install] vor.
Sektionen und Anweisungen
| Sektion | Bedeutung |
|---|---|
[Unit] Angabe von Beschreibungen und Abhängigkeiten. |
|
Description= |
Beschreibung der Funktionalität. |
Documentation= |
Angabe zur Dokumentation. |
Requires= |
Units, von denen der Start der Unit abhängt. |
Wants= |
Ähnlich Requires, behindern den Start aber nicht. |
Conflicts= |
Beendet die angegebenen Units vor dem Start der Unit. |
[Install] Anweisung für das Programm sysctl. |
|
Also= |
Die Aufrufe sysctl enable und sysctl disable bearbeiten die hier gelisteten Units ebenfalls. |
RequiredBy= |
Abhängigkeiten. |
[Service] Startkonfiguration von Diensten. |
|
Typ=simple |
Der bei ExecStart angegebene Aufruf ist der Hauptprozess des angegebenen Services. |
Typ=forking |
Der bei ExecStart angegebene Aufruf beendet sich nach dem Start, Kindprozesse laufen als Hauptprozess. |
Typ=oneshot |
Das System ruft die nächsten Units nach dem Ende des gestarteten Prozesses auf. |
Environment= |
Definition von Variablen. |
ExecStart= |
Angabe des zu startenden Dienstes, eventuell mit Angabe des Pfads. |
Restart= |
Angabe, ob der Dienst neu gestartet ist, nachdem dessen Prozess sich beendet hat oder ein Timeout eingetreten ist. Hat Systemd den Prozess selbst beendet, erfolgt keine Reaktion. |
SucessExitStatus= |
Definition, welche Exit-Codes und welche Signale ein sauberes Beenden des Prozesses kennzeichnen. |
[Socket] Socket-basierte Steuerung. |
|
ListenStream= |
Adresse eines Stream-Sockets. |
ListenDatagram= |
Adresse eines Datagram-Sockets. |
ListenSequentialPacket= |
Adresse für sequenzielle Kommunikation, meist bei Unix-Sockets. |
ListenFIFO= |
Angabe eines FIFO-Puffers. |
BindToDevice= |
Socket an bestimmtes Interface binden |
Accept= |
Bei true: Start einer (weiteren) Instanz des Diensts je Verbindung. Bei false: Eine Instanz arbeitet alle Verbindungen ab. |
SocketUser= |
User-ID des Sockets. |
SocketGroup= |
Group-ID des Sockets. |
MaxConnections= |
Maximale Anzahl Verbindungen (wenn Accept=true). |
KeepAlive= |
Zeitangabe in Sekunden. |
[Mount] Verwalten der Einhängepunkte1. |
|
What= |
Absolute Pfadangabe/Adresse des Geräts, einer Datei oder anderen Ressource (Pflichtangabe). |
Where= |
Absolute Pfadangabe des Einhängepunkts (Pflichtangabe). |
Type= |
Angabe des Dateisystems. |
Options= |
Mount-Optionen. |
DirectoryMode= |
Definition der Zugriffsrechte (Standard: 0755). |
TimeoutSec= |
Wartezeit, bis Operation als fehlgeschlagen gilt. |
[Automount] Verwaltung eines Automount-Punkts. |
|
Where= |
Absolute Pfadangabe des Einhängepunkts. |
DirectoryMode= |
Siehe [Mount]. |
TimeoutSec= |
Siehe [Mount]. |
[Swap] Konfiguration des Auslagerungsspeichers. |
|
What= |
Pfadangabe zu Gerät oder Datei. |
TimeoutSec= |
Siehe [Mount]. |
[Path] Pfad, den Systemd überwacht. |
|
PathExists= |
Prüft, ob der Pfad existiert. |
PathModified= |
Überwacht Änderungen bezüglich des angegebenen Pfads. |
Unit= |
Zu aktivierende Unit. |
[Timer] Zeitgeber, der Cron und At ersetzt oder ergänzt. |
|
OnActiveSec= |
Aktiviert die angegebene Unit, nachdem diese Timer-Unit aktiviert wurde. |
OnBootSec= |
Gibt an, nach welcher Zeit, die seit dem Systemstart verstrichen ist, die angegebene Unit aktiviert werden soll. |
OnCalendar= |
Absolute Zeitangabe. |
WakeSystem= |
Nach Ablauf dieser Zeit System im Suspend-Modus starten. |
Unit= |
Zu aktivierende Unit. |
| 1 Name des Einhängepunkts entspricht dem Namen der Unit-Datei. | |
Beispiel in Eigenbau
Das Shellskript aus Listing 5 liefert in Intervallen eine Übersicht aller im Netz befindlichen Hosts. Die Ergebnisse betrachten Sie mittels tail -f /tmp/netzliste.txt in einem Terminal. Legen Sie zunächst das Skript im Verzeichnis /usr/sbin als netzschau.sh an. Mittels chmod 700 netzschau.sh vergeben Sie die passenden Rechte. Damit Systemd das Programm startet, legen Sie unter /etc/systemd/system die Unit-Datei netzschau.service (Listing 6) an.
Listing 5
#! /bin/sh while true; do echo "Übersicht aktiver Netzwerkteilnehmer" > /tmp/netzliste.txt echo "------------------------------------" >> /tmp/netzliste.txt date +%d.%m.%Y-%H:%M:%S >> /tmp/netzliste.txt echo "------------------------------------" >> /tmp/netzliste.txt # Fping ausführen und Ausgabe in Log-Datei speichern fping -r 0 -g 192.168.0.0/24 > fping.log 2>&1 # Ausfiltern der nicht erreichbaren Hosts grep "alive" fping.log | sort >> /tmp/netzliste.txt echo "------------------------------------" >> /tmp/netzliste.txt sleep 120 done
Listing 6
[Unit] Description=Auflistung aktiver Hosts Documentation=man:fping(8) [Service] ExecStart=/usr/sbin/netzschau.sh IgnoreSIGPIPE=false [Install] WantedBy=multi-user.target
Nun weisen Sie Systemd an, die Unit-Datei zu verarbeiten und die Anwendung zu starten. Für den dauerhaften Start aktivieren Sie den Dienst mittels des Befehls aus der ersten Zeile von Listing 7. Dabei legt das System den notwendigen symbolischen Link ins Target-Verzeichnis multi-user.target. Sie starten den Dienst mittels des Befehls aus der zweiten Zeile. Der Befehl aus der letzten Zeile prüft, ob das Programm läuft. Abbildung 3 zeigt das Ergebnis der Statusabfrage.
Listing 7
$ systemctl enable netzschau.service $ systemctl start netzschau.service $ systemctl status netzschau.service

Abbildung 3: Bei Bedarf fragen Sie den Status eines laufenden Diensts ab, um zu sehen, ob die Software noch ordnungsgemäß läuft.
Systemctl dient in der Systemd-Welt als zentrales Werkzeug zum Steuern von Aktionen. Ohne weitere Angabe listet es alle Units auf, die das System nach dem Booten gestartet hat. Die Tabelle “Systemctl-Parameter” listet die wichtigsten Argumente für das Tool, mit denen Sie das System über die Unit-Dateien administrieren.
Systemctl-Parameter
| Parameter | Erläuterung |
|---|---|
enable Unit |
Unit aktivieren |
disable Unit |
Unit deaktivieren |
start Unit |
Unit starten |
stop Unit |
Unit stoppen |
restart Unit |
Unit neu starten |
reload Unit |
Konfiguration neu einlesen |
status Unit |
Status abfragen |
mask Unit |
Unit maskieren |
unmask Unit |
Unit demaskieren |
help Unit |
Hilfe zu Unit aufrufen |
list-unit-files |
Unit-Dateien anzeigen |
list-units |
alle Units anzeigen |
-t mount |
nur Mounts anzeigen |
-t automount |
nur Automounts anzeigen |
-t service |
nur Dienste anzeigen |
-t device |
nur Geräte anzeigen |
-t target |
nur Targets anzeigen |
-t snapshots |
nur Snapshots anzeigen |
list-dependencies Unit-Datei |
Abhängigkeiten anzeigen |
--failed |
fehlgeschlagenen Units |
poweroff |
herunterfahren und abschalten |
reboot |
neu starten |
rescue |
Einbenutzermodus, Systemwartung |
suspend |
Suspendmodus |
isolate Target |
Betriebszustand wechseln |
cat Unit |
Unit-Datei anzeigen |
show Unit |
Eigenschaften der Unit-Datei auflisten |
Viele Parameter erlauben es, über zusätzliche Angaben die Aktion zu präzisieren. Abbildung 4 zeigt ein komplett durchgespieltes Beispiel: Es geht darum, einen Dienst – in diesem Fall das RDBMS PostgreSQL – anzuhalten, zu maskieren und anschließend diese Maßnahme wieder rückgängig zu machen. Die Unit-Datei liegt dabei nicht unter /etc/systemd/system. Bei der Abfrage des Status finden Sie alle zum Dienst gehörenden Prozesse angegeben. Ferner zeigt der Aufruf den Status der Unit selbst und deren Laufzeit an.

Abbildung 4: Sind die einschlägigen Parameter erst einmal verinnerlicht, geht die Arbeit mit Systemctl vergleichsweise reibungslos von der Hand.
Eine Aufstellung aller Unit-Dateien erhalten Sie mittels systemctl list-unit-files (Abbildung 5). Neben den Zuständen enabled, disabled und masked finden Sie hier noch static: Es signalisiert, dass die entsprechende Unit-Datei nicht aktiviert ist und in der Sektion [Install] obendrein Anweisungen hierzu fehlen. Ein Steuern durch Systemctl gelingt daher nicht. Manchmal liegt hier ein Fehler vor; es gibt aber auch verschiedene plausible Gründe für den Zustand static: Eventuell ist die Unit in anderen Units unter .wants oder .requires eingetragen. Eine weitere Möglichkeit: Das System aktiviert sie per Socket, Timer, D-Bus oder Udev.

static weisen entweder einen Konfigurationsfehler auf, oder es handelt sich um Abhängigkeiten, die andere Unit-Dateien voraussetzen.” width=”283″ height=”300″ />
Abbildung 5: Unit-Dateien mit dem Statusstatic weisen entweder einen Konfigurationsfehler auf, oder es handelt sich um Abhängigkeiten, die andere Unit-Dateien voraussetzen. Systemd weist jeden Dienst, den es verwaltet, in eine eigene Cgroup ein. Mit dem Befehl systemctl-cgls sehen Sie auf einen Blick, welche Prozesse zu welcher Unit gehören. Sie erhalten damit eine Ansicht ähnlich der von Pstree (Abbildung 6).

systemd-cgls sehen Sie auf einen Blick, zu welcher Cgroup und somit zu welchem Dienst ein Prozess gehört.” width=”300″ height=”193″ />
Abbildung 6: Mit dem Befehlsystemd-cgls sehen Sie auf einen Blick, zu welcher Cgroup und somit zu welchem Dienst ein Prozess gehört.Das Programm Systemadm ermöglicht das schnelle und einfache Verwalten von Systemd und den Diensten. Mit dem Tool erledigen Sie per Mausklick im Prinzip die gleichen Aktionen wie mit Systemctl auf der Kommandozeile (Abbildung 7).

Abbildung 7: Systemadm erlaubt es, Systemd und die von diesem verwalteten Dienste via Mausklick zu steuern.
Journal statt Log
Manche Distributionen ersetzen Syslog durch Systemd-journald, das die Log-Dateien oft nur zur Laufzeit aufbewahrt. Falls Sie dies nicht wünschen und die von Ihnen eingesetzte Distribution es nicht bereits geändert hat, passen Sie einige Einträge in /etc/systemd/journald.conf entsprechend an. Durch Setzen von Storage=persistent landen die Daten dauerhaft unter /var/log/journal im Dateisystem. Sie begrenzen die Größe des Logs über eine Angabe wie SystemMaxUse=100M. Bedenken Sie, dass sich die Dateien nicht mit den üblichen Werkzeugen für Textdateien durchsuchen lassen, wie etwa Grep: Dazu dient das Programm Journalctl.
Geben Sie das Kommando journalctl ohne weitere Option ein, bekommen Sie das komplette Journal aufgelistet. Die Tabelle “Journalctl-Optionen” zeigt einige Möglichkeiten, um die oft sehr umfangreiche Ausgabe auf die gesuchten Informationen zu begrenzen. Abbildung 8 zeigt eine Abfrage, deren Ausgabe sich auf einen einzelnen Dienst (apache2.service) beschränkt.
Journalctl-Optionen
| Option | Erläuterung |
|---|---|
-u Unit |
Ausgabe auf Unit begrenzen |
-k |
Meldungen des Kernel |
-x |
Ausgabe von Erläuterungen im Klartext |
-f |
laufende Anzeige |

Abbildung 8: Dank der richtigen Optionen schränken Sie die Flut an Informationen aus dem Journal von Systemd ein und gelangen so direkt zu den gesuchten Daten.
Fazit
Die beiden Ansätze, SysVinit und Systemd, verfolgen sehr unterschiedliche Konzepte. Das althergebrachte Init-System macht es dem Administrator sehr leicht: Mehr als Shell-Kenntnisse und einen Editor benötigen Sie nicht, um die entsprechenden Dateien zu erstellen und zu bearbeiten.
Systemd entstand in erster Linie aus dem Gedanken heraus, den Start des Rechners zu beschleunigen. Mittlerweile hat der Daemon aber seine Arme krakengleich in viele Bereiche des Systems ausgestreckt – sehr zum Unmut einiger Benutzer. Trotzdem gehört der Technik wohl die Zukunft: Nach und nach springen immer mehr Distributionen auf den fahrenden Zug auf.
Glossar
-
Daemons
-
Unter unixoiden Betriebssystemen die Bezeichnung für Hintergrundprogramme, die bestimmte Dienste anbieten. Englisch auch manchmal “demons”. Unter Windows bezeichnet man solche Programme als “services” oder Systemdienste. Die Namen von Daemons enden traditionell mit einem “d” (Systemd, Syslogd, Sshd, Udevd, etc.), es gibt aber auch Ausnahmen (etwa Cron). Die Ur-Unix-Entwickler bezeichneten Dienste nach den hilfreichen Schutzgeistern der altgriechischen Mythologie (vgl. eudaemonia) als Daemonen. Gerne wird das Wort aber auch als Akronym für Disk And Execution Monitor kolportiert.
-
IPC
-
Inter-process Communication. Im weitesten Sinn jeder Datenaustausch in verteilten Systemen, von Threads, die sich ein Laufzeitsystem teilen, bis hin zu Programmen, die auf verschiedenen Rechnern laufen und über ein Netzwerk kommunizieren.
-
FIFO
-
First In, First Out. Speicherverfahren, das die zuerst gespeicherten Werte auch zuerst wieder aus dem Speicher entnimmt. Auch als “Queue” (Warteschlange) bezeichnet. Im Gegensatz dazu funktioniert LIFO (Last In, First Out) nach dem Stapel-Prinzip.
Infos
[1] SysVinit: https://wiki.archlinux.org/index.php/SysVinit
[2] Systemd: Ferdinand Thommes, “Systemd als Schaltzentrale im Linux-System”, LU 04/2014, S. 80, https://www.linux-community.de/32078
[3] Anleitung zum Erstellen von Init-Skripten: http://refspecs.linuxbase.org/LSB_3.1.0/LSB-Core-generic/LSB-Core-generic/initscrcomconv.html
[4] Cgroups: https://en.wikipedia.org/wiki/Cgroups





