13 Systemd

Systemd ist eine Programm-paket, die eine Reihe von Systemkomponenten für Linux-Betriebssysteme bereitstellt. Die Hauptkomponente ist ein “System- und Service-Manager” - ein Init-System, das zum Booten des User-Space und zur Verwaltung von Benutzerprozessen verwendet wird.

Zu den weiteren Funktionen gehören der parallele Start von Diensten, die Socket- und D-Bus-Aktivierung zum Starten von Diensten, das bedarfsorientierte Starten von Daemons, die Verfolgung von Prozessen mit Hilfe von Linux-Control-Groups, die Verwaltung von Mount- und Automount-Punkten und die Implementierung einer ausgefeilten transaktionalen, abhängigkeitsbasierten Dienststeuerungslogik.

Zu den weiteren Teilen gehören ein Logging-Daemon, Dienstprogramme zur Steuerung der grundlegenden Systemkonfiguration wie Hostname, Datum, Gebietsschema, die Aufrechterhaltung einer Liste von angemeldeten Benutzern und laufenden Containern und virtuellen Maschinen, Systemkonten, Laufzeitverzeichnisse und -einstellungen sowie Daemons zur Verwaltung der einfachen Netzwerkkonfiguration, Netzwerk-Zeitsynchronisation, Log-Weiterleitung und Namensauflösung.

13.1 sbin/init

Das Programm /sbin/init (auch als init bezeichnet) koordiniert den Rest des Bootvorgangs und konfiguriert die Umgebung für den Benutzer. Wenn der init-Befehl startet, wird er zum Eltern- oder Großelternprozess aller Prozesse, die automatisch im System starten. Heutzutage ist sbin/initunter Debian (und alle seine Derivate) ein Symlink, welcher zu /lib/systemd/system verweist. Der Grund für den Erhalt von sbin/init ist die Kompatibilität mit alten Programmen.

13.2 Systemd Units

Systemd verwendet Einheiten (units), um Systemressourcen und Dienste zu verwalten. Eine Unit ist eine Konfigurationsdatei, die beschreibt, wie ein spezifischer Systemdienst, eine Systemressource oder ein Gerät zu behandeln ist. Es gibt verschiedene Typen von Units, die jeweils unterschiedliche Aspekte des Systems kontrollieren.

13.2.1 Service Units (.service)

Diese Units definieren Systemdienste. Ein Beispiel für eine Service-Unit-Konfigurationsdatei:

[Unit]
Description=My Example Service
After=network.target

[Service]
ExecStart=/usr/bin/my-service
Restart=always

[Install]
WantedBy=multi-user.target

13.2.2 Socket Units (.socket)

Diese Units beschreiben Sockets, die von Systemd überwacht werden. Wenn eine Verbindung an einem dieser Sockets eingeht, kann ein zugehöriger Dienst gestartet werden.

[Unit]
Description=My Example Socket

[Socket]
ListenStream=1234

[Install]
WantedBy=sockets.target

13.2.3 Target Units (.target)

Diese Units dienen dazu, Gruppen von Units zu organisieren und systemweite Zustände zu erreichen.

[Unit]
Description=My Example Target

13.2.4 Mount Units (.mount)

Diese Units beschreiben Mount-Punkte im Dateisystem.

[Unit]
Description=Mount Example

[Mount]
What=/dev/sdb1
Where=/mnt/example
Type=ext4

[Install]
WantedBy=multi-user.target

13.2.5 Automount Units (.automount)

Diese Units beschreiben Automount-Punkte, die das automatische Einhängen von Dateisystemen ermöglichen.

[Unit]
Description=Automount Example

[Automount]
Where=/mnt/example

[Install]
WantedBy=multi-user.target

13.2.6 Timer Units (.timer)

Diese Units konfigurieren zeitgesteuerte Aufgaben ähnlich wie Cron-Jobs.

[Unit]
Description=Run Example Service Daily

[Timer]
OnCalendar=daily
Persistent=true

[Install]
WantedBy=timers.target

13.2.7 Path Units (.path)

Diese Units überwachen Dateisystempfade und können bei Änderungen Aktionen auslösen.

[Unit]
Description=Monitor Example Path

[Path]
PathModified=/path/to/monitor

[Install]
WantedBy=multi-user.target

13.2.8 Slice Units (.slice)

Diese Units organisieren und steuern Gruppen von Prozessen.

[Unit]
Description=Example Slice

13.2.9 Scope Units (.scope)

Diese Units verwalten Prozesse, die nicht von systemd gestartet wurden.

13.3 Struktur einer Unit-Datei

Eine Unit-Datei besteht aus mehreren Abschnitten, von denen die wichtigsten hier erläutert werden.

13.3.1 [Unit]

Dieser Abschnitt enthält generische Informationen über die Unit, wie die Beschreibung und Abhängigkeiten.

[Unit]
Description=My Example Unit
After=network.target

13.3.2 [Service], [Socket], [Mount], etc.

Diese Abschnitte enthalten spezifische Einstellungen für den jeweiligen Unit-Typ. Ein Service-Abschnitt könnte beispielsweise den Befehl definieren, der beim Start des Dienstes ausgeführt wird.

[Service]
ExecStart=/usr/bin/my-service
Restart=always

13.3.3 [Install]

Dieser Abschnitt definiert, wie und wann die Unit installiert und aktiviert wird.

[Install]
WantedBy=multi-user.target

13.4 Systemctl

systemctl ist das zentrale Werkzeug zur Verwaltung von Systemd-Diensten. Es bietet eine Vielzahl von Befehlen und Optionen, um Dienste zu steuern, den Status zu überprüfen und Systemeinstellungen zu verwalten.

13.4.1 systemctl status

Überprüft den Status eines Dienstes.

systemctl status <dienstname>

13.4.1.1 Wichtige Optionen:

13.4.2 systemctl list-units

Listet alle aktiven Einheiten (units) auf.

systemctl list-units

13.4.2.1 Wichtige Optionen:

13.4.3 systemctl enable

Aktiviert einen Dienst so, dass er beim Systemstart automatisch gestartet wird.

systemctl enable <dienstname>

13.4.3.1 Wichtige Optionen:

13.4.4 systemctl disable

Deaktiviert einen Dienst, so dass er beim Systemstart nicht automatisch gestartet wird.

systemctl disable <dienstname>

13.4.4.1 Wichtige Optionen:

13.4.5 systemctl start

Startet einen Dienst sofort.

systemctl start <dienstname>

13.4.5.1 Wichtige Optionen:

13.4.6 systemctl stop

Stoppt einen laufenden Dienst sofort.

systemctl stop <dienstname>

13.4.6.1 Wichtige Optionen:

13.4.7 systemctl restart

Stoppt und startet einen Dienst neu.

systemctl restart <dienstname>

13.4.7.1 Wichtige Optionen:

13.4.8 systemctl reload

Lädt die Konfiguration eines laufenden Dienstes neu, ohne ihn neu zu starten.

systemctl reload <dienstname>

13.4.8.1 Wichtige Optionen:

13.4.9 systemctl cat

Zeigt die Konfigurationsdateien einer Einheit an.

systemctl cat <dienstname>

13.4.9.1 Wichtige Optionen:

13.4.10 systemctl is-enabled

Überprüft, ob ein Dienst aktiviert ist.

systemctl is-enabled <dienstname>

13.4.10.1 Wichtige Optionen:

13.4.11 systemctl is-active

Überprüft, ob ein Dienst aktiv ist.

systemctl is-active <dienstname>

13.4.11.1 Wichtige Optionen:

13.5 Systemd-analyze

Systemd-analyze kann verwendet werden, um Leistungsstatistiken beim Systemstart zu ermitteln und andere Zustands- und Tracing-Informationen vom System- und Servicemanager abzurufen sowie die Korrektheit von Unit-Dateien zu überprüfen. Es wird auch verwendet, um auf spezielle Funktionen zuzugreifen, die für fortgeschrittene Systemmanager-Debugging-Zwecke nützlich sind.

13.5.1 systemd-analyze time

Dieser Befehl gibt die Zeit aus, die im Kernel verbracht wurde, bevor der Benutzerbereich erreicht wurde, die Zeit, die im initrd verbracht wurde, bevor der normale Systembenutzerbereich erreicht wurde, und die Zeit, die der normale Systembenutzerbereich benötigt hat, um initialisiert zu werden.

# in a container
$ systemd-analyze time
Startup finished in 296ms (userspace)
multi-user.target reached after 275ms in userspace

# on a real machine
$ systemd-analyze time
Startup finished in 2.584s (kernel) + 19.176s (initrd) + 47.847s (userspace) = 1min 9.608s
multi-user.target reached after 47.820s in userspace

13.5.2 systemd-analyze blame

Zeigt eine Liste aller laufenden Programme und Dienste an, sortiert nach der Zeit, die sie brauchten, um sich zu starten. Das kann helfen, langsame Programme zu finden und den Startvorgang zu beschleunigen. Beachte jedoch, dass die Zeit, die ein Programm braucht, auch davon abhängen kann, dass es auf ein anderes Programm wartet. Außerdem zeigt der Befehl keine Ergebnisse für sehr einfache Programme an. Er zeigt auch nicht an, wie lange Programme auf andere Programme warten müssen.

$ systemd-analyze blame
     32.875s pmlogger.service
     20.905s systemd-networkd-wait-online.service
     13.299s dev-vda1.device
     ...
        23ms sysroot.mount
        11ms initrd-udevadm-cleanup-db.service
         3ms sys-kernel-config.mount

13.5.3 systemd-analyze critical-chain

Zeigt eine Liste von Einheiten und deren Startzeiten an, die für den erfolgreichen Start anderer Einheiten wichtig sind. Es zeigt, wie lange eine Einheit braucht, um zu starten, und ob sie auf eine andere Einheit wartet. Die Ausgabe kann jedoch nicht alle Arten von Wartezeiten genau erfassen und ist möglicherweise nicht vollständig.

$ systemd-analyze critical-chain
    multi-user.target @47.820s
    └─pmie.service @35.968s +548ms
     └─pmcd.service @33.715s +2.247s
       └─network-online.target @33.712s
         └─systemd-networkd-wait-online.service @12.804s     +20.905s
          └─systemd-networkd.service @11.109s +1.690s
              └─systemd-udevd.service @9.201s +1.904s
                  └─systemd-tmpfiles-setup-dev.service @7.306s +1.776s
                     └─kmod-static-nodes.service @6.976s +177ms
                      └─systemd-journald.socket
                          └─system.slice
                           └─-.slice

13.5.4 systemd-analyze dump

Wenn du diesen Befehl ohne Zusatz verwendest, zeigt er dir eine lange Liste aller laufenden Programme und Dienste auf deinem Computer. Du kannst auch Muster angeben, um die Liste auf bestimmte Programme zu beschränken. Die Ausgabe ist für normale Anwendungen nicht immer leicht zu verstehen und kann sich ändern. Und nicht-Admin-Benutzer können diesen Befehl nur begrenzt verwenden.

$ systemd-analyze --user dump
Timestamp userspace: Thu 2019-03-14 23:28:07 CET
Timestamp finish: Thu 2019-03-14 23:28:07 CET
Timestamp generators-start: Thu 2019-03-14 23:28:07 CET
Timestamp generators-finish: Thu 2019-03-14 23:28:07 CET
Timestamp units-load-start: Thu 2019-03-14 23:28:07 CET
Timestamp units-load-finish: Thu 2019-03-14 23:28:07 CET
-> Unit proc-timer_list.mount:
        Description: /proc/timer_list
    ...
-> Unit default.target:
        Description: Main user target

13.5.5 systemd-analyze plot

Dieser Befehl gibt entweder eine SVG-Grafik aus, die detailliert darstellt, welche Systemdienste zu welcher Zeit gestartet wurden und wie lange sie für die Initialisierung benötigt haben, oder die Rohzeitdaten im JSON- oder Tabellenformat.

$ systemd-analyze plot >bootup.svg
$ eog bootup.svg&

13.5.6 systemd-analyze dot

Dieser Befehl erstellt eine Beschreibung der Abhängigkeiten zwischen den verschiedenen Diensten auf deinem System im dot-Format. Diese Beschreibung kann dann mit dem GraphViz-Tool dot verwendet werden, um einen grafischen Abhängigkeitsbaum zu erstellen. Wenn du beispielsweise systemd-analyze dot | dot -Tsvg >systemd.svg eingibst, wird eine SVG-Datei mit dem Baum erstellt. Du kannst auch Muster angeben, um nur bestimmte Einheiten oder Dienste in den Baum aufzunehmen.

$ systemd-analyze dot 'avahi-daemon.*' | dot -Tsvg >avahi.svg
$ eog avahi.svg

$ systemd-analyze dot --to-pattern='*.target' --from-pattern='*.target' \
  | dot -Tsvg >targets.svg
$ eog targets.svg

13.5.7 systemd-analyze capability

Dieser Befehl zeigt eine Liste von Linux-Fähigkeiten zusammen mit ihren Zahlenwerten an. Wenn keine Argumente angegeben sind, werden alle Fähigkeiten aufgelistet, die dem Servicemanager und dem Kernel bekannt sind. Fähigkeiten, die nur vom Kernel definiert sind, werden als “cap_???” angezeigt. Wenn du spezifische Fähigkeiten anzeigen möchtest, kannst du ihre Namen oder Zahlenwerte als Argumente verwenden.

$ systemd-analyze capability 0 1 {30..32}
NAME              NUMBER
cap_chown              0
cap_dac_override       1
cap_audit_control     30
cap_setfcap           31
cap_mac_override      32

13.5.8 systemd-analyze calendar

Dieser Befehl analysiert und normalisiert wiederkehrende Kalenderzeitereignisse und berechnet, wann sie als nächstes eintreten werden. Dabei verwendet er dieselbe Eingabe wie die OnCalendar= Einstellung in systemd.timer(5), wobei die Syntax in systemd.time(7) beschrieben wird. Standardmäßig wird nur der nächste Zeitpunkt angezeigt, an dem der Kalenderausdruck eintritt. Mit –iterations= kannst du die angegebene Anzahl der nächsten Zeitpunkte anzeigen lassen, an denen der Ausdruck eintritt. Jedes Mal, wenn der Ausdruck eintritt, bildet sich ein Zeitstempel, siehe das Verb “timestamp” weiter unten.

$ systemd-analyze calendar --iterations=5 '*-2-29 0:0:0'
Original form: *-2-29 0:0:0
Normalized form: *-02-29 00:00:00
Next elapse: Sat 2020-02-29 00:00:00 UTC
   From now: 11 months 15 days left
   Iter. #2: Thu 2024-02-29 00:00:00 UTC
   From now: 4 years 11 months left
   Iter. #3: Tue 2028-02-29 00:00:00 UTC
   From now: 8 years 11 months left
   Iter. #4: Sun 2032-02-29 00:00:00 UTC
   From now: 12 years 11 months left
   Iter. #5: Fri 2036-02-29 00:00:00 UTC
   From now: 16 years 11 months left

13.5.9 systemd-analyze timestamp

Dieser Befehl analysiert einen Zeitstempel (d. h. einen einzelnen Zeitpunkt) und gibt die normalisierte Form sowie die Differenz zwischen diesem Zeitstempel und der aktuellen Zeit aus. Der Zeitstempel sollte der Syntax entsprechen, die in systemd.time(7), Abschnitt “PARSING TIMESTAMPS” dokumentiert ist.

$ systemd-analyze timestamp yesterday now tomorrow
    Original form: yesterday
Normalized form: Mon 2019-05-20 00:00:00 CEST
     (in UTC): Sun 2019-05-19 22:00:00 UTC
UNIX seconds: @15583032000
      From now: 1 day 9h ago

  Original form: now
Normalized form: Tue 2019-05-21 09:48:39 CEST
      (in UTC): Tue 2019-05-21 07:48:39 UTC
 UNIX seconds: @1558424919.659757
    From now: 43us ago

 Original form: tomorrow
Normalized form: Wed 2019-05-22 00:00:00 CEST
    (in UTC): Tue 2019-05-21 22:00:00 UTC
 UNIX seconds: @15584760000
      From now: 14h left

13.5.10 systemd-analyze cat-config

Dieser Befehl ähnelt “systemctl cat”, funktioniert jedoch auf Konfigurationsdateien. Er kopiert den Inhalt einer Konfigurationsdatei und eventueller Drop-Ins in die Standardausgabe, unter Verwendung des üblichen systemd-Verzeichnis- und Prioritätsregelsatzes. Jedes Argument muss entweder ein absoluter Pfad einschließlich des Präfix sein (wie /etc/systemd/logind.conf oder /usr/lib/systemd/logind.conf) oder ein Name relativ zum Präfix (wie systemd/logind.conf).

$ systemd-analyze cat-config systemd/logind.conf
# /etc/systemd/logind.conf
...
[Login]
NAutoVTs=8
...

# /usr/lib/systemd/logind.conf.d/20-test.conf
... some override from another package

# /etc/systemd/logind.conf.d/50-override.conf
... some administrator override

13.5.11 systemd-analyze verify

Dieser Befehl lädt Einheitsdateien und gibt Warnungen aus, wenn Fehler gefunden werden. Er lädt die Dateien, die du auf der Befehlszeile angegeben hast, sowie alle anderen Einheiten, auf die sie verweisen. Du kannst auch einem Einheitsnamen auf der Festplatte einen Alias zuweisen. Der Suchpfad für Einheiten wird durch die Verzeichnisse der Befehlszeilenargumente und die üblichen Suchpfade gebildet. Du kannst auch die Variable $SYSTEMD_UNIT_PATH verwenden, um den Suchpfad anzupassen. Einheiten in Verzeichnissen, die in den Befehlszeilenargumenten angegeben sind, haben Vorrang vor anderen Pfaden.

Die folgenden Fehler werden derzeit erkannt:

Unbekannte Abschnitte und Anweisungen, - Fehlende Abhängigkeiten, - die erforderlich sind, um die angegebene Einheit zu starten, - Man-Pages, - die in “Documentation=” aufgeführt sind, - aber nicht im System gefunden werden, - Befehle, - die in “ExecStart=” und ähnlichen Feldern aufgeführt sind, - aber nicht im System gefunden werden oder nicht ausführbar sind.

Beispiel: Einheit umbenennen

$ cat /tmp/source
[Unit]
Description=Hostname printer

[Service]
Type=simple
ExecStart=/usr/bin/echo %H
MysteryKey=true

$ systemd-analyze verify /tmp/source
Failed to prepare filename /tmp/source: Invalid argument

$ systemd-analyze verify /tmp/source:alias.service
alias.service:7: Unknown key name 'MysteryKey' in section 'Service', ignoring.

13.5.12 systemd-analyze security

Dieser Befehl überprüft die Sicherheitseinstellungen von einem oder mehreren spezifizierten Diensten. Wenn du einen Dienstnamen angibst, zeigt er detaillierte Informationen zu dessen Sicherheitseinstellungen an. Ohne Angabe eines Dienstnamens überprüft er alle laufenden Dienste und zeigt eine kurze Tabelle mit den Ergebnissen an. Er bewertet die Sicherheitsstufe jedes Dienstes basierend darauf, wie gut er gegen potenzielle Angriffe geschützt ist. Eine hohe Sicherheitsstufe bedeutet eine geringere Anfälligkeit für Angriffe, während eine niedrige Sicherheitsstufe auf mögliche Schwachstellen hinweist. Beachte jedoch, dass diese Analyse nur die Sicherheitseinstellungen berücksichtigt, die von systemd selbst umgesetzt werden. Es werden keine zusätzlichen Sicherheitsmaßnahmen berücksichtigt, die möglicherweise vom Dienst selbst implementiert wurden.

$ systemd-analyze security --no-pager systemd-logind.service
  NAME                DESCRIPTION                              EXPOSURE
✗ PrivateNetwork=     Service has access to the host's network      0.5
✗ User=/DynamicUser=  Service runs as root user                     0.4
✗ DeviceAllow=        Service has no device ACL                     0.2
✓ IPAddressDeny=      Service blocks all IP address ranges
...
→ Overall exposure level for systemd-logind.service: 4.1 OK 🙂
    

13.5.13 systemd-analyze inspect-elf

Dieser Befehl lädt die angegebenen Dateien. Falls es sich bei diesen Dateien um ELF-Objekte handelt (das sind beispielsweise ausführbare Dateien, Bibliotheken oder Kerneldateien), wird der in den Dateien eingebettete Verpackungsmetadaten analysiert. Wenn solche Metadaten vorhanden sind, werden sie in einer Tabelle oder im JSON-Format ausgegeben.

$ systemd-analyze inspect-elf --json=pretty \
       core.fsverity.1000.f77dac5dc161402aa44e15b7dd9dcf97.58561.1637106137000000
{
       "elfType" : "coredump",
       "elfArchitecture" : "AMD x86-64",
      "/home/bluca/git/fsverity-utils/fsverity" : {
              "type" : "deb",
              "name" : "fsverity-utils",
              "version" : "1.3-1",
             "buildId" : "7c895ecd2a271f93e96268f479fdc3c64a2ec4ee"
      },
      "/home/bluca/git/fsverity-utils/libfsverity.so.0" : {
             "type" : "deb",
             "name" : "fsverity-utils",
             "version" : "1.3-1",
             "buildId" : "b5e428254abf14237b0ae70ed85fffbb98a78f88"
     }
}

13.5.14 systemd-analyze image-policy

Dieser Befehl analysiert den angegebenen Image-Richtliniensatz gemäß systemd.image-policy(7). Die Richtlinie wird normalisiert und vereinfacht. Für jeden aktuell definierten Partitionskennzeichner (gemäß der Spezifikation für entdeckbare Partitionen) wird die Wirkung des Image-Richtliniensatzes in tabellarischer Form angezeigt.

PARTITION       MODE        READ-ONLY GROWFS
root            encrypted   -         -
usr             verity      yes       -
home            ignore      -         -
srv             ignore      -         -
esp             ignore      -         -
xbootldr        ignore      -         -
swap            encrypted   -         -
root-verity     ignore      -         -
usr-verity      unprotected yes       -
root-verity-sig ignore      -         -
usr-verity-sig  ignore      -         -
tmp             ignore      -         -
var             ignore      -         -
default         ignore      -         -