Systemd-Targets erklärt: Boot-Zustände und Runlevels effektiv verwalten

Erfahren Sie mehr über Systemd-Targets und ihre Rolle beim Ersetzen traditioneller Linux-Runlevels. Dieser Leitfaden erläutert gängige Targets wie `multi-user.target` und `graphical.target`, wie Sie diese mit `systemctl` anzeigen, ändern und verwalten, sowie ihre Bedeutung für die moderne Initialisierung und Verwaltung von Linux-Systemen. Lernen Sie, die Startzustände und Betriebsmodi Ihres Systems effektiv zu steuern.

37 Aufrufe

Systemd-Targets erklärt: Verwaltung von Boot-Zuständen und Runlevels effektiv steuern

Systemd, der moderne Standard für die Initialisierung und Verwaltung von Diensten auf Linux-Systemen, hat einen flexibleren und robusteren Mechanismus zur Verwaltung von Systemzuständen eingeführt als die traditionellen Runlevels des init-Systems. Dieser Mechanismus ist als Systemd-Targets bekannt. Targets sind im Wesentlichen Synchronisationspunkte oder Zustände, die das System erreichen kann. Sie definieren eine Sammlung von Units (Dienste, Sockets, Einhängepunkte usw.), die aktiv sein müssen, damit sich das System in einem bestimmten Zustand befindet. Das Verständnis von Systemd-Targets ist entscheidend für die effektive Verwaltung des Bootvorgangs, der Service-Abhängigkeiten und des allgemeinen Betriebszustands Ihres Linux-Systems.

Dieser Artikel wird das Konzept der Systemd-Targets entmystifizieren, erklären, wie sie das ältere Konzept der Runlevels ersetzt haben, und einen detaillierten Einblick in ihre Struktur, ihren Zweck und ihre gängigen Anwendungsfälle geben. Wir werden untersuchen, wie man eigene benutzerdefinierte Targets anzeigt, ändert und sogar erstellt, um Ihnen eine feinere Kontrolle über das Verhalten Ihres Systems zu ermöglichen.

Die Entwicklung von Runlevels zu Systemd-Targets

Historisch gesehen verwendeten Linux-Systeme ein Konzept namens Runlevels (Betriebsstufen), um den Betriebsstatus des Systems während des Bootvorgangs und im Laufzeitbetrieb zu definieren. Ein Runlevel war eine numerische Kennung (0-6), die festlegte, welche Dienste gestartet oder gestoppt wurden. Runlevel 3 bedeutete beispielsweise typischerweise einen Multi-User-Textmodus, während Runlevel 5 eine grafische Multi-User-Umgebung anzeigte. Dieses System war zwar funktional, hatte aber Einschränkungen:

  • Starrheit: Runlevels waren oft auf eine etwas feste Weise definiert, was es schwierig machte, die genaue Menge der für einen bestimmten Zustand aktiven Dienste anzupassen.
  • Implizite Abhängigkeiten: Abhängigkeiten zwischen Diensten wurden oft indirekt über Runlevel-Zuweisungen verwaltet, was zu potenziellen Konflikten oder fehlenden Diensten führen konnte.
  • Mangelnde Granularität: Das numerische System bot keine beschreibende Klarheit, was es schwieriger machte, den beabsichtigten Zustand des Systems zu verstehen.

Systemd-Targets beheben diese Einschränkungen, indem sie einen expliziteren, abhängigkeitsgesteuerten und beschreibenderen Ansatz bieten. Anstelle von abstrakten Zahlen haben Targets aussagekräftige Namen (z. B. multi-user.target, graphical.target), die den beabsichtigten Systemzustand klar anzeigen. Abhängigkeiten werden explizit in den Unit-Dateien definiert, wodurch sichergestellt wird, dass alle notwendigen Komponenten in der richtigen Reihenfolge gestartet werden.

Systemd-Targets verstehen

Ein Systemd-Target ist selbst eine Art Unit. Wenn eine Target-Unit aktiviert wird, versucht systemd, alle Units zu aktivieren, die in der Unit-Datei dieses Targets als Abhängigkeiten aufgeführt sind. Dies erzeugt einen Kaskadeneffekt, der sicherstellt, dass alle notwendigen Dienste, Geräte und anderen Komponenten online geschaltet werden, um den gewünschten Systemzustand zu erreichen.

Schlüsselmerkmale von Systemd-Targets:

  • Abhängigkeitsverwaltung: Targets definieren, welche anderen Units aktiv sein müssen, damit das Target als erreicht gilt. Dies ist der Kern ihrer Stärke.
  • Synchronisationspunkte: Sie fungieren als Synchronisationspunkte während des Bootvorgangs. Das System fährt erst mit der nächsten Stufe fort, wenn das aktuelle Target vollständig initialisiert ist.
  • Beschreibende Benennung: Targets sind beschreibend benannt, was es einfach macht, den beabsichtigten Zustand des Systems zu verstehen (z. B. rescue.target, poweroff.target).

Häufige Systemd-Targets

Systemd wird mit einer Reihe vordefinierter Targets ausgeliefert, die die gängigen Systemzustände abdecken sollen. Deren Verständnis ist der Schlüssel zur Verwaltung Ihres Systems.

multi-user.target

Dies ist eines der grundlegendsten Targets. Es repräsentiert ein voll funktionsfähiges Multi-User-System mit aktiviertem Netzwerk, jedoch ohne einen grafischen Anmeldemanager oder eine Desktop-Umgebung. Dies ist typischerweise das Standard-Target für Server.

  • Zweck: Bereitstellung einer stabilen Umgebung für den Betrieb von Diensten und die Ermöglichung der Anmeldung mehrerer Benutzer über textbasierte Konsolen oder SSH.
  • Abhängigkeiten: Beinhaltet normalerweise Units für das Netzwerk, Systemdienste und Konsolen-Anmeldeaufforderungen.

graphical.target

Dieses Target repräsentiert ein voll funktionsfähiges Multi-User-System mit einer grafischen Desktop-Umgebung, die zur Benutzerinteraktion bereit ist. Es ist typischerweise von multi-user.target abhängig und fügt die notwendigen Komponenten für eine grafische Sitzung hinzu.

  • Zweck: Starten eines grafischen Anzeigemanagers (wie GDM, LightDM, SDDM) und der zugehörigen Desktop-Umgebung.
  • Abhängigkeiten: Erbt alle Abhängigkeiten von multi-user.target und fügt Units für den X-Server oder Wayland-Compositor, den Anzeigemanager und die Desktop-Sitzung hinzu.

rescue.target

Dieses Target bietet eine minimale Einzelbenutzerumgebung. Es wird hauptsächlich für Systemwartung und Wiederherstellung verwendet. Es startet das Basissystem und eine Root-Shell, startet jedoch normalerweise keine Netzwerk- oder Multi-User-Dienste.

  • Zweck: Bereitstellung einer sicheren Umgebung für Systemadministratoren zur Durchführung von Wartungsaufgaben ohne Einmischung anderer Dienste.
  • Abhängigkeiten: Minimale Gruppe wesentlicher Systemkomponenten und eine Root-Shell.

emergency.target

Dies ist noch minimaler als rescue.target. Es fährt das System mit einem einzigen schreibgeschützten Dateisystem und einer Root-Shell hoch. Es ist für dringende Notsituationen gedacht, in denen selbst grundlegende Dienste problematisch sein könnten.

  • Zweck: Für kritische Systemwiederherstellung, wenn selbst das rescue.target möglicherweise nicht geeignet ist.
  • Abhängigkeiten: Nur die absolut notwendigsten Systemkomponenten und eine Root-Shell (oft schreibgeschützt).

reboot.target, poweroff.target, halt.target

Dies sind spezielle Targets, die zum Herunterfahren oder Neustarten des Systems verwendet werden. Wenn systemd eines dieser Targets aktiviert, stoppt es alle laufenden Dienste und führt dann die angegebene Aktion aus (Neustart, Ausschalten oder Anhalten).

  • Zweck: Zum ordnungsgemäßen Herunterfahren oder Neustarten des Systems.
  • Abhängigkeiten: Sie hängen typischerweise von Diensten ab, die gestoppt werden müssen, bevor das System heruntergefahren werden kann.

Systemd-Targets verwalten

Systemd bietet mehrere Befehlszeilentools zur Interaktion mit Targets. Das primäre Werkzeug ist systemctl.

Aktuelles und Standard-Target anzeigen

Um zu sehen, welches Target das System gerade ausführt und welches Target es standardmäßig beim Booten verwendet, geben Sie Folgendes ein:

systemctl status

Dieser Befehl liefert eine Fülle von Informationen, einschließlich des aktiven Targets. Um das Standard-Target speziell abzufragen:

systemctl get-default

Um alle verfügbaren Targets anzuzeigen:

systemctl list-unit-files --type=target

Das Standard-Target ändern

Wenn Ihr System standardmäßig in einem anderen Target booten soll (z. B. von grafisch auf Multi-User oder umgekehrt), können Sie systemctl set-default verwenden:

Um das Standard-Target auf das grafische Target einzustellen (üblich für Desktop-Systeme):

sudo systemctl set-default graphical.target

Um das Standard-Target auf das Multi-User-Target einzustellen (üblich für Server):

sudo systemctl set-default multi-user.target

Wichtig: Die Änderung des Standard-Targets wird erst beim nächsten Neustart wirksam.

Zu einem Target wechseln (ohne Neustart)

Sie können das System sofort ohne Neustart auf ein anderes Target umschalten. Dies ist nützlich zum Testen oder zum vorübergehenden Ändern des Systemzustands. Verwenden Sie den Befehl systemctl isolate:

Zum grafischen Target wechseln:

sudo systemctl isolate graphical.target

Zum Multi-User-Target wechseln:

sudo systemctl isolate multi-user.target

Vorsicht: systemctl isolate ist ein mächtiger Befehl. Die Isolierung auf ein Target wie rescue.target oder emergency.target stoppt die meisten laufenden Dienste. Stellen Sie sicher, dass Sie die Auswirkungen verstehen, bevor Sie ihn verwenden. Sie könnten die Netzwerkverbindung oder Ihre grafische Sitzung verlieren.

Wie Targets mit Unit-Dateien zusammenhängen

Targets werden als Unit-Dateien implementiert, die sich typischerweise unter /usr/lib/systemd/system/ oder /etc/systemd/system/ befinden. Eine Target-Unit-Datei (z. B. graphical.target) legt Abhängigkeiten von anderen Units fest, einschließlich anderer Targets und Dienste.

Eine typische graphical.target-Unit-Datei könnte vereinfacht etwa so aussehen:

[Unit]
Description=Grafisches Multi-User-System
Documentation=man:systemd.special(7)
# Dieses Target soll eine Voraussetzung für den grafischen Anmelde-Manager sein.
# Es ist das Target, in das das System bootet, wenn nichts anderes angegeben wird.
Wants=display-manager.service
Before=shutdown.target

[Install]
Alias=default.target

Hierbei gilt:

  • Wants=display-manager.service: Zeigt an, dass display-manager.service (der eigentliche Anmelde-Manager wie GDM oder LightDM) gestartet werden soll, falls möglich. Dies ist eine schwächere Abhängigkeit als Requires=.
  • Before=shutdown.target: Stellt sicher, dass die grafische Umgebung gestoppt wird, bevor das System in den Abschaltvorgang übergeht.
  • Alias=default.target: Dies bewirkt, dass graphical.target als Standard fungiert, wenn default.target darauf verweist (was bei Desktop-Systemen normalerweise der Fall ist).

Erstellen benutzerdefinierter Targets

Obwohl es für den täglichen Gebrauch weniger verbreitet ist, können Sie eigene benutzerdefinierte Targets erstellen, um bestimmte Systemzustände mit eindeutigen Dienstesammlungen zu definieren.

Schritte zum Erstellen eines benutzerdefinierten Targets:

  1. Erstellen Sie eine .target-Unit-Datei: Platzieren Sie diese in /etc/systemd/system/ (z. B. my-custom.target).
    ```ini
    [Unit]
    Description=Mein benutzerdefiniertes Target

    [Install]
    WantedBy=multi-user.target # Oder ein anderes geeignetes Target
    2. **Erstellen Sie `.service`- oder andere Unit-Dateien:** Definieren Sie die Dienste und anderen Units, die für Ihr benutzerdefiniertes Target aktiv sein sollen. 3. **Abhängigkeiten hinzufügen:** Geben Sie in der Unit-Datei Ihres benutzerdefinierten Targets mit `Requires=` oder `Wants=` an, welche Units gestartet werden müssen oder sollen.ini
    [Unit]
    Description=Mein benutzerdefiniertes Target
    Wants=service1.service
    Wants=service2.service
    After=service1.service service2.service

    [Install]
    WantedBy=multi-user.target
    4. **Systemd neu laden:**bash
    sudo systemctl daemon-reload
    5. **Ihr Target aktivieren/starten:**bash
    sudo systemctl start my-custom.target

    Oder um es bootfähig zu machen

    sudo systemctl enable my-custom.target
    ```

Anwendungsfall: Stellen Sie sich eine Entwicklungsumgebung vor, in der bestimmte Datenbank- und Anwendungsserver ausgeführt werden müssen. Sie könnten ein dev-env.target erstellen, das diese Dienste startet.

Best Practices und Tipps

  • Standard verstehen: Kennen Sie das Standard-Target Ihres Systems (graphical.target oder multi-user.target), da es das anfängliche Boot-Erlebnis bestimmt.
  • isolate mit Vorsicht verwenden: Seien Sie vorsichtig bei der Verwendung von systemctl isolate, insbesondere auf Produktionssystemen, da dies laufende Dienste stören kann.
  • Abhängigkeiten prüfen: Wenn ein Dienst nicht startet, untersuchen Sie die Abhängigkeiten des Targets, mit dem er verknüpft ist, mithilfe von systemctl list-dependencies <target_name>.
  • Server vs. Desktop: Auf Servern wird multi-user.target aus Sicherheits- und Ressourceneffizienzgründen fast immer bevorzugt. Auf Desktops ist graphical.target Standard.
  • Systemwartung: Für Aufgaben, die minimale Störungen erfordern, ist rescue.target Ihr Freund. Für kritische Wiederherstellungen steht emergency.target zur Verfügung.

Fazit

Systemd-Targets stellen einen signifikanten Fortschritt gegenüber traditionellen Runlevels dar und bieten eine ausdrucksstärkere, flexiblere und abhängigkeitsbewusstere Möglichkeit zur Verwaltung von Systemzuständen. Durch das Verständnis gängiger Targets wie multi-user.target und graphical.target sowie durch das Wissen, wie Standard-Targets angezeigt und geändert werden, erhalten Sie eine größere Kontrolle über den Bootvorgang und das Laufzeitverhalten Ihres Linux-Systems. Ob Sie einen Server konfigurieren, einen Desktop verwalten oder Systemprobleme beheben, eine solide Beherrschung von Systemd-Targets ist eine unschätzbare Fähigkeit für jeden Linux-Administrator.