Systemd Essentials: Arbeiten mit Diensten, Einheiten und dem Journal

Einführung

In den letzten Jahren sind Linux-Distributionen zunehmend von anderen Init-Systemen auf systemd umgestiegen. Das systemd-Paket bietet ein schnelles und flexibles Initialisierungsmodell zur Verwaltung einer gesamten Maschine vom Bootvorgang an.

In diesem Leitfaden geben wir Ihnen einen schnellen Überblick über die wichtigsten Befehle, die Sie zur Verwaltung eines systemd-aktivierten Servers kennen sollten. Diese sollten auf jedem Server funktionieren, der systemd implementiert (jede Betriebssystemversion ab Ubuntu 15.04, Debian 8, CentOS 7, Fedora 15). Los geht’s.

Grundlegende Einheitenverwaltung

Das grundlegende Objekt, das systemd verwaltet und auf das es reagiert, ist eine „Einheit“. Einheiten können viele Typen haben, aber der häufigste Typ ist ein „Service“ (angezeigt durch eine Einheitsdateiendung .service). Um Dienste auf einem systemd-aktivierten Server zu verwalten, ist unser wichtigstes Werkzeug der Befehl systemctl.

All die normalen Init-Systembefehle haben äquivalente Aktionen mit dem Befehl systemctl. Wir werden die Einheit nginx.service verwenden, um dies zu demonstrieren (Sie müssen Nginx mit Ihrem Paketmanager installieren, um diese Servicedatei zu erhalten).

Zum Beispiel können wir den Dienst starten, indem wir eingeben:

  1. sudo systemctl start nginx.service

Wir können es erneut stoppen, indem wir Folgendes eingeben:

  1. sudo systemctl stop nginx.service

Um den Dienst neu zu starten, können wir Folgendes eingeben:

  1. sudo systemctl restart nginx.service

Um zu versuchen, den Dienst neu zu laden, ohne die normale Funktionalität zu unterbrechen, können wir Folgendes eingeben:

  1. sudo systemctl reload nginx.service

Aktivieren oder Deaktivieren von Einheiten

Standardmäßig werden die meisten systemd-Einheitsdateien nicht automatisch beim Booten gestartet. Um diese Funktionalität zu konfigurieren, müssen Sie die Einheit „aktivieren“. Dies verknüpft sie mit einem bestimmten Boot-„Ziel“, sodass sie ausgelöst wird, wenn dieses Ziel gestartet wird.

Um einen Dienst automatisch beim Booten zu starten, geben Sie Folgendes ein:

  1. sudo systemctl enable nginx.service

Wenn Sie den Dienst wieder deaktivieren möchten, geben Sie Folgendes ein:

  1. sudo systemctl disable nginx.service

Eine Übersicht über den Systemzustand erhalten

Es gibt viele Informationen, die wir von einem systemd-Server abrufen können, um einen Überblick über den Systemzustand zu erhalten.

Zum Beispiel, um alle Einheitsdateien zu erhalten, die von systemd als „aktiv“ aufgelistet sind, geben Sie Folgendes ein (Sie können tatsächlich list-units weglassen, da dies das Standardverhalten von systemctl ist):

  1. systemctl list-units

Um alle Einheiten aufzulisten, die systemd geladen oder versucht hat, in den Speicher zu laden, einschließlich derer, die derzeit nicht aktiv sind, fügen Sie den Schalter --all hinzu:

  1. systemctl list-units --all

Um alle auf dem System installierten Einheiten aufzulisten, einschließlich derer, die systemd nicht versucht hat, in den Speicher zu laden, geben Sie ein:

  1. systemctl list-unit-files

Anzeigen grundlegender Protokollinformationen

A systemd component called journald collects and manages journal entries from all parts of the system. This is basically log information from applications and the kernel.

Um alle Protokolleinträge zu sehen, beginnend mit dem ältesten Eintrag, geben Sie ein:

  1. journalctl

Standardmäßig werden Ihnen Einträge von der aktuellen und vorherigen Bootvorgängen angezeigt, wenn journald so konfiguriert ist, dass vorherige Bootaufzeichnungen gespeichert werden. Einige Distributionen aktivieren dies standardmäßig, während andere dies nicht tun (um dies zu aktivieren, bearbeiten Sie entweder die Datei /etc/systemd/journald.conf und setzen Sie die Option Storage= auf „persistent“ oder erstellen Sie das persistente Verzeichnis, indem Sie sudo mkdir -p /var/log/journal eingeben).

Wenn Sie nur die Protokolleinträge vom aktuellen Boot sehen möchten, fügen Sie die Flagge -b hinzu:

  1. journalctl -b

Um nur Kernelmeldungen zu sehen, wie sie typischerweise durch dmesg dargestellt werden, können Sie die Flagge -k verwenden:

  1. journalctl -k

Auch hier können Sie dies nur auf das aktuelle Boot beschränken, indem Sie die Flagge -b anhängen:

  1. journalctl -k -b

Abrufen von Einheitszuständen und Protokollen

Während die obigen Befehle Ihnen Zugriff auf den allgemeinen Systemzustand gaben, können Sie auch Informationen zum Zustand einzelner Einheiten abrufen.

Um einen Überblick über den aktuellen Zustand einer Einheit zu erhalten, können Sie die Option status mit dem Befehl systemctl verwenden. Dies zeigt Ihnen, ob die Einheit aktiv ist, Informationen zum Prozess und die neuesten Journal Einträge:

  1. systemctl status nginx.service

Um alle Journal Einträge für die betreffende Einheit zu sehen, geben Sie die Option -u mit dem Einheitsnamen an den Befehl journalctl an:

  1. journalctl -u nginx.service

Wie immer können Sie die Einträge auf den aktuellen Start durch Hinzufügen der Flagge -b begrenzen:

  1. journalctl -b -u nginx.service

Inspektion von Einheiten und Einheitsdateien

Bis jetzt wissen Sie, wie Sie den Zustand einer Einheit durch Starten oder Stoppen ändern können, und Sie wissen, wie Sie Zustands- und Journalinformationen anzeigen können, um eine Vorstellung davon zu bekommen, was mit dem Prozess passiert. Wir haben jedoch noch nicht gesehen, wie andere Aspekte von Einheiten und Einheitsdateien inspiziert werden können.

A unit file contains the parameters that systemd uses to manage and run a unit. To see the full contents of a unit file, type:

  1. systemctl cat nginx.service

Um den Abhängigkeitsbaum einer Einheit zu sehen (welche Einheiten systemd aktivieren wird, wenn die Einheit gestartet wird), geben Sie ein:

  1. systemctl list-dependencies nginx.service

Dies zeigt die abhängigen Einheiten mit rekursiv erweiterten target-Einheiten an. Um alle abhängigen Einheiten rekursiv zu erweitern, übergeben Sie das --all-Flag:

  1. systemctl list-dependencies --all nginx.service

Zum Anzeigen der Details der Einheiteneinstellungen auf dem System verwenden Sie die show-Option:

  1. systemctl show nginx.service

Dies gibt Ihnen den Wert jedes Parameters zurück, der von systemd verwaltet wird.

Ändern von Einheitsdateien

Wenn Sie eine Änderung an einer Einheitsdatei vornehmen müssen, ermöglicht Ihnen systemd, Änderungen direkt über den systemctl-Befehl vorzunehmen, sodass Sie nicht den tatsächlichen Dateispeicherort aufrufen müssen.

Um einen Einheitsdatei-Schnipsel hinzuzufügen, der zum Anhängen oder Überschreiben von Einstellungen in der Standard-Einheitsdatei verwendet werden kann, rufen Sie einfach die edit-Option für die Einheit auf:

  1. sudo systemctl edit nginx.service

Wenn Sie die gesamten Inhalte der Einheitsdatei anstelle eines Schnipsels ändern möchten, übergeben Sie das --full-Flag:

  1. sudo systemctl edit --full nginx.service

Nachdem Sie eine Einheitsdatei geändert haben, sollten Sie den systemd-Prozess selbst neu laden, um Ihre Änderungen zu übernehmen:

  1. sudo systemctl daemon-reload

Verwenden von Zielen (Ausführungsstufen)

Eine weitere Funktion eines Init-Systems besteht darin, den Server selbst zwischen verschiedenen Zuständen zu überführen. Traditionelle Init-Systeme bezeichnen diese in der Regel als „Runlevels“, was es dem System ermöglicht, sich zu jedem Zeitpunkt nur in einem Runlevel zu befinden.

In systemd werden stattdessen „Ziele“ verwendet. Ziele sind im Grunde Synchronisationspunkte, die der Server verwenden kann, um den Server in einen bestimmten Zustand zu versetzen. Service- und andere Unit-Dateien können an ein Ziel gebunden sein, und mehrere Ziele können gleichzeitig aktiv sein.

Um alle Ziele anzuzeigen, die auf Ihrem System verfügbar sind, geben Sie ein:

  1. systemctl list-unit-files --type=target

Um das Standardziel anzuzeigen, das systemd beim Booten erreichen möchte (was wiederum alle Unit-Dateien startet, die den Abhängigkeitsbaum dieses Ziels ausmachen), geben Sie ein:

  1. systemctl get-default

Sie können das Standardziel, das beim Booten verwendet wird, ändern, indem Sie die Option set-default verwenden:

  1. sudo systemctl set-default multi-user.target

Um zu sehen, welche Einheiten an ein Ziel gebunden sind, können Sie eingeben:

  1. systemctl list-dependencies multi-user.target

Sie können den Systemzustand ändern, um zwischen Zielen zu wechseln, indem Sie die Option isolate verwenden. Dadurch werden alle Einheiten gestoppt, die nicht an das angegebene Ziel gebunden sind. Stellen Sie sicher, dass das Ziel, das Sie isolieren, keine wesentlichen Dienste stoppt:

  1. sudo systemctl isolate multi-user.target

Server stoppen oder neu starten

Für einige der Hauptzustände, in die ein System übergehen kann, stehen Abkürzungen zur Verfügung. Beispielsweise können Sie zum Ausschalten Ihres Servers eingeben:

  1. sudo systemctl poweroff

Wenn Sie das System stattdessen neu starten möchten, können Sie dies durch Eingabe erreichen:

  1. sudo systemctl reboot

Sie können in den Rettungsmodus booten, indem Sie Folgendes eingeben:

  1. sudo systemctl rescue

Beachten Sie, dass die meisten Betriebssysteme traditionelle Aliasnamen für diese Operationen enthalten, sodass Sie einfach sudo poweroff oder sudo reboot ohne systemctl eingeben können. Dies ist jedoch nicht auf allen Systemen garantiert eingerichtet.

Nächste Schritte

Jetzt sollten Sie die Grundlagen kennen, wie man einen Server verwaltet, der systemd verwendet. Es gibt jedoch noch viel mehr zu lernen, wenn Ihre Anforderungen wachsen. Unten finden Sie Links zu Anleitungen mit weiterführenden Informationen zu einigen der von uns behandelten Komponenten in diesem Handbuch:

Indem Sie lernen, die Stärken Ihres Init-Systems zu nutzen, können Sie den Zustand Ihrer Maschinen steuern und Ihre Dienste und Prozesse einfacher verwalten.

Source:
https://www.digitalocean.com/community/tutorials/systemd-essentials-working-with-services-units-and-the-journal