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.targetund 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.targetmö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, dassdisplay-manager.service(der eigentliche Anmelde-Manager wie GDM oder LightDM) gestartet werden soll, falls möglich. Dies ist eine schwächere Abhängigkeit alsRequires=.Before=shutdown.target: Stellt sicher, dass die grafische Umgebung gestoppt wird, bevor das System in den Abschaltvorgang übergeht.Alias=default.target: Dies bewirkt, dassgraphical.targetals Standard fungiert, wenndefault.targetdarauf 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:
-
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.targetOder 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.targetodermulti-user.target), da es das anfängliche Boot-Erlebnis bestimmt. isolatemit Vorsicht verwenden: Seien Sie vorsichtig bei der Verwendung vonsystemctl 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.targetaus Sicherheits- und Ressourceneffizienzgründen fast immer bevorzugt. Auf Desktops istgraphical.targetStandard. - Systemwartung: Für Aufgaben, die minimale Störungen erfordern, ist
rescue.targetIhr Freund. Für kritische Wiederherstellungen stehtemergency.targetzur 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.