Zum Inhalt springenZur Seitennavigation springen: vorherige Seite [Zugriffstaste p]/nächste Seite [Zugriffstaste n]
documentation.suse.com / Einführung in die Grundlagen von systemd

Einführung in die Grundlagen von systemd

Veröffentlicht: 12.12.2024
WAS?

systemd wird verwendet, um Systemeinstellungen und Dienste zu verwalten. systemd organisiert Aufgaben in Komponenten, die Units genannt werden, und Gruppen von Units in Zielen.

WARUM?

Lernen Sie die Grundlagen von systemd kennen, zu denen wesentliche Funktionen wie Dienstverwaltung, Verfolgung von Abhängigkeiten, Protokollierung, Ressourcenverwaltung, Socket-Aktivierung und Systemsteuerung gehören.

AUFWAND

20 Minuten Lesedauer.

ANFORDERUNGEN
  • Grundlegende Kenntnisse von Linux-Kommandos

  • Grundlegendes Verständnis von Linux-Prozessen, Daemons und Kontrollgruppen

1 Was ist systemd?

systemd ist ein System- und Dienstmanager für Linux-Betriebssysteme. Dies ist das Standardinitialisierungssystem für wichtige Linux-Distributionen. systemd wird nicht direkt vom Benutzer initiiert, sondern über /sbin/init installiert und beim ersten Booten gestartet. systemd fungiert als Init-System, das als erster Prozess beim Booten (PID 1) die Dienste im Benutzerbereich aufruft und verwaltet. PID 1 wird als init bezeichnet und ist der erste Linux-Prozess, der im Benutzermodus erstellt wird. Er wird bis zum Herunterfahren des Systems ausgeführt.

systemd besitzt PID 1 und wird direkt vom Kernel gestartet. Alle anderen Prozesse werden entweder direkt von systemd oder von einem seiner untergeordneten Prozesse gestartet. systemd hängt das Dateisystem des Hosts ein und verwaltet temporäre Dateien. Es ist abwärtskompatibel mit den SysV-init-Skripten. SysV ist ein Initialisierungssystem, das aus der Zeit vor systemd stammt.

In systemd ist eine Unit eine Ressource, von der das System weiß, wie es sie bearbeiten und verwalten kann. Dies ist das primäre Objekt, das von den systemd-Werkzeugen verwendet wird. Diese Ressourcen werden mithilfe von Konfigurationsdateien definiert, den sogenannten Unit-Dateien.

systemctl ist das zentrale Verwaltungswerkzeug für die Steuerung des init-Systems. Er wird verwendet, um den Zustand des systemd-Systems und des Dienstmanagers zu untersuchen und zu kontrollieren.

Targets in systemd sind Gruppen zusammengehöriger Units, die als Synchronisierungspunkte beim System-Bootvorgang fungieren. Target-Unit-Dateien haben die Dateinamenerweiterung .target. In Target-Units sind verschiedene systemd-Units über eine Kette von Abhängigkeiten gruppiert.

Für die Fehlersuche können Sie journalctl verwenden, mit dem Protokollmeldungen aus dem systemd-Journal abgefragt und angezeigt werden können.

Weitere Informationen zu systemd finden Sie unter https://systemd.io und man 1 systemd.

2 Der systemd-Boot-Prozess

Der erste Schritt im Boot-Prozess besteht darin, den Linux-Kernel zu laden, der die Hauptkomponente des Linux-Betriebssystems ist. Sobald der Kernel geladen ist, initialisiert er die Hardware und startet den systemd-Prozess, der der erste Prozess ist, der auf dem System läuft.

2.1 Der Linux-Boot-Prozess

Der Boot-Prozess von Linux ist die erste Phase des Starts des Betriebssystems. Es ist der Prozess, mit dem das Betriebssystem den Speicher lädt, die Komponenten initialisiert und die Ausführung von Benutzeranwendungen vorbereitet.

Der Boot- Prozess von Linux ist in vier Hauptphasen unterteilt:

Phase 1: BIOS

Wenn Sie den Computer einschalten, startet der Computer das BIOS (Basic Input/Output System) und führt einen POST (Power On Self Test) durch. Dabei handelt es sich um eine Integritätsprüfung, die die Hardwarefunktionalität von Komponenten wie Festplatten, SSD, Tastatur, RAM, USB-Anschlüssen und sonstiger Hardware prüft. Wenn die Hardware wie erwartet funktioniert, geht der Boot- Prozess in die nächste Phase über.

Phase 2: Bootloader

Sobald POST abgeschlossen ist, sucht BIOS nach dem Bootloader-Programm, das im MBR (Master Boot Record) gespeichert ist, und lädt es. Der MBR ist ein 512-Byte-Code, der sich in der Regel unter /dev/sda oder /dev/hda befindet, je nach Architektur Ihrer Festplatte. Der MBR kann sich auch auf einer Live-USB- oder DVD-Installation von Linux befinden. BIOS lädt diesen MBR-Code und führt ihn aus.

Es gibt drei Haupt-Bootloader in Linux: LILO, GRUB und GRUB2. Der GRUB2 (Grand Unified Bootloader) Bootloader ist der neueste und wichtigste Bootloader in modernen Linux-Distributionen. Die GRUB2-Konfigurationsdatei befindet sich in /boot/grub2/grub2.cfg. Sobald BIOS den GRUB2-Bootloader gefunden hat, führt es ihn aus und lädt ihn in den Hauptspeicher (RAM).

Phase 3: Initialisierung des Linux-Kernels

Der Linux-Kernel ist das Herzstück des Betriebssystems. In Ihrem Linux-System bildet der Kernel die Schnittstelle zur Hardware, steuert die Speicherverwaltung und verwaltet Prozesse. Der Bootloader lädt den ausgewählten Linux-Kernel. Der Kernel extrahiert sich selbst aus einer komprimierten Version und hängt das Root-Dateisystem ein. Er führt dann das /sbin/init-Programm aus.

Phase 4: systemd

Der Kernel lädt systemd, einen System- und Dienstmanager für Linux-Betriebssysteme. systemd führt dann alle anderen Initialisierungsprozesse aus.

2.2 Boot-Prozess mit systemd

Sobald der Kernel systemd geladen hat, übernimmt systemd und startet die anderen Systemdienste, die erforderlich sind, um das System zum Laufen zu bringen. Dazu gehören Dienste wie der Netzwerkdienst, der Anmeldemanager usw.

Der Boot-Prozess läuft in der Reihenfolge parallel ab, in der bestimmte Ziel-Units ausgeführt werden. systemd verwendet die Datei /etc/systemd/system/default.target, um das Ziel zu bestimmen, in das das Linux-System booten soll. Diese Datei ist ein Link zu graphical.target, das den grafischen Anmeldemanager startet. systemd aktiviert alle Ziel-Units, die Abhängigkeiten von default.target sind, sowie rekursiv alle Abhängigkeiten dieser Abhängigkeiten. Sobald alle Dienste gestartet sind, ist Ihr System einsatzbereit und der Login-Manager wird angezeigt. Sie können sich nun anmelden und mit dem System arbeiten.

2.3 Analysieren der Leistung des System-Boot-Prozesses mit dem Kommando systemd-analyze

Analysieren Sie mit dem Kommando systemd-analyze die Leistung des System-Boot-Prozesses. Mit dem Kommando können Sie auch andere Status- und Verfolgungsinformationen aus dem System- und Dienstmanager abrufen. Es wird verwendet, um zu überprüfen, ob die Dateien für die Units korrekt sind und um auf spezielle Funktionen zuzugreifen, die für die erweiterte Fehlersuche im Systemmanager nützlich sind.

Einige Beispiele:

Anzeigen der Zeitdauer für den Systemstart
> systemd-analyze time
Startup finished in 3.404s (kernel) + 2.415s (initrd) + 13.125s (userspace) = 18.945s
graphical.target reached after 13.117s in userspace
Abrufen einer Übersicht über den Boot-Prozess, einschließlich der gestarteten Dienste und der Zeit, die jeder Dienst zum Starten benötigt
> systemd-analyze critical-chain
  The time when unit became active or started is printed after the "@" character.
  The time the unit took to start is printed after the "+" character.

  graphical.target @13.117s
  └─multi-user.target @13.117s
    └─getty.target @13.117s
      └─getty@tty1.service @13.116s
        └─plymouth-quit-wait.service @10.775s +2.338s
          └─systemd-user-sessions.service @10.769s +3ms
            └─remote-fs.target @10.764s
              └─iscsi.service @10.747s +16ms
                └─network-online.target @10.744s
                  └─NetworkManager-wait-online.service @1.547s +9.197s
                    └─NetworkManager.service @1.507s +37ms
                      └─network-pre.target @1.504s
                        └─wpa_supplicant.service @2.341s +5ms
                          └─dbus.service @1.042s
                            └─basic.target @1.036s
                              └─sockets.target @1.036s
                                └─snapd.socket @1.035s +590us
                                  └─sysinit.target @1.030s
                                    └─systemd-update-utmp.service @1.025s +5ms
                                      └─auditd.service @976ms +47ms
                                        └─systemd-tmpfiles-setup.service @964ms +9ms
                                          └─local-fs.target @962ms
                                            └─snapd.mounts.target @961ms
                                              └─snap-core18-2796.mount @417ms +543ms
                                                └─dev-loop9.device @961ms +628us

Mit diesem Kommando wird ein Baum der zeitkritischen Units entweder für jede der angegebenen Units oder für das Standardziel ausgedruckt. Die Initialisierung von Diensten kann von der Socket-Aktivierung und der parallelen Ausführung von Units abhängen. Ähnlich wie beim Kommando blame wird hier die Zeit angezeigt, die eine Unit benötigt, um sich zu aktivieren. Für Units wie Geräte-Units, die direkt in den aktiven Zustand übergehen, ist dies nicht definiert.

Anzeigen einer Liste von Diensten, die während des Boot-Prozesses gestartet wurden und entsprechend der Zeit angezeigt werden, die jeder Dienst benötigt
> systemd-analyze blame
  9.197s NetworkManager-wait-online.service
  4.002s fwupd.service
  2.338s plymouth-quit-wait.service
  1.282s dracut-pre-udev.service
  1.062s sys-devices-platform-serial8250-tty-ttyS0.device
  1.062s dev-ttyS0.device
  1.061s dev-ttyS1.device
  1.061s sys-devices-platform-serial8250-tty-ttyS1.device
  1.060s dev-ttyS11.device
  1.060s sys-devices-platform-serial8250-tty-ttyS11.device
  1.059s sys-devices-platform-serial8250-tty-ttyS13.device
  1.059s dev-ttyS13.device
  1.059s sys-devices-platform-serial8250-tty-ttyS10.device
  1.059s dev-ttyS10.device
  1.058s sys-devices-platform-serial8250-tty-ttyS14.device
  1.058s dev-ttyS14.device
  1.058s dev-ttyS12.device
  1.058s sys-devices-platform-serial8250-tty-ttyS12.device
  1.056s sys-devices-platform-serial8250-tty-ttyS17.device

Die Initialisierung eines Dienstes kann langsam sein, weil er auf den Abschluss der Initialisierung eines anderen Dienstes wartet. Es wird die Zeit angezeigt, die eine Unit zum Aktivieren benötigt. Für Units wie Geräte-Units, die direkt in den aktiven Zustand übergehen, ist dies nicht definiert. Mit diesem Kommando werden keine Ergebnisse für Dienste mit Type=simple angezeigt, da systemd davon ausgeht, dass diese Dienste sofort gestartet werden. Daher können die Initialisierungsverzögerungen nicht analysiert werden.

Generieren einer Vektorgrafikdatei, die die Ereignisse während des Boot-Prozesses anzeigt
> systemd-analyze plot > /temp/sample.svg

Mit diesem Kommando wird im Verzeichnis temp eine SVG-Datei erstellt. Bei der SVG-Datei handelt es sich um eine Textdatei, in der eine Reihe von Grafikvektoren festgelegt ist, die von Anwendungen wie LibreOffice Draw zur Erstellung einer Grafik verwendet werden.

3 Struktur einer Unit-Datei

In systemd ist eine Unit eine Ressource, von der das System weiß, wie es sie bearbeiten und verwalten kann. Dies ist das primäre Objekt, das von den systemd-Werkzeugen verwendet wird. Diese Ressourcen werden mithilfe von Konfigurationsdateien definiert, den sogenannten Unit-Dateien. Wenn Sie bei der Arbeit systemd bereits mit Unit-Dateien vertraut sind, läuft die Verwaltung für Sie einfacher ab. Unit-Dateien verwenden eine einfache und verständliche Syntax, mit der Sie den Zweck und die Auswirkungen einer Unit bei der Aktivierung leicht erkennen können. Unit-Dateien enthalten Abschnitte mit Direktiven, beispielsweise:

[Section]
Directive1=value
Directive2=value
. . .

Unit-Dateitypen umfassen die folgenden Abschnitte:

[Unit]

Der erste Abschnitt in den meisten Unit-Dateien ist der Abschnitt [Unit]. In diesem Abschnitt definieren Sie die Metadaten der Unit-Datei und konfigurieren die Beziehung der Unit-Datei zu anderen Unit-Dateien. Dieser Abschnitt wird in der Regel an erster Stelle platziert, da er einen Überblick über die Unit-Datei gibt.

[Automount] / [Mount] / [Path] / [Service] / [Slice] / [Socket] /[Swap] / [Timer]

Abschnitte mit Direktiven speziell für den jeweiligen Typ. Eine Liste der verfügbaren Typen finden Sie unter Abschnitt 4, „Unit-Dateitypen“. Beachten Sie, dass die Typen device, target, snapshot und scope keinen typenspezifischen Abschnitt haben.

[Install]

Dies ist oft der letzte Abschnitt in der Unit-Datei und ist optional. In diesem Abschnitt wird das Verhalten einer Unit-Datei definiert, wenn sie aktiviert oder deaktiviert wird. Wenn Sie eine Unit-Datei aktivieren, wird sie automatisch beim Booten gestartet. Je nach Unit besteht ggf. eine Abhängigkeit von anderen, zugehörigen Units, damit die Unit ordnungsgemäß arbeitet. Zum Beispiel benötigt chrony die Anweisungen After, Wants und Before, die alle Abhängigkeiten für chrony sind, damit es funktioniert.

Beispiel 1: Eine systemd-Dienstdatei
[Unit]
Description=usbguard 1

[Service]
ExecStart=/usr/sbin/usb-daemon 2

[Install]
WantedBy=multi-user.target 3

1

Eine kurze und aussagekräftige Beschreibung, in der der Zweck der Dienstdatei erläutert wird.

2

Gibt das Programm an, das ausgeführt werden soll, wenn der Dienst gestartet wird.

3

Startet ein Mehrbenutzersystem mit Netzwerk und ohne grafische Umgebung. Mit dieser Direktive können Sie eine Abhängigkeitsbeziehung festlegen.

4 Unit-Dateitypen

Der Typ einer Unit geht aus ihrer Dateinamenerweiterung hervor. systemd kategorisiert Units gemäß dem Typ der Ressource, den sie beschreiben.

Verfügbare Unit-Dateitypen für systemd

.service

Beschreibt, wie ein Dienst oder eine Anwendung verwaltet wird. Dazu gehört, wie Sie den Dienst starten oder stoppen, seine Konfigurationsdatei neu laden (falls zutreffend), unter welchen Bedingungen der Dienst automatisch startet sowie die Abhängigkeit oder die Hierarchieinformationen für zugehörige Unit-Dateien.

.scope

Diese Unit-Datei wird von systemd automatisch aus den von der D-Bus-Schnittstelle empfangenen Informationen erstellt und dient der Verwaltung von extern festgelegten Systemprozessen.

.path

Definiert einen Pfad für die pfadbasierte Aktivierung. Standardmäßig wird eine .service-Unit-Datei mit demselben Basisnamen aktiviert. inotify ist eine Kernel-API und wird von Programmen verwendet, die über Änderungen an Dateien benachrichtigt werden sollen.

.snapshot

Das Kommando systemctl snapshot erstellt automatisch eine .snapshot-Unit-Datei. Dieses Kommando erstellt temporäre Snapshots mit dem aktuellen Systemstatus. Sie können den aktuellen Systemstatus bearbeiten, nachdem Sie Änderungen vorgenommen haben. Die Snapshots ermöglichen ein Rollback eines temporären Status.

.timer

Definiert einen Zeitgeber, der von systemd verwaltet wird. Dies ist mit einem Cron-Auftrag für die verzögerte oder geplante Aktivierung vergleichbar. Beim Erreichen des Zeitgebers wird eine Unit-Datei mit demselben Namen, jedoch mit der Dateinamenerweiterung .service gestartet.

.slice

Verknüpfte Linux-Steuerungsgruppenknoten, mit denen Ressourcen zu Prozessen zugewiesen (oder auf Prozesse beschränkt) werden, die mit dem Abschnitt verknüpft sind. Der Name weist auf die Hierarchie in der Steuerungsgruppen-Baumstruktur hin. Units werden standardmäßig nach ihrem Typ in Abschnitte platziert.

.target

Führt die Synchronisierung für andere Units bei einem Bootvorgang oder einer Statusänderung durch oder versetzt das System in einen neuen Status. Andere Units geben ihre Beziehung zu Targets an, damit sie mit den Vorgängen des Targets synchronisiert werden.

.socket

Beschreibt ein Netzwerk, einen IPC-Socket oder einen FIFO-Puffer, mit dem systemd die socketbasierte Aktivierung durchführt. Es gibt eine verknüpfte .service-Datei, die gestartet wird, wenn eine Aktivität auf dem Socket festgestellt wird, der in dieser Unit definiert ist.

.device

Definiert ein Gerät, das für die systemd-Verwaltung durch das udev- oder sysfs-Dateisystem bestimmt ist. Die .device-Datei ist nicht auf allen Geräten vorhanden. Diese Unit-Datei ist für das Sortieren und Einhängen eines Geräts sowie für den Zugriff auf das betreffende Gerät erforderlich.

.swap

Definiert den Swap-Speicher im System. Der Name der Unit-Datei muss den Geräte- oder Dateipfad des Raums wiedergeben.

.mount

Definiert einen Einhängepunkt im System, der von systemd verwaltet werden soll. Diese Datei ist nach dem Einhängepfad benannt, wobei die Schrägstriche in Bindestriche umgewandelt werden. Für Einträge in /etc/fstab können Units automatisch erstellt werden.

.automount

Definiert einen Einhängepunkt, der automatisch eingehängt wird. Benennen Sie die Datei nach dem Einhängepunkt, auf den sie sich bezieht. Eine passende .mount-Unit-Datei ist erforderlich, in der die Einzelheiten für das Einhängen definiert werden.

5 Abhängigkeiten und Reihenfolge der Units

systemd hat zwei Arten von Abhängigkeiten: Anforderungs- und Auftragsabhängigkeiten. Anforderungs-Abhängigkeiten geben an, welche anderen Units beim Aktivieren einer Unit entweder gestartet oder gestoppt werden müssen. Reihenfolgen-Abhängigkeiten geben die Reihenfolge an, in der die Units gestartet werden müssen.

Unit-Abhängigkeiten

Unit-Dateien nutzen die Abhängigkeitsfunktion. Für eine Unit sind ggf. eine oder mehrere andere Units wünschenswert oder erforderlich, bevor die betreffende Unit ausgeführt werden kann. Diese Abhängigkeiten werden in Unit-Dateien mit den Anweisungen Wants und Requires festgelegt

Wants

Wenn Unit A beispielsweise Wants=unit B enthält, wird beim Ausführen von Unit A auch Unit B ausgeführt. Doch ob Unit B erfolgreich startet oder nicht, wirkt sich nicht auf die erfolgreiche Ausführung von Unit A aus.

Requires

Enthält Unit A den Eintrag Requires=unit B, werden beide Units ausgeführt, doch wenn Unit B nicht erfolgreich ausgeführt wird, wird Unit A deaktiviert. Dabei spielt es keine Rolle, ob die Prozesse von Unit A erfolgreich ausgeführt worden wären.

Unit-Reihenfolge

Ohne genaue Anweisungen kann systemd eine Gruppe von Units gleichzeitig ausführen. Das Starten der Dienste in der richtigen Reihenfolge ist für die ordnungsgemäße Funktionsfähigkeit des Linux-Systems wichtig. Sie können die Reihenfolge mit den Anweisungen Before und After für die Unit-Datei festlegen.

Before

Wenn Unit A beispielsweise Before=unit B enthält, wird beim Ausführen der beiden Units zunächst Unit A vollständig ausgeführt und dann erst Unit B.

After

Wenn Unit A den Eintrag After=unit B enthält, wird beim Ausführen der beiden Units zunächst Unit B vollständig ausgeführt und dann erst Unit A.

6 Protokollierung

Protokolldateien und Journale sind wichtig für die Systemverwaltung. Sie liefern detaillierte Informationen über ein System und sind sehr wichtig für die Fehlersuche und Revision. Protokolldateien enthalten Ereignisse und Meldungen, die vom Kernel, den Anwendungen und den Benutzern, die sich am System anmelden, erzeugt werden. Mit dem Kommando journalctl können Sie das Journal abfragen. Dieses Kommando zeigt Protokolle an, die von systemd erfasst wurden. Der systemd-journald-Dienst steuert die Protokollerfassung durch systemd. systemd-journald speichert die Ereignisse und Meldungen in einem binären Format.

7 systemd-Targets

systemd verwendet Units und Ziele. Eine systemd-Unit definiert einen Dienst oder eine Aktion im System, die aus einem Namen, einem Typ und einer Konfigurationsdatei besteht. Ein systemd-Ziel kombiniert mehrere Units und definiert, welche Dienste gestartet werden müssen, um das Ziel zu erreichen. Auf einem Server zum Beispiel ist dies ein Zustand, in dem das Netzwerk in Betrieb ist und sich mehrere Benutzer anmelden können. Diese Dateien sind an dem Suffix .target erkennbar.

Ähnlich wie die Unit-Dateien können mehrere Targets mithilfe von Abhängigkeiten verschachtelt werden. Zum Beispiel benötigt multi-user.target (unter anderem) die Ziele, die die Anmelde- und Benutzersitzungsdienste festlegen.

Gängige systemd-Targets:

default.target

Bootet standardmäßig. Die Datei default.target ist ein symbolischer Link zur eigentlichen Target-Datei, z. B. graphical.target für eine Desktop-Arbeitsstation. Für einen Server ist dies in der Regel graphical.target.

poweroff.target

Fährt das System herunter und schaltet es aus.

rescue.target

Ziel-Unit, die das Basissystem abruft und eine Rettungs-Shell-Sitzung startet.

multi-user.target

Richtet ein nicht grafisches (Konsolen-)Mehrbenutzersystem ein.

graphical.target

Verwendet ein grafisches Mehrbenutzersystem mit Netzwerkdiensten.

reboot.target

Fährt das System herunter und bootet es neu.

Weitere Informationen zu systemd-Zielen finden Sie unter man 5 systemd.target und man 7 systemd.special.

8 Verwenden von systemd als normaler Benutzer

Sie können systemd als regulären Benutzer verwenden, um die Sicherheit zu erhöhen wurde oder wenn Sie keine root-Benutzer-Rechte haben. Sie können einen Dienst ohne Rechte ausführen, indem Sie einen user-Dienst erstellen.

Wenn Sie einen Benutzerdienst erstellen und verwenden, sollten Sie Folgendes beachten:

  • Benutzerdienstsitzungen werden beendet, wenn die Sitzung des Benutzers endet. Dieses Verhalten lässt sich mit dem Kommando loginctl enable-linger USERNAME überschreiben.

  • Benutzerdienstdateien befinden sich unter /etc/systemd/user oder $HOME/.config/systemd/user/.

  • Sie können Benutzerdienste mit dem Kommando systemctl --user steuern.

9 systemctl-Kommandos

Das Kommando systemctl wird verwendet, um den Zustand von systemd und des Dienstmanagers zu untersuchen und zu kontrollieren.

Sie können die folgenden allgemeinen systemctl-Kommandos verwenden und sich auf der Seite man systemctl informieren.

9.1 Anzeigen von systemd-Informationen

Zum Anzeigen von Informationen über systemd-Komponenten können Sie die folgenden Kommandos verwenden:

systemctl list-units

Listet die systemd-Units auf. Sie können die optionalen Argumente verwenden: --state=running um die aktiven Units anzuzeigen und --type=service, um die beendeten und aktiven Units anzuzeigen.

systemctl list-unit-files

Listet die systemd-Units und den Status auf, z. B. statisch, generiert, deaktiviert, Alias, maskiert und aktiviert.

systemctl list-dependencies

Zeigt die Abhängigkeits-Baumstruktur.

systemctl list-dependencies UNIT_FILE

Listet die Abhängigkeiten einer Unit-Datei auf.

9.2 Verwalten von systemd-Diensten

Mit dem Kommando systemctl können Sie die folgenden Aufgaben mit Diensten durchführen.

systemctl status SERVICE

Prüft den Status des betreffenden Dienstes.

systemctl show SERVICE

Zeigt die Dienstinformationen an.

systemctl start SERVICE

Statt den Dienst manuell zu starten, verwenden Sie das Kommando start. Wenn eine Änderung an der Konfigurationsdatei vorgenommen wird, muss der zugehörige Dienst noch einmal gestartet werden.

systemctl stop SERVICE

Stoppt einem bestimmten laufenden Dienst.

systemctl restart SERVICE

Statt den Dienst manuell neu zu starten, verwenden Sie das Kommando restart. Wenn eine Änderung an der Konfigurationsdatei vorgenommen wird, muss der zugehörige Dienst noch einmal neu gestartet werden.

systemctl enable SERVICE

Aktiviert den Dienst beim Booten.

systemctl disable SERVICE

Deaktiviert den Dienst beim Booten.

systemctl reload-or-restart SERVICE

Lädt den Dienst neu, sofern er das Neuladen unterstützt; ansonsten wird der Dienst neu gestartet. Wenn der Dienst nicht ausgeführt wird, wird er neu gestartet.

systemctl mask SERVICE

Wenn dies maskiert ist, bedeutet dies, dass die Unit-Datei per Symlink mit /dev/null verbunden ist. Ein Symlink für einen maskierten Dienst wird in /etc/systemd/system erstellt und verweist auf /dev/null. Damit ist es selbst dann nicht möglich, den Dienst zu laden, wenn er für einen anderen aktivierten Dienst erforderlich ist. Er muss manuell gestoppt werden, ansonsten wird er im Hintergrund weiter ausgeführt. Mit der Option --runtime können Sie die Maskierung temporär bis zum nächsten Neubooten des Systems anwenden.

Created symlink /etc/systemd/system/FOSSLinux.service → /dev/null.
systemctl unmask SERVICE

Demaskiert den Dienst. Dieser Punkt tritt in Kraft, wenn das System manuell gestartet oder neu gestartet wird.

9.3 Verwalten des Systemstatus

Mit dem Kommando systemctl können Sie Energieverwaltungsprozesse auf Ihrem System durchführen, beispielsweise Neustart, Herunterfahren usw., wie unten beschrieben.

systemctl reboot

Bootet das System reboot.target neu.

systemctl poweroff

Schaltet das System poweroff.target aus.

systemctl emergency

Wechselt in den Notfallmodus emergency.target.

systemctl default

Wechselt zum Standard-Target multi-user.target zurück.

10 Fehlerbehebung für systemd

Mit den folgenden Tipps zur Fehlersuche können Sie Probleme mit systemd-Diensten erkennen und beheben und einen reibungslosen Systembetrieb sicherstellen.

Syntax der systemd-Unit-Datei mit dem Kommando systemd-analyze verify SERVICE prüfen

Bevor Sie einen systemd-Dienst starten oder aktivieren, prüfen Sie die Syntax der Unit-Datei daraufhin, ob eventuell Fehler vorliegen. Beispiel:

> sudo systemd-analyze verify /etc/systemd/system/my-custom-service.service

Das Kommando analysiert die Unit-Datei und meldet etwaige Syntaxfehler, fehlende Dateien oder andere Probleme. Sie müssen alle gemeldeten Probleme beheben, bevor Sie den Dienst aktivieren und starten.

Protokolle für den Dienst mit dem Kommando journalctl -u SERVICE prüfen

Falls Probleme mit einem systemd-Dienst auftreten, prüfen Sie das Protokoll dieses Dienstes. Beispiel:

> sudo  journalctl -u my-custom-service.service

Das Kommando zeigt Protokolle für den angegebenen Dienst, die alle Fehlermeldungen, Warnungen oder andere relevante Informationen enthalten. Anhand dieser Protokolle können Sie Probleme mit dem Dienst erkennen und beheben.

Bootvorgang mit dem Kommando systemd-analyze plot visualisieren

Wenn ein Dienst während des Boot-Prozesses Probleme verursacht, können Sie mit systemd-analyze plot command den Boot-Prozess visualisieren und Probleme identifizieren. Beispiel:

> sudo systemd-analyze plot > boot-plot.svg

Mit dem Kommando wird eine SVG-Datei namens boot-plot.svg erstellt, die eine grafische Darstellung des Boot-Prozesses und möglicher Probleme enthält. Dazu gehören auch die Start- und Endzeiten der einzelnen Dienste. Sie können diese Datei in einem SVG-kompatiblen Bildbetrachtungsprogramm oder Webbrowser öffnen und dann die Dienste analysieren, die Probleme beim Bootvorgang verursachen.

Fehlerbehebung für fehlerhafte Dienste

So finden Sie heraus, welche Dienste ausgefallen sind und können die Protokollausgabe einsehen:

> sudo systemctl --state=failed
Laufzeitstatus eines Dienstes prüfen

So ermitteln Sie den aktuellen Laufzeitstatus eines Dienstes:

> sudo systemctl status SERVICE
Herunterfahren oder Neubooten dauert lange

Wenn das Herunterfahren oder Neubooten lange dauert, kann dies darauf hinweisen, dass ein Dienst nicht geschlossen wird. systemd wartet eine gewisse Zeit ab, bis jeder Dienst geschlossen wird, bevor versucht wird, den betreffenden Dienst zu beenden. Häufig liegt das Problem daran, dass ein Dienst angehalten oder sich beim Herunterfahren aufgehängt hat. So klären Sie diesen Punkt:

> sudo systemctl poweroff
  Failed to power off system via logind: There's already a shutdown or sleep operation in progress
> sudo systemctl list-jobs

Sie können die laufenden und wartenden Aufträge abbrechen und erneut herunterfahren oder neu starten:

> sudo systemctl cancel
> sudo systemctl stop systemd-suspend.service

11 Bewährte Verfahren für systemd

Die bewährten Verfahren helfen Ihnen dabei, effiziente systemd-Dienste zu erhalten, die verschiedene Situationen bewältigen können.

Laufzeitstatus eines Dienstes prüfen

So ermitteln Sie den aktuellen Laufzeitstatus eines Dienstes:

> sudo systemctl status SERVICE
Den absoluten Pfad in der systemd-Unit-Datei angeben

Verwenden Sie einen absoluten Pfad für ausführbare Dateien und erforderliche Dateien, wie Konfigurationsdateien oder Skripte in Ihrer Unit-Datei systemd. systemd ermittelt den Speicherort der Dateien nicht anhand der Umgebungsvariablen des Benutzers wie $PATH.

ExecReload-Direktive verwenden

Fügen Sie die Direktive ExecReload in den Abschnitt [SERVICE] ein, wenn Sie ein bestimmtes Kommando definieren möchten, das ausgeführt werden soll, sobald Sie einen Dienst mit dem Kommando systemctl reload neu laden. Diese Vorgehensweise eignet sich für Dienste, die ihre Konfiguration dynamisch ohne Neustart erneut laden können.

[Service]
ExecStart=PATH_TO_EXECUTABLE
ExecReload=PATH_TO_RELOAD_SCRIPT
RestartSec-Direktive verwenden

Fügen Sie die Direktive RestartSec in den Abschnitt [SERVICE] ein, wenn Sie eine Verzögerung (in Sekunden) definieren möchten, bevor der Dienst nach einem Fehler neu gestartet wird. Diese Vorgehensweise eignet sich für Dienste, bei denen es eine gewisse Zeit dauert, bis Ressourcen freigegeben werden. Außerdem können damit schnelle Neustartschleifen verhindert werden, die eine hohe Systemauslastung verursachen können.

[Service]
ExecStart=PATH_TO_EXECUTABLE
Restart=on-failure
RestartSec=5
Notfallmodus auf einem entfernten Computer deaktivieren

Sie können den Notfallmodus auf einem entfernten Computer deaktivieren, z. B. auf einer virtuellen Maschine, die in der Google-Cloud gehostet wird. Wenn dieser Modus aktiviert ist, kann sich der betreffende Computer nicht mit dem Netzwerk verbinden. Beispiel:

> sudo systemctl mask emergency.service
> sudo systemctl mask emergency.target