Systemd Targets verstehen: Wesentliche Konzepte erklärt
Systemd hat sich zum De-facto-Init-System für die meisten Linux-Distributionen entwickelt und die Verwaltung von Diensten und Prozessen revolutioniert. Im Mittelpunkt der ausgeklügelten Systeminitialisierungs- und Statusverwaltungsfunktionen von systemd steht das Konzept der Targets. Targets sind weit mehr als nur eine Sammlung von Diensten; es sind spezielle systemd-Units, die einen gewünschten Systemzustand definieren und als Synchronisationspunkte während des Bootvorgangs und darüber hinaus fungieren.
Dieser Artikel zielt darauf ab, systemd Targets zu entmystifizieren und ihre grundlegende Rolle beim Gruppieren anderer Units und der Steuerung des Gesamtzustands Ihres Systems zu erläutern. Wir werden untersuchen, wie sich Targets zu traditionellen Runlevels verhalten, die gängigsten Targets detailliert beschreiben, denen Sie begegnen werden, und praktische Befehle für deren Interaktion und Verwaltung bereitstellen. Am Ende werden Sie ein klares Verständnis dafür haben, wie Targets den Weg Ihres Systems vom Einschalten bis zu einer voll funktionsfähigen Umgebung orchestrieren.
Was sind Systemd Targets?
Im systemd-Ökosystem ist ein Target eine spezielle Art von Unit-Datei (wie .service- oder .socket-Dateien), die einem wichtigen Organisationszweck dient. Im Gegensatz zu Service-Units, die definieren, wie ein bestimmter Prozess gestartet oder gestoppt wird, definieren Target-Units einen Systemzustand oder eine Sammlung von Units, die zusammen aktiv sein sollen. Sie fungieren als logische Gruppierungspunkte und Synchronisationspunkte für andere systemd-Units.
Stellen Sie sich Targets als Meilensteine im Betriebsablauf des Systems vor. Wenn systemd bootet, startet es nicht einfach willkürlich eine Liste von Diensten; es arbeitet darauf hin, ein bestimmtes Target zu erreichen. Dieses Target wiederum zieht alle notwendigen Dienste, Sockets, Mount Points und andere Targets an, die für das Erreichen dieses Zustands erforderlich sind. Dieser abhängigkeitsgesteuerte Ansatz gewährleistet einen vorhersehbaren und effizienten Bootvorgang.
Für diejenigen, die mit älteren Linux-Init-Systemen wie SysVinit vertraut sind, sind systemd Targets das moderne Äquivalent von Runlevels. Während SysVinit einen festen Satz von Runlevels hatte (z.B. Runlevel 3 für den Mehrbenutzer-Textmodus, Runlevel 5 für den Mehrbenutzer-Grafikmodus), sind systemd Targets flexibler. Sie sind benannt, nicht nummeriert, und Sie können benutzerdefinierte Targets definieren, was eine größere Granularität und Erweiterbarkeit bietet.
Wie Targets funktionieren: Gruppierung und Abhängigkeiten
Targets erreichen ihre Gruppierungs- und Zustandsdefinierungsfähigkeiten durch explizite Abhängigkeiten, die in ihren Unit-Dateien definiert sind. Die wichtigsten hierfür verwendeten Direktiven sind Wants=, Requires=, After= und Before=.
Wants=: Spezifiziert „schwache“ Abhängigkeiten. Wenntarget AWants=unit B, versucht systemd,unit Bzu starten, wenntarget Aaktiviert wird.target Awird jedoch weiterhin gestartet, auch wennunit Bnicht gestartet werden kann. Dies wird häufig verwendet, um verwandte Dienste zu gruppieren, die wünschenswert, aber nicht unbedingt essentiell sind.Requires=: Spezifiziert „starke“ Abhängigkeiten. Wenntarget ARequires=unit B, mussunit Berfolgreich gestartet werden, damittarget Aaktiviert werden kann. Wennunit Bfehlschlägt, schlägt auchtarget Afehl oder startet nicht. Dies wird für kritische Abhängigkeiten verwendet.After=: Definiert eine Reihenfolge-Abhängigkeit. Wenntarget AAfter=unit Bhat, startettarget Anur nachdemunit Bgestartet wurde. Dies impliziert keine Abhängigkeit vom Erfolg, sondern nur die Reihenfolge.Before=: Das Gegenteil vonAfter=. Wenntarget ABefore=unit Bhat, startetunit Bnur nachdemtarget Agestartet wurde.Conflicts=: Stellt sicher, dass bestimmte Units nicht gleichzeitig aktiv sind. Wenntarget AConflicts=unit Bhat, stoppt die Aktivierung vontarget Adieunit B, falls diese läuft, und umgekehrt.
Diese Direktiven ermöglichen es Targets, als robuste Orchestratoren zu fungieren, Dienste und andere Targets nach Bedarf einzubeziehen und die Reihenfolge zu definieren, in der sie gestartet werden sollen. Zum Beispiel hat multi-user.target typischerweise Wants= network.target und verschiedene andere Dienste, um sicherzustellen, dass sie aktiv sind, wenn das System einen Mehrbenutzerzustand erreicht.
Sie können den Inhalt einer Target-Unit-Datei überprüfen, um deren Abhängigkeiten einzusehen:
systemctl cat multi-user.target
Dieser Befehl gibt den Inhalt der multi-user.target-Unit-Datei aus und zeigt deren Description, Documentation und, entscheidend, deren Wants=, Requires=, After= und andere Direktiven, die definieren, was den Mehrbenutzerzustand ausmacht.
Häufige Systemd Targets erklärt
Systemd bietet eine Vielzahl vordefinierter Targets, von denen jedes einem bestimmten Systemzustand oder einer bestimmten Funktionalität entspricht. Ihr Verständnis ist für die Systemadministration von entscheidender Bedeutung:
default.target: Dies ist das wichtigste Target, da es den Standardzustand definiert, in den Ihr System booten wird. Es ist normalerweise ein Symlink entweder zugraphical.target(für Desktops) odermulti-user.target(für Server).graphical.target: Dieses Target wird typischerweise für Systeme mit einer grafischen Desktop-Umgebung verwendet. Es ziehtmulti-user.targetherein und fügt dann die für den grafischen Login-Manager und den Display-Server (z.B. GDM, LightDM, Xorg, Wayland) erforderlichen Dienste hinzu.multi-user.target: Dies ist der Standardzustand für Mehrbenutzersysteme ohne grafische Oberfläche. Es ist üblich für Server und stellt alle notwendigen Dienste für den Kommandozeilenzugriff, die Netzwerkverbindung und die meisten Daemon-Operationen bereit.basic.target: Ein minimaler Zustand, der grundlegende Systemdienste für fundamentale Operationen enthält, jedoch vormulti-user.target. Es zieht typischerweisesysinit.targetund andere essentielle Dienste herein.sysinit.target: Dieses Target wird sehr früh im Bootvorgang erreicht. Es ist verantwortlich für zentrale Systeminitialisierungsaufgaben wie das Einhängen von/etc/fstab-Dateisystemen (ausgenommen entfernte), das Einrichten des Swaps und andere hardwarebezogene Initialisierungen.local-fs.target: Stellt sicher, dass alle in/etc/fstabangegebenen lokalen Dateisysteme eingehängt sind.remote-fs.target: Stellt sicher, dass alle in/etc/fstabangegebenen entfernten Dateisysteme (z.B. NFS, CIFS) eingehängt sind.network.target: Zeigt an, dass eine grundlegende Netzwerkkonnektivität verfügbar ist (z.B. Netzwerk-Interfaces sind aktiv). Es garantiert keine vollständige Internetkonnektivität oder IP-Adresszuweisung.network-online.target: Ein robusteres Netzwerk-Target, das anzeigt, dass das System über volle Netzwerkkonnektivität verfügt, einschließlich zugewiesener IP-Adressen und potenziell erreichbarer Gateways. Dienste, die aktiven Internetzugang benötigen, solltenAfter=network-online.targethaben.rescue.target: Bietet eine Single-User-Shell mit minimal laufenden Diensten und eingehängten lokalen Dateisystemen. Nützlich für Systemwiederherstellung und Fehlerbehebung.emergency.target: Eine noch minimalere Umgebung alsrescue.target. Es bietet eine Shell auf dem Root-Dateisystem, das typischerweise schreibgeschützt eingehängt ist. Es werden keine anderen Dienste gestartet. Für kritische Notfallsituationen.poweroff.target,reboot.target,halt.target: Diese Targets werden verwendet, um das System herunterzufahren, neu zu starten oder anzuhalten. Wenn sie aktiviert werden, stoppen sie die meisten Dienste und bereiten das System auf den gewünschten Stromzustand vor.
Systemd Targets verwalten
Die Interaktion mit systemd Targets erfolgt hauptsächlich über das Kommandozeilenprogramm systemctl.
Aktive und Standard-Targets anzeigen
Um zu sehen, in welchem Target Ihr System derzeit läuft:
systemctl get-default
Um alle aktuell geladenen Target-Units aufzulisten:
systemctl list-units --type=target
Dieser Befehl zeigt aktive, geladene und statische Targets zusammen mit ihren Beschreibungen an.
Das Standard-Boot-Target ändern
Sie können das Target ändern, in das Ihr System standardmäßig bootet. Um beispielsweise multi-user.target als Standard festzulegen:
sudo systemctl set-default multi-user.target
Um zu graphical.target zurückzukehren:
sudo systemctl set-default graphical.target
Dieser Befehl erstellt einen symbolischen Link von /etc/systemd/system/default.target zur gewünschten Target-Datei.
Temporäres Booten in ein anderes Target
Manchmal müssen Sie nur einmal in ein bestimmtes Target booten (z.B. zur Fehlerbehebung). Dies erreichen Sie, indem Sie während des Bootvorgangs einen Kernelparameter anhängen. Wenn das GRUB-Bootmenü erscheint, bearbeiten Sie den Booteintrag (normalerweise durch Drücken von e) und fügen Sie systemd.unit=target_name.target zur Kernel-Befehlszeile hinzu.
Zum Beispiel, um in den Rescue-Modus zu booten:
systemd.unit=rescue.target
Targets während der Laufzeit wechseln
Sie können während des Betriebs zu einem anderen Target wechseln, indem Sie den Befehl systemctl isolate verwenden. Dieser Befehl stoppt alle Dienste, die vom neuen Target nicht benötigt werden, und startet alle Dienste, die dafür erforderlich sind.
Warnung: Die Verwendung von systemctl isolate kann den Betrieb Ihres Systems stören, insbesondere wenn Sie von einem Desktop-Rechner von graphical.target zu einem viel niedrigeren Target wie multi-user.target wechseln. Gehen Sie mit Vorsicht vor.
Um von graphical.target zu multi-user.target zu wechseln:
sudo systemctl isolate multi-user.target
Um zu graphical.target zurückzukehren (vorausgesetzt, dies war der vorherige Zustand):
sudo systemctl isolate graphical.target
Benutzerdefinierte Targets erstellen
Obwohl systemd viele nützliche Targets bereitstellt, können Sie Situationen finden, in denen die Erstellung eines benutzerdefinierten Targets vorteilhaft ist. Dies gilt insbesondere für komplexe Anwendungsbereitstellungen, bei denen Sie mehrere Dienste gruppieren müssen, die immer zusammen starten und stoppen sollen, oder um eine bestimmte Umgebung für Ihre Anwendung zu definieren.
So erstellen Sie ein benutzerdefiniertes Target:
- Erstellen Sie eine
.target-Datei: Legen Sie sie in/etc/systemd/system/ab. Zum Beispielmy-application.target.
ini # /etc/systemd/system/my-application.target [Unit] Description=My Custom Application Target Wants=my-database.service my-webserver.service After=my-database.service my-webserver.serviceDescription: Eine menschenlesbare Beschreibung.Wants=: Listet die Dienste oder andere Targets auf, die dieses Target einbeziehen soll.After=: Definiert die Reihenfolge. Das Target startet nach diesen Units.
- Erstellen Sie die Dienste: Stellen Sie sicher, dass
my-database.serviceundmy-webserver.service(oder welche Dienste Sie auch immer auflisten) existieren und ordnungsgemäß konfiguriert sind. - Systemd neu laden: Informieren Sie systemd über die neue Unit-Datei.
bash sudo systemctl daemon-reload - Aktivieren und Starten: Sie können Ihr benutzerdefiniertes Target nun aktivieren und starten, wodurch wiederum die von ihm gewünschten Dienste gestartet werden.
bash sudo systemctl enable my-application.target sudo systemctl start my-application.target
Dies ermöglicht es Ihnen, eine Gruppe verwandter Dienste als eine einzige logische Einheit zu verwalten, was komplexe Anwendungsbereitstellungen vereinfacht.
Fehlerbehebung mit Targets
Targets sind auch bei der Fehlerbehebung von Bootproblemen oder Dienstausfällen von unschätzbarem Wert:
- Abhängigkeiten identifizieren: Wenn ein Dienst nicht startet, kann die Überprüfung des Targets, zu dem er gehört, fehlende oder fehlerhafte Abhängigkeiten aufdecken. Verwenden Sie
systemctl status <service_name>undsystemctl list-dependencies <target_name>. - In minimale Targets booten: Wenn Ihr System nicht in
graphical.targetodermulti-user.targetbootet, versuchen Sie, mit der Kernelparameter-Methode inrescue.targetoderemergency.targetzu booten. Dies bietet eine minimale Umgebung, in der Sie Probleme ohne die Komplexität vieler laufender Dienste diagnostizieren können. - Protokolle prüfen: Überprüfen Sie nach dem Versuch, ein Target oder einen Dienst zu starten, immer die
journalctl-Protokolle auf Fehler:
bash journalctl -b -u <target_or_service_name>
Best Practices und Tipps
network-online.targetbevorzugen: Wenn Ihr Dienst eine aktive Netzwerkkonnektivität benötigt (z.B. um eine externe API zu erreichen), stellen Sie sicher, dass erAfter=network-online.targethat, anstatt nurnetwork.targetoder spezifische Netzwerkdienste. Dies macht Ihren Dienst robuster gegenüber variierenden Netzwerk-Setup-Zeiten.- Bootreihenfolge verstehen: Machen Sie sich mit dem allgemeinen Fluss von
sysinit.targetzubasic.target, dann zumulti-user.target/graphical.targetvertraut. Dies hilft bei der Fehlerbehebung von Diensten, die früh im Bootvorgang fehlschlagen. - Vorsicht mit
default.target: Das Ändern vondefault.targetkann das Bootverhalten Ihres Systems erheblich verändern. Testen Sie benutzerdefinierte Konfigurationen immer zuerst in einer Nicht-Produktionsumgebung. Wants=für nicht-kritische Abhängigkeiten verwenden: Verwenden Sie für Dienste, die nützlich, aber nicht unbedingt notwendig sind, damit ein Target als „aktiv“ gilt,Wants=anstelle vonRequires=. Dies verhindert, dass ein einzelner optionaler Dienstfehler kaskadiert und die Aktivierung des gesamten Targets verhindert.
Fazit
Systemd Targets sind ein Eckpfeiler der modernen Linux-Systemverwaltung und bieten einen flexiblen und leistungsstarken Mechanismus zur Definition, Steuerung und Orchestrierung von Systemzuständen. Durch das Verständnis, wie Targets Units gruppieren, Abhängigkeiten verwalten und den Bootvorgang definieren, erhalten Administratoren und Entwickler eine erhebliche Kontrolle über das Verhalten ihrer Systeme. Von gängigen Targets wie multi-user.target bis hin zu benutzerdefinierten anwendungsspezifischen Targets ist die Beherrschung dieser Konzepte unerlässlich für eine effektive Systemadministration, Fehlerbehebung und den Aufbau robuster, wartbarer Linux-Umgebungen.
Während Sie Ihre Reise mit systemd fortsetzen, denken Sie daran, dass Targets Ihr Kompass sind, um die komplexe Landschaft der Unit-Abhängigkeiten und der Systeminitialisierung zu navigieren und sicherzustellen, dass Ihre Dienste vorhersehbar starten und Ihr System seinen beabsichtigten Betriebszustand erreicht.