Systemd: Unterschied zwischen den Versionen

Aus Foxwiki
Zeile 90: Zeile 90:
= TMP =
= TMP =
{{DISPLAYTITLE:systemd}}
{{DISPLAYTITLE:systemd}}
== Grundlegende Verwendung ==
Im System V-init-System werden Dienste mit mehreren Kommandos verarbeitet – mit init-Skripten, <tt>insserv</tt>, <tt>telinit</tt> und anderen.
* systemd erleichtert die Dienstverwaltung, da ein einziges Kommando die meisten Dienstverarbeitungsaufgaben abdeckt: <tt>systemctl</tt>.
* Hierbei gilt die Syntax „Kommando plus Subkommando“ wie bei <tt>git</tt> oder <tt>zypper</tt>:
systemctl ''GENERAL OPTIONS'' ''SUBCOMMAND'' ''SUBCOMMAND OPTIONS''
Vollständige Anweisungen finden Sie in <tt>man 1 systemctl</tt>.
======Tipp: Terminalausgabe und Bash-Vervollständigung======
Wenn die Ausgabe an ein Terminal geht (und nicht an eine Pipe oder Datei usw.), senden die systemd-Kommandos standardmäßig eine ausführliche Ausgabe an einen Pager.
* Mit der Option <tt>--no-pager</tt> deaktivieren Sie den Paging-Modus.
systemd unterstützt außerdem die Bash-Vervollständigung.
* Hierbei geben Sie die ersten Buchstaben eines Subkommandos ein und drücken dann →|, um es automatisch zu vervollständigen.
* Diese Funktion ist nur in der <tt>Bash</tt>-Shell verfügbar und das Paket <tt>bash-completion</tt> muss installiert sein.
===Verwalten von Diensten auf einem laufenden System===
Die Subkommandos zum Verwalten der Dienste sind mit den entsprechenden Kommandos in System V-init identisch (<tt>start</tt>, <tt>stop</tt> usw.).
* Die allgemeine Syntax für Dienstverwaltungskommandos lautet wie folgt:
systemd
'''systemctl reload|restart|start|status|stop|''...'' ''MY_SERVICE(S)'''''
System V-init
# '''rc''MY_SERVICE(S)'' reload|restart|start|status|stop|''...'''''
Mit systemd können Sie mehrere Dienste gleichzeitig verwalten.
* Im Gegensatz zu System V-init, bei dem die init-Skripts einzeln nacheinander ausgeführt werden, führen Sie ein einziges Kommando aus, beispielsweise:
# '''systemctl start ''MY_1ST_SERVICE'' ''MY_2ND_SERVICE'''''
So rufen Sie eine Liste aller auf dem System verfügbaren Dienste ab:
# '''sudo systemctl list-unit-files --type=service'''
Die folgende Tabelle zeigt die wichtigsten Dienstverwaltungskommandos für systemd und System V-init:
======Befehle zur Diensteverwaltung======
{| class="wikitable sortable"
|-
|  |'''Aufgabe '''
|  |'''systemd-Kommando '''
|  |'''System V-init-Kommando '''
|-
|  |Starten.
|  |start
|  | start
|-
|  | Stoppen.
|  |stop
|  |stop
|-
|| Neu starten.  Fährt Dienste herunter und startet sie dann neu.
* Wenn ein Dienst noch nicht ausgeführt wird, wird er gestartet.
||restart
||restart
|-
||Bedingt neu starten.  Startet Dienste neu, wenn sie derzeit ausgeführt werden.
* Keine Auswirkung bei Diensten, die nicht ausgeführt werden.
||try-restart
||try-restart
|-
||Neu laden.  Weist die Dienste an, die Konfigurationsdateien neu zu laden ohne die laufenden Vorgänge zu unterbrechen.
* Anwendungsbeispiel: Weisen Sie Apache an, eine bearbeitete Konfigurationsdatei <tt>httpd.conf</tt> neu zu laden.
* Nicht alle Dienste unterstützen das Neuladen.
|| reload
|| reload
|-
|| Neu laden oder neu starten.  Lädt Dienste neu, wenn das Neuladen unterstützt wird; ansonsten werden die Dienste neu gestartet.
* Wenn ein Dienst noch nicht ausgeführt wird, wird er gestartet.
||reload-or-restart
||n/a
|-
||Bedingt neu laden oder neu starten.  Lädt Dienste neu, wenn das Neuladen unterstützt wird; ansonsten werden die Dienste neu gestartet, wenn sie derzeit ausgeführt werden.
* Keine Auswirkung bei Diensten, die nicht ausgeführt werden.
||reload-or-try-restart
||n/a
|-
||Ausführliche Statusinformationen abrufen.  Zeigt Informationen zum Dienststatus.
* Das Kommando <tt>systemd</tt> bietet Details wie Beschreibung, ausführbare Datei, Status, cgroup und zuletzt durch den Dienst ausgegebene Meldungen.
* Die Detailtiefe bei System V-init ist von Dienst zu Dienst unterschiedlich.
||status
|| status
|-
|| Kurze Statusinformationen abrufen.  Gibt an, ob Dienste aktiv sind oder nicht.
||is-active
||status
|-
|}
===Dienste dauerhaft aktivieren/deaktivieren===
Mit den Dienstverwaltungskommandos im vorangegangenen Abschnitt können Sie die Dienste für die aktuelle Sitzung bearbeiten.
* Mit systemd können Sie Dienste außerdem dauerhaft aktivieren oder deaktivieren, so dass sie entweder automatisch bei Bedarf gestartet werden oder gar nicht verfügbar sind.
* Sie können dies mithilfe von YaST oder über die Kommandozeile tun.
====Aktivieren/Deaktivieren von Diensten über die Kommandozeile ====
Die folgende Tabelle zeigt die wichtigsten Aktivierungs- und Deaktivierungskommandos für systemd und System V-init:
======Wichtig: Service starten======
Wenn ein Dienst über die Kommandozeile aktiviert wird, wird er nicht automatisch gestartet.
* Der Dienst wird beim nächsten Systemstart oder bei der nächsten Änderung des Runlevels/Ziels gestartet.
* Soll ein Dienst nach dem Aktivieren sofort gestartet werden, führen Sie explizit <tt>systemctl start ''MEIN_DIENST''</tt> oder <tt>rc ''MEIN_DIENST'' start</tt> aus.
====== Kommandos zum Aktivieren und Deaktivieren von Diensten======
{| class="wikitable sortable"
|-
|  |'''Aufgabe '''
|  |<tt>'''systemd-Kommando'''</tt>
|  |'''System V-init-Kommando '''
|-
|  |Aktivieren.
|  |<tt>systemctl enable ''MEIN(E)_DIENST(E)''</tt>
|  |<tt>insserv ''MEIN(E)_DIENST(E)''</tt>, <tt>chkconfig -a ''MEIN(E)_DIENST(E)''</tt>
|-
||Deaktivieren.
||<tt>systemctl disable ''MEIN(E)_DIENST(E)''.service</tt>
||<tt>insserv -r ''MEIN(E)_DIENST(E)''</tt>, <tt>chkconfig -d ''MEIN(E)_DIENST(E)''</tt>
|-
||Überprüfen.  Zeigt an, ob ein Dienst aktiviert ist oder nicht.
||<tt>systemctl is-enabled ''MEIN_DIENST''</tt>
||<tt>chkconfig ''MEIN_DIENST''</tt>
|-
||Erneut aktivieren.  Ähnlich wie beim Neustarten eines Diensts, deaktiviert dieses Kommando einen Dienst und aktiviert ihn dann wieder.
* Nützlich, wenn ein Dienst mit den Standardeinstellungen erneut aktiviert werden soll.
||<tt>systemctl reenable ''MEIN_DIENST''</tt>
||n/v
|-
||Maskierung.  Nach dem „Deaktivieren“ eines Dienstes kann er weiterhin manuell aktiviert werden.
* Soll ein Dienst vollständig deaktiviert werden, maskieren Sie ihn.
* Mit Vorsicht verwenden.
||<tt>systemctl mask ''MEIN_DIENST''</tt>
||n/v
|-
||Demaskieren.  Ein maskierter Dienst kann erst dann wieder genutzt werden, wenn er demaskiert wurde.
||<tt>systemctl unmask ''MEIN_DIENST''</tt>
||n/v
|-
|}
=== Systemstart und Zielverwaltung ===
Der gesamte Vorgang des Startens und Herunterfahrens des Systems wird von systemd verwaltet.
* Von diesem Gesichtspunkt aus kann der Kernel als Hintergrundprozess betrachtet werden, der alle anderen Prozesse verwaltet und die CPU-Zeit sowie den Hardwarezugriff entsprechend den Anforderungen anderer Programme anpasst.
===Ziele im Vergleich zu Runlevels===
Bei System V-init wurde das System in ein sogenanntes „Runlevel“ gebootet.
* Ein Runlevel definiert, wie das System gestartet wird und welche Dienste im laufenden System verfügbar sind.
* Die Runlevels sind numeriert.
* Die bekanntesten Runlevels sind <tt>0</tt> (System herunterfahren), <tt>3</tt> (Mehrbenutzermodus mit Netzwerk) und <tt>5</tt> (Mehrbenutzermodus mit Netzwerk und Anzeigemanager).
systemd führt mit den sogenannten „Ziel-Units“ ein neues Konzept ein.
* Dennoch bleibt die Kompatibilität mit dem Runlevel-Konzept uneingeschränkt erhalten.
* Die Ziel-Units tragen Namen statt Zahlen und erfüllen bestimmte Zwecke.
* Mit den Zielen <tt>local-fs.target</tt> und <tt>swap.target</tt> werden beispielsweise lokale Dateisysteme und Auslagerungsbereiche eingehängt.
Das Ziel <tt>graphical.target</tt> stellt ein Mehrbenutzersystem mit Netzwerk sowie Anzeigemanager-Funktionen bereit und entspricht Runlevel  Komplexe Ziele wie <tt>graphical.target</tt> fungieren als „Metaziele“, in denen eine Teilmenge anderer Ziele vereint ist.
* Mit systemd können Sie problemlos vorhandene Ziele kombinieren und so benutzerdefinierte Ziele bilden.
* Damit bietet dieses Kommando eine hohe Flexibilität.
Die nachfolgende Liste zeigt die wichtigsten systemd-Ziel-Units.
* Eine vollständige Liste finden Sie in <tt>man 7 systemd.special</tt>.
======Ausgewählte systemd-Ziel-Units======
<tt>default.target</tt>
Das Ziel, das standardmäßig gebootet wird.
* Kein „reales“ Ziel, sondern ein symbolischer Link zu einem anderen Ziel wie <tt>graphic.target</tt>.
* Kann über YaST dauerhaft geändert werden.
* Soll das Ziel für eine einzige Sitzung geändert werden, geben Sie den Kernel-Parameter <tt>systemd.unit=''MEIN_ZIEL.target''</tt> am Bootprompt ein.
<tt>emergency.target</tt>
Startet eine Notfall-Shell über die Konsole.
* Dieses Kommando darf nur an der Boot-Eingabeaufforderung im Format <tt>systemd.unit=emergency.target</tt> verwendet werden.
<tt>graphical.target</tt>
Startet ein System mit Netzwerk, Mehrbenutzerunterstützung und Anzeigemanager.
<tt>halt.target</tt>
Fährt das System herunter.
<tt>mail-transfer-agent.target</tt>
Startet alle Dienste, die zum Senden und Empfangen von Mails erforderlich sind.
<tt>multi-user.target</tt>
Startet ein Mehrbenutzersystem mit Netzwerk.
<tt>reboot.target</tt>
Bootet das System neu.
<tt>rescue.target</tt>
Startet ein Einzelbenutzersystem ohne Netzwerk.
Damit die Kompatibilität mit dem Runlevel-System von System V-init gewährleistet bleibt, bietet systemd besondere Ziele mit der Bezeichnung <tt>runlevel''X''.target</tt>, denen die entsprechenden, mit ''X'' numerierten Runlevels zugeordnet sind.
Mit dem Kommando <tt>systemctl get-default</tt> ermitteln Sie das aktuelle Ziel.
======System V-Runlevels und systemd-Ziel-Units======
{| class="wikitable sortable"
|-
| |'''System V-Runlevel '''
| |<tt>'''systemd'''</tt>'''-Ziel '''
| |'''Beschreibung '''
|-
||0
||<tt>runlevel0.target</tt>, <tt>halt.target</tt>, <tt>poweroff.target</tt>
||System herunterfahren
|-
||1, S
||<tt>runlevel1.target</tt>, <tt>rescue.target</tt>,
||Einzelbenutzermodus
|-
||2
|| <tt>runlevel2.target</tt>, <tt>multi-user.target</tt>,
||Lokaler Mehrbenutzermodus ohne entferntes Netzwerk
|-
||3
|| <tt>runlevel3.target</tt>, <tt>multi-user.target</tt>,
||Mehrbenutzer-Vollmodus mit Netzwerk
|-
||4
|| <tt>runlevel4.target</tt>
||Nicht verwendet/benutzerdefiniert
|-
||5
|| <tt>runlevel5.target</tt>, <tt>graphical.target</tt>,
||Mehrbenutzer-Vollmodus mit Netzwerk und Anzeige-Manager
|-
||6
|| <tt>runlevel6.target</tt>, <tt>reboot.target</tt>,
||Systemneustart
|-
|}
======Wichtig: systemd ignoriert /etc/inittab======
Die Runlevels in einem System V-init-System werden in <tt>/etc/inittab</tt> konfiguriert.
* Bei systemd wird diese Konfiguration ''nicht'' verwendet.
* Weitere Anweisungen zum Erstellen eines bootfähigen Ziels finden Sie unter.
==== Kommandos zum Ändern von Zielen====
Mit den folgenden Kommandos arbeiten Sie mit den Ziel-Units:
{| class="wikitable sortable"
|-
|  |'''Aufgabe '''
|  |'''systemd-Kommando '''
|  |'''System V-init-Kommando '''
|-
|  |Aktuelles Ziel/Runlevel ändern
|  | <tt>systemctl isolate</tt> ''MEIN_ZIEL''.target
|  |<tt>telinit</tt> ''X''
|-
|  |Zum standardmäßigen Ziel/Runlevel wechseln
|  |<tt>systemctl default</tt>
|  |n/v
|-
|  |Aktuelles Ziel/Runlevel abrufen
|  | <tt>systemctl list-units --type=target</tt>
Bei systemd sind in der Regel mehrere Ziele aktiv.
* Mit diesem Kommando werden alle derzeit aktiven Ziele aufgelistet.
|  |<tt>who -r</tt>
oder
<tt>runlevel</tt>
|-
|  |Standard-Runlevel dauerhaft ändern
|  | Verwenden Sie die Dienste-Verwaltung, oder führen Sie das folgende Kommando aus:
<tt>ln -sf /usr/lib/systemd/system/</tt> ''MEIN_ZIEL''.target /etc/systemd/system/default.target
|  |Verwenden Sie die Dienste-Verwaltung, oder ändern Sie die Zeile
<tt>id:</tt> ''X'':initdefault:
in <tt>/etc/inittab</tt>
|-
||Standard-Runlevel für den aktuellen Bootprozess ändern
||Geben Sie an der Boot-Eingabeaufforderung die folgende Option ein:
<tt>systemd.unit=</tt> ''MEIN_ZIEL''.target
||Geben Sie an der Boot-Eingabeaufforderung die gewünschte Runlevel-Nummer ein.
|-
||Abhängigkeiten für ein Ziel/Runlevel anzeigen
||<tt>systemctl show -p "Requires" </tt>''MEIN_ZIEL''.target
<tt>systemctl show -p "Wants" </tt>''MEIN_ZIEL''.target
„Requires“ (Benötigt) zeigt eine Liste der harten Abhängigkeiten (die in jedem Fall aufgelöst werden müssen), „Wants“ (Erwünscht) dagegen eine Liste der weichen Abhängigkeiten (die nach Möglichkeit aufgelöst werden).
||n/v
|-
|}
===Fehlersuche beim Systemstart===
systemd bietet eine Möglichkeit, den Systemstartvorgang zu analysieren.
* Sie können die Liste der Dienste mit dem jeweiligen Status prüfen (ohne durch <tt>/var/log/</tt> blättern zu müssen).
* Mit systemd können Sie zudem den Startvorgang scannen und so ermitteln, wie lang das Starten der einzelnen Dienste dauert.
====Prüfen des Startvorgangs der Dienste====
Mit dem Kommando <tt>systemctl</tt> erzeugen Sie eine Liste aller Dienste, die seit dem Booten des Systems gestartet wurden.
* Hier werden alle aktiven Dienste wie im nachstehenden (gekürzten) Beispiel aufgeführt.
* Mit <tt>systemctl status ''MEIN_DIENST''</tt> erhalten Sie weitere Informationen zu einem bestimmten Dienst.
======Liste der aktiven Dienste======
# '''systemctl'''
UNIT                        LOAD  ACTIVE SUB      JOB DESCRIPTION
[...]
iscsi.service              loaded active exited    Login and scanning of iSC+
kmod-static-nodes.service  loaded active exited    Create list of required s+
libvirtd.service            loaded active running  Virtualization daemon
nscd.service                loaded active running  Name Service Cache Daemon
chronyd.service            loaded active running  NTP Server Daemon
polkit.service              loaded active running  Authorization Manager
postfix.service            loaded active running  Postfix Mail Transport Ag+
rc-local.service            loaded active exited    /etc/init.d/boot.local Co+
rsyslog.service            loaded active running  System Logging Service
[...]
LOAD    = Reflects whether the unit definition was properly loaded.
ACTIVE = The high-level unit activation state, i.e.
* generalization of SUB.
SUB    = The low-level unit activation state, values depend on unit type.
161 loaded units listed.
* Pass --all to see loaded but inactive units, too.
To show all installed unit files use 'systemctl list-unit-files'.
Soll die Ausgabe auf Dienste beschränkt werden, die nicht gestartet werden konnten, geben Sie die Option <tt>--failed</tt> an:
======Liste der fehlerhaften Dienste======
# '''systemctl --failed'''
UNIT                  LOAD  ACTIVE SUB    JOB DESCRIPTION
apache2.service        loaded failed failed    apache
NetworkManager.service loaded failed failed    Network Manager
plymouth-start.service loaded failed failed    Show Plymouth Boot Screen
[...]
====Fehlersuche für die Startzeit ====
Mit dem Kommando <tt>systemd-analyze</tt> führen Sie die Fehlersuche für die Startzeit durch.
* Hiermit werden der Gesamtzeitaufwand für den Startvorgang sowie eine Liste der beim Starten angeforderten Dienste angezeigt.
* Auf Wunsch kann auch eine SVG-Grafik erstellt werden, aus der hervorgeht, wie lange der Start der Dienste im Vergleich zu den anderen Diensten dauerte.
Auflisten der Startzeit des Systems
# '''systemd-analyze'''
Startup finished in 2666ms (kernel) + 21961ms (userspace) = 24628ms
Auflisten der Startzeit der Dienste
root # systemd-analyze blame
  6472ms systemd-modules-load.service
  5833ms remount-rootfs.service
  4597ms network.service
  4254ms systemd-vconsole-setup.service
  4096ms postfix.service
  2998ms xdm.service
  2483ms localnet.service
  2470ms SuSEfirewall2_init.service
  2189ms avahi-daemon.service
  2120ms systemd-logind.service
  1080ms chronyd.service
[...]
    75ms fbset.service
    72ms purge-kernels.service
    47ms dev-vda1.swap
    38ms bluez-coldplug.service
    35ms splash_early.service
Grafische Darstellung der Startzeit der Dienste
# '''systemd-analyze plot > jupiter.example.com-startup.svg'''
====Prüfen des gesamten Startvorgangs ====
Mit den obigen Kommandos prüfen Sie die gestarteten Dienste und den Zeitaufwand für den Start.
* Wenn Sie detailliertere Informationen benötigen, können Sie <tt>systemd</tt> anweisen, den gesamten Startvorgang ausführlich zu protokollieren.
* Geben Sie hierzu die folgenden Parameter an der Boot-Eingabeaufforderung ein:
systemd.log_level=debug systemd.log_target=kmsg
<tt>systemd</tt> schreibt die Protokollmeldungen nunmehr in den Kernel-Ringpuffer.
* Diesen Puffer zeigen Sie mit <tt>dmesg</tt> an:
$ '''dmesg -T | less'''
===System V-Kompatibilität===
systemd ist mit System V kompatibel, sodass Sie vorhandene System V-init-Skripte weiterhin nutzen können.
* Es gibt allerdings mindestens ein bekanntes Problem, bei dem ein System V-init-Skript nicht ohne Weiteres mit systemd zusammenarbeitet: Wenn Sie einen Dienst als ein anderer Benutzer über <tt>su</tt> oder <tt>sudo</tt> in init-Skripten starten, tritt der Fehler „Access denied“ (Zugriff verweigert) auf.
Wenn Sie den Benutzer mit <tt>su</tt> oder <tt>sudo</tt> ändern, wird eine PAM-Sitzung gestartet.
* Diese Sitzung wird beendet, sobald das init-Skript abgeschlossen ist.
* Als Folge wird auch der Service, der durch das init-Skript gestartet wurde, beendet.
* Als Workaround für diesen Fehler gehen Sie wie folgt vor: # Erstellen Sie einen Service-Datei-Wrapper mit demselben Namen wie das init-Skript und der Dateinamenerweiterung <tt>.service</tt>:
[Unit]
Description=''DESCRIPTION''
After=network.target
[Service]
User=''USER''
Type=forking1
PIDFile=''PATH TO PID FILE''
ExecStart=''PATH TO INIT SCRIPT'' start
ExecStop=''PATH TO INIT SCRIPT'' stop
ExecStopPost=/usr/bin/rm -f ''PATH TO PID FILE''
[Install]
WantedBy=multi-user.target2
Ersetzen Sie alle Werte in ''GROSSBUCHSTABEN'' durch die entsprechenden Werte.
{| class="wikitable sortable"
|-
||[[#co-service-wrapper-type|1]]
||Optional; nur zu verwenden, wenn mit dem init-Skript ein Daemon gestartet wird.
|-
|| [[#co-service-wrapper-target|2]]
||<tt>multi-user.target</tt> startet ebenfalls das init-Skript, wenn Sie in <tt>graphical.target</tt> booten.
* Falls der Start nur beim Booten in den Display-Manager erfolgen soll, verwenden Sie hier <tt>graphical.target</tt>.
|-
|}
#Starten Sie den Daemon mit <tt>systemctl start ''ANWENDUNG''</tt>.


== Anpassen von systemd ==
== Anpassen von systemd ==

Version vom 23. Oktober 2024, 11:37 Uhr

systemd - Init-System und Systemmanager

Beschreibung

  • Bei einer Reihe von Distributionen kümmert sich mittlerweile nicht mehr Sysvinit, sondern Systemd um den Systemstart.
  • Das erst zwei Jahre alte Init-System verspricht den Bootprozess zu beschleunigen und erfordert keine explizite Konfiguration der Abhängigkeiten zwischen Systemdiensten; nebenbei schafft es einige distributionsspezifische Eigenarten aus der Welt.
  • Bei Linux-Distributionen übergibt der Kernel traditionell Sysvinit die Verantwortung zur Einrichtung des Systems.
  • Einige Jahre sah alles danach aus, als würde Upstart das angestaubte, aber noch weitverbreitete Init-System beerben, doch mittlerweile immer mehr Distributionen auf Systemd um – abgesehen von Ubuntu , das laut Mark Suttleworth auf absehbare Zeit bei Upstart bleiben wird.
  • Fedora nutzt Systemd seit Version 15, auch in OpenSuse und Mandriva 2011 kommt das neue Init-System zum Einsatz; Mageia steigt mit Version 2 um.
  • Bei Arch Linux und Gentoo sowie Debian Testing liegt Systemd bei; bei einigen weitere Distributionen wird der optionale Einsatz oder der Umstieg diskutiert.
  • Eine der Besonderheiten von Systemd ist der parallele Start von Hintergrunddiensten, ohne dass Abhängigkeiten zwischen diesen explizit festgelegt werden müssen; das nutzt Hardware-Ressourcen effizienter und lässt das System flott starten.
  • Systemd erledigt zudem einige Aufgaben, um die sich bislang meist distributionsspezifische Skripte kümmern; ganz nebenbei beseitigt es damit einige Unterschiede bei der Bedienung und Konfiguration von Distributionen.
  • starken Verbreitung
  • weitgehend neuer Standard für Linux-Distributionen
  • Administration von Servern

Wenn Sie die Werkzeuge und Daemons, aus denen systemd besteht, kennenlernen und verwenden, werden Sie die Leistungsfähigkeit, Flexibilität und Fähigkeiten, die es bietet, besser zu schätzen wissen oder zumindest ihre Arbeit mit minimalem Aufwand erledigen können.

In diesem Leitfaden besprechen wir den Befehl systemctl, bei dem es sich um das zentrale Verwaltungswerkzeug zur Steuerung des Init-Systems handelt.

  • Wir behandeln die Verwaltung von Diensten, die Überprüfung des Status, die Änderung von Systemzuständen und die Arbeit im Umgang mit den Konfigurationsdateien.
  • Bitte beachten Sie, dass systemd zwar zum Standard-Init-System für viele Linux-Distributionen geworden ist, aber nicht durchgängig in allen Distributionen implementiert ist.
  • Wenn Ihr Terminal beim Durcharbeiten dieses Tutorials die Fehlermeldung bash: systemctl is not installed ausgibt, ist es wahrscheinlich, dass auf Ihrem Rechner ein anderes Init-System installiert ist.

Der Daemon systemd

Das Programm systemd trägt die Prozess-ID 1
  • Hiermit wird das System in der erforderlichen Form initialisiert. systemd wird direkt vom Kernel gestartet und widersteht dem Signal 9, das in der Regel Prozesse beendet.
  • Alle anderen Programme werden entweder direkt von systemd oder von einem seiner untergeordneten Prozesse gestartet.
Systemd ersetzt den System V init-Daemon.
  • systemd ist mit System V init uneingeschränkt kompatibel (init-Skripten werden unterstützt).
  • Einer der wichtigsten Vorteile von systemd ist die deutliche Beschleunigung des Bootvorgangs, da die Dienststarts konsequent parallel ausgeführt werden.
  • Darüber hinaus startet systemd einen Dienst nur dann, wenn er tatsächlich benötigt wird.
  • Deamons werden nicht in jedem Fall beim Booten gestartet, sondern erst dann, wenn sie erstmalig benötigt werden.
  • systemd unterstützt außerdem Kernel-Steuergruppen (cgroups), das Erstellen von Snapshots, das Wiederherstellen des Systemstatus und vieles mehr.
  • Weitere Informationen finden Sie in http://www.freedesktop.org/wiki/Software/systemd/.

Konzept

Grundlagen

systemd ist ein System- und Sitzungsmanager für Linux und ist mit System V- und LSB-init-Skripts kompatibel.

Die wichtigsten Funktionen
  • Konsequente Parallelisierung
  • Starten von Diensten per Socket- und D-Bus-Aktivierung
  • Starten der Daemons bei Bedarf
  • Verfolgen der Prozesse, die Linux-cgroups nutzen
  • Unterstützung für das Erstellen von Snapshots und Wiederherstellen des Systemstatus
  • Einhängepunkte und Automount-Punkte
  • Ausgereifte Dienststeuerlogik auf der Basis der Transaktionsabhängigkeiten

Unit-Datei

Eine Unit-Konfigurationsdatei enthält Informationen zu einem Dienst, Socket, Gerät, Einhängepunkt, Automount-Punkt, einer Auslagerungsdatei oder Partition, einem Startziel, einem überwachten Dateisystempfad, einem von systemd gesteuerten und überwachten Zeitgeber, einem Snapshot eines temporären Systemstatus, einem Ressourcenverwaltungs-Slice oder einer Gruppe extern erstellter Prozesse.

„Unit-Datei“ ist in systemd ein generischer Term für Folgendes
  • Dienst. Informationen zu einem Prozess (z. B.  Ausführung eines Daemon); Datei endet auf .service Ziele. Fassen Units zu Gruppen zusammen bzw. fungieren als Synchronisierungspunkte beim Starten; Datei endet auf .target Sockets.
  • Informationen zu einem IPC- oder Netzwerk-Socket oder einem Dateisystem-FIFO, für die socketbasierte Aktivierung (wie inetd); Datei endet auf .socket Pfad.
  • Dient als Auslöser von anderen Units (z. B.  Ausführen eines Dienstes, wenn Dateien geändert werden); Datei endet auf .path Zeitgeber.
  • Informationen zu einem gesteuerten Zeitgeber für die zeitgeberbasierte Aktivierung; Datei endet auf .timer Einhängepunkt.
  • In der Regel automatisch durch den fstab-Generator erzeugt; Datei endet auf .mount Automount-Punkt.
  • Informationen zu einem Dateisystem-Automount-Punkt; Datei endet auf .automount Swap.
  • Informationen zu einem Auslagerungsgerät oder einer Auslagerungsdatei für das Arbeitsspeicher-Paging; Datei endet auf .swap Gerät.
  • Informationen zu einer Geräte-Unit in der Geräte-Baumstruktur sysfs/udev(7); Datei endet auf .device Bereich/Slice. Konzept für die hierarchische Verwaltung von Ressourcen einer Prozessgruppe; Datei endet auf .scope/.slice

Weitere Informationen zu systemd.unit finden Sie unter http://www.freedesktop.org/software/systemd/man/systemd.unit.html.

Installation

Syntax

Optionen

Parameter

Umgebungsvariablen

Exit-Status

Anwendung

Problembehebung

Konfiguration

Dateien

Anhang

Siehe auch

Dokumentation

Man-Pages
Info-Pages

Links

Projekt
Weblinks

TMP

Anpassen von systemd

Warnung
Vermeiden der Überschreibung von Anpassungen
Passen Sie systemd stets in /etc/systemd/ an, nicht in /usr/lib/systemd/.
  • Ansonsten werden Ihre Änderungen bei der nächsten Aktualisierung von systemd überschrieben.

Anpassen von Unit-Dateien

Die systemd-Unit-Dateien befinden sich in/usr/lib/systemd/system.

  • Zum Anpassen fahren Sie wie folgt fort: # Kopieren Sie die zu bearbeitenden Dateien aus /usr/lib/systemd/system in /etc/systemd/system.
  • Behalten Sie die ursprünglichen Dateinamen bei.
  1. Bearbeiten Sie die Kopien in /etc/systemd/system.
  2. Mit dem Kommando systemd-delta erhalten Sie einen Überblick über Ihre Konfigurationsänderungen.
  • Hiermit werden Konfigurationsdateien verglichen und ermittelt, die andere Konfigurationsdateien überschreiben.
  • Weitere Informationen finden Sie auf der man-Seite zu systemd-delta.

Die geänderten Dateien in /etc/systemd haben Vorrang vor den Originaldateien in /usr/lib/systemd/system, sofern die Dateinamen identisch sind.

Konvertieren von xinetd-Diensten in systemd

Seit der Version SUSE Linux Enterprise Desktop 15 wurde die xinetd-Infrastruktur entfernt.

  • In diesem Abschnitt wird beschrieben, wie Sie vorhandene benutzerdefinierte xinetd-Dienstdateien in systemd-Sockets konvertieren.

Für jede xinetd-Dienstdatei benötigen Sie mindestens zwei systemd-Unit-Dateien: die Socket-Datei ( *.socket ) und eine zugehörige Dienstdatei (*.service).

  • Die Socket-Datei weist systemd an, welcher Socket erstellt werden soll, und die Dienstdatei weist systemd an, welche ausführbare Datei gestartet werden soll.

Betrachten Sie das folgende Beispiel für eine xinetd-Dienstdatei:

# cat /etc/xinetd.d/example
service example
{
 socket_type = stream
 protocol = tcp
 port = 10085
 wait = no
 user = user
 group = users
 groups = yes
 server = /usr/libexec/example/exampled
 server_args = -auth=bsdtcp exampledump
 disable = no
}

Zum Konvertieren in systemd benötigen Sie die folgenden beiden Dateien:

# cat /usr/lib/systemd/system/example.socket
[Socket]
ListenStream=0.0.0.0:10085
Accept=false
[Install]
WantedBy=sockets.target
root # cat /usr/lib/systemd/system/example.service
[Unit]
Description=example
[Service]
ExecStart=/usr/libexec/example/exampled -auth=bsdtcp exampledump
User=user
Group=users
StandardInput=socket

Eine vollständige Liste der Socket- und Dienstdateioptionen für systemd finden Sie auf den man-Seiten zu systemd.socket und systemd.service (man 5 systemd.socket, man 5 systemd.service).

Erstellen von „Drop-in-Dateien“

Wenn eine Konfigurationsdatei nur um wenige Zeilen ergänzt oder nur ein kleiner Teil daraus geändert werden soll, können Sie sogenannte „Drop-in-Dateien“ verwenden.

  • Mit den Drop-in-Dateien erweitern Sie die Konfiguration von Unit-Dateien, ohne die Unit-Dateien selbst bearbeiten oder überschreiben zu müssen.

Um beispielsweise einen einzigen Wert für den Dienst foobar in /usr/lib/systemd/system/ foobar.service zu ändern, gehen Sie wie folgt vor: # Erstellen Sie ein Verzeichnis mit dem Namen /etc/systemd/system/FOOBAR.service.d/.

Beachten Sie das Suffix .d.

  • Ansonsten muss der Name des Verzeichnisses mit dem Namen des Dienstes übereinstimmen, der mit der Drop-in-Datei gepatcht werden soll.
  1. Erstellen Sie in diesem Verzeichnis eine Datei mit dem Namen whatevermodification.conf.

Diese Datei darf nur eine Zeile mit dem zu ändernden Wert enthalten.

  1. Speichern Sie Ihre Änderungen in die Datei.
  • Die Datei wird als Erweiterung der Originaldatei verwendet.

Erstellen von benutzerdefinierten Zielen

Auf SUSE-Systemen mit System V-init wird Runlevel 4 nicht genutzt, so dass die Administratoren eine eigene Runlevel-Konfiguration erstellen können.

  • Mit systemd können Sie beliebig viele benutzerdefinierte Ziele erstellen.
  • Zum Einstieg sollten Sie ein vorhandenes Ziel anpassen, beispielsweise graphical.target. # Kopieren Sie die Konfigurationsdatei /usr/lib/systemd/system/graphical.target in /etc/systemd/system/MEIN_ZIEL.target und passen Sie sie nach Bedarf an.
  1. Die im vorangegangenen Schritt kopierte Konfigurationsdatei enthält bereits die erforderlichen („harten“) Abhängigkeiten für das Ziel.
  • Um auch die erwünschten („weichen“) Abhängigkeiten abzudecken, erstellen Sie ein Verzeichnis mit dem Namen /etc/systemd/system/MEIN_ZIEL.target.wants.
  1. Legen Sie für jeden erwünschten Dienst einen symbolischen Link von /usr/lib/systemd/system in /etc/systemd/system/MEIN_ZIEL.target.wants an.
  2. Sobald Sie alle Einstellungen für das Ziel festgelegt haben, laden Sie die systemd-Konfiguration neu.
  • Damit wird das neue Ziel verfügbar:
# systemctl daemon-reload

Erweiterte Nutzung

In den nachfolgenden Abschnitten finden Sie weiterführende Themen für Systemadministratoren.

Bereinigen von temporären Verzeichnissen

systemd unterstützt das regelmäßige Bereinigen der temporären Verzeichnisse.

  • Die Konfiguration aus der bisherigen Systemversion wird automatisch migriert und ist aktiv. tmpfiles.d (verwaltet temporäre Dateien) liest die Konfiguration aus den Dateien /etc/tmpfiles.d/*.conf, /run/tmpfiles.d/*.conf und /usr/lib/tmpfiles.d/*.conf aus.
  • Die Konfiguration in /etc/tmpfiles.d/*.conf hat Vorrang vor ähnlichen Konfigurationen in den anderen beiden Verzeichnissen. (In /usr/lib/tmpfiles.d/*.conf speichern die Pakete die Konfigurationsdateien.)

Im Konfigurationsformat ist eine Zeile pro Pfad vorgeschrieben, wobei diese Zeile die Aktion und den Pfad enthalten muss und optional Felder für Modus, Eigentümer, Alter und Argument (je nach Aktion) enthalten kann.

  • Im folgenden Beispiel wird die Verknüpfung der X11-Sperrdateien aufgehoben:
Type Path               Mode UID  GID  Age Argument
r    /tmp/.X[0-9]*-lock

So rufen Sie den Status aus dem tmpfile-Zeitgeber ab:

# systemctl status systemd-tmpfiles-clean.timer
systemd-tmpfiles-clean.timer - Daily Cleanup of Temporary Directories
 Loaded: loaded (/usr/lib/systemd/system/systemd-tmpfiles-clean.timer; static)
 Active: active (waiting) since Tue 2018-04-09 15:30:36 CEST; 1 weeks 6 days ago
  Docs: man:tmpfiles.d(5)
        man:systemd-tmpfiles(8)
Apr 09 15:30:36 jupiter systemd[1]: Starting Daily Cleanup of Temporary Directories.
Apr 09 15:30:36 jupiter systemd[1]: Started Daily Cleanup of Temporary Directories.

Weitere Informationen zum Arbeiten mit temporären Dateien finden Sie unter man 5 tmpfiles.d.

Systemprotokoll

In wird erläutert, wie Sie Protokollmeldungen für einen bestimmten Dienst anzeigen.

  • Die Anzeige von Protokollmeldungen ist allerdings nicht auf Dienstprotokolle beschränkt.
  • Sie können auch auf das gesamte von systemd geschriebene Protokoll (das sogenannte „Journal“) zugreifen und Abfragen darauf ausführen.
  • Mit dem Befehl journalctl zeigen Sie das gesamte Protokoll an, beginnend mit den ältesten Einträgen.
  • Informationen zu weiteren Optionen, beispielsweise zum Anwenden von Filtern oder zum Ändern des Ausgabeformats, finden Sie unter man 1 journalctl.

Aufnahmen

Mit dem Subkommando isolate können Sie den aktuellen Status von systemd als benannten Snapshot speichern und später wiederherstellen.

  • Dies ist beim Testen von Diensten oder benutzerdefinierten Zielen hilfreich, weil Sie jederzeit zu einem definierten Status zurückkehren können.
  • Ein Snapshot ist nur in der aktuellen Sitzung verfügbar; beim Neubooten wird er automatisch gelöscht.
  • Der Snapshot-Name muss auf .snapshot enden.

Erstellen eines Snapshots

# systemctl snapshot MY_SNAPSHOT.snapshot

Löschen eines Snapshots

# systemctl delete MY_SNAPSHOT.snapshot

Anzeigen eines Snapshots

# systemctl show MY_SNAPSHOT.snapshot

Aktivieren eines Snapshots

# systemctl isolate MY_SNAPSHOT.snapshot

Laden der Kernelmodule

Mit systemd können Kernel-Module automatisch zum Bootzeitpunkt geladen werden, und zwar über die Konfigurationsdatei in /etc/modules-load.d.

  • Die Datei sollte den Namen MODUL.conf haben und den folgenden Inhalt aufweisen:
# load module  MODULE at boot time
MODULE

Falls ein Paket eine Konfigurationsdatei zum Laden eines Kernel-Moduls installiert, wird diese Datei unter /usr/lib/modules-load.d installiert.

  • Wenn zwei Konfigurationsdateien mit demselben Namen vorhanden sind, hat die Datei unter /etc/modules-load.d Vorrang.

Weitere Informationen finden Sie auf der man-Seite modules-load.d(5).

Ausführen von Aktionen vor dem Laden eines Dienstes

Bei System V mussten init-Aktionen, die vor dem Laden eines Diensts ausgeführt werden müssen, in /etc/init.d/before.local festgelegt werden.

  • Dieses Verfahren wird in systemd nicht mehr unterstützt.
  • Wenn Aktionen vor dem Starten von Diensten ausgeführt werden müssen, gehen Sie wie folgt vor:

Laden der Kernelmodule

Erstellen Sie eine Drop-in-Datei im Verzeichnis /etc/modules-load.d (Syntax siehe man modules-load.d).

Erstellen von Dateien oder Verzeichnissen, Bereinigen von Verzeichnissen, Ändern des Eigentümers

Erstellen Sie eine Drop-in-Datei in /etc/tmpfiles.d (Syntax siehe man tmpfiles.d).

Weitere Aufgaben

Erstellen Sie eine Systemdienstdatei (beispielsweise /etc/systemd/system/before.service) anhand der folgenden Schablone:

[Unit]
Before=NAME OF THE SERVICE YOU WANT THIS SERVICE TO BE STARTED BEFORE
[Service]
Type=oneshot
RemainAfterExit=true
ExecStart=YOUR_COMMAND
 # beware, executable is run directly, not through a shell, check the man pages
 # systemd.service and systemd.unit for full syntax
[Install]
 # target in which to start the service
WantedBy=multi-user.target
 #WantedBy=graphical.target

Sobald die Dienstdatei erstellt ist, führen Sie die folgenden Kommandos aus (als root):

# systemctl daemon-reload
# systemctl enable before

Bei jedem Bearbeiten der Dienstdatei müssen Sie Folgendes ausführen:

# systemctl daemon-reload

Kernel-Steuergruppen (cgroups)

Auf einem traditionellen System-V-init-System kann ein Prozess nicht immer eindeutig dem Dienst zugeordnet werden, durch den er erzeugt wurde.

  • Einige Dienste (z. B.  Apache) erzeugen zahlreiche externe Prozesse (z. B.  CGI- oder Java-Prozesse), die wiederum weitere Prozesse erzeugen.
  • Eindeutige Zuweisungen sind damit schwierig oder völlig unmöglich.
  • Wenn ein Dienst nicht ordnungsgemäß beendet wird, bleiben zudem ggf.
  • einige untergeordnete Dienste weiterhin aktiv.

Bei systemd wird jeder Dienst in eine eigene cgroup aufgenommen, womit dieses Problem gelöst ist.

  • cgroups sind eine Kernel-Funktion, mit der die Prozesse mit allen ihren untergeordneten Prozessen in hierarchisch strukturierten Gruppen zusammengefasst werden.
  • Die cgroups werden dabei nach dem jeweiligen Dienst benannt.
  • Da ein nicht privilegierter Dienst seine cgroup nicht „verlassen“ darf, ist es damit möglich, alle von einem Dienst erzeugten Prozesse mit dem Namen dieses Dienstes zu versehen.

Mit dem Kommando systemd-cgls erhalten Sie eine Liste aller Prozesse, die zu einem Dienst gehören. (Gekürztes) Beispiel für die Ausgabe:

Auflisten aller Prozesse, die zu einem Dienst gehören
root # systemd-cgls --no-pager
├─1 /usr/lib/systemd/systemd --switched-root --system --deserialize 20
├─user.slice
│ └─user-1000.slice
│   ├─session-102.scope
│   │ ├─12426 gdm-session-worker [pam/gdm-password]
│   │ ├─15831 gdm-session-worker [pam/gdm-password]
│   │ ├─15839 gdm-session-worker [pam/gdm-password]
│   │ ├─15858 /usr/lib/gnome-terminal-server
[...]
└─system.slice
 ├─systemd-hostnamed.service
 │ └─17616 /usr/lib/systemd/systemd-hostnamed
 ├─cron.service
 │ └─1689 /usr/sbin/cron -n
 ├─postfix.service
 │ ├─ 1676 /usr/lib/postfix/master -w
 │ ├─ 1679 qmgr -l -t fifo -u
 │ └─15590 pickup -l -t fifo -u
 ├─sshd.service
 │ └─1436 /usr/sbin/sshd -D
[...]

Weitere Informationen zu cpgroups finden Sie in [Fixme]

Beenden von Diensten (Senden von Signalen)

Wie in erläutert, kann ein Prozess in einem System-V-init-System nicht immer eindeutig seinem übergeordneten Dienstprozess zugeordnet werden.

  • Das erschwert das Beenden eines Dienstes und seiner untergeordneten Dienste.
  • Untergeordnete Prozesse, die nicht ordnungsgemäß beendet wurden, bleiben als "Zombie-Prozess" zurück.

Durch das Konzept von systemd, mit dem jeder Dienst in einer eigenen cgroup abgegrenzt wird, können alle untergeordneten Prozesse eines Dienstes eindeutig erkannt werden, so dass Sie ein Signal zu diesen Prozessen senden können.

  • Mit Use systemctl kill senden Sie die Signale an die Dienste.
  • Eine Liste der verfügbaren Signale finden Sie in man 7 signals.

Senden von SIGTERM an einen Dienst

SIGTERM ist das standardmäßig gesendete Signal.

# systemctl kill MY_SERVICE

Senden von SIGNAL an einen Dienst

Mit der Option -s legen Sie das zu sendende Signal fest.

# systemctl kill -s SIGNAL MY_SERVICE

Auswählen von Prozessen

Standardmäßig sendet das Kommando kill das Signal an alle Prozesse der angegebenen cgroup.

  • Sie können dies jedoch auf den Prozess control oder main beschränken.
  • Damit können Sie beispielsweise das Neuladen der Konfiguration eines Dienstes mit dem Signal SIGHUP erzwingen:
# systemctl kill -s SIGHUP --kill-who=main MY_SERVICE
Warnung: Beenden oder Neustarten des D-BUS-Dienstes wird nicht unterstützt
Der D-Bus-Dienst fungiert als Meldungsbus für die Kommunikation zwischen den systemd-Clients und dem systemd-Manager, der als PID 1 ausgeführt wird. dbus ist zwar ein eigenständiger Daemon, bildet jedoch auch einen wesentlichen Bestandteil der Initialisierungsinfrastruktur.

Das Beenden von dbus oder das Neustarten im laufenden System entspricht dem Versuch, PID 1 zu beenden oder neu zu starten.

  • Hiermit wird die systemd-Client/Server-Kommunikation unterbrochen, sodass die meisten systemd-Funktionen unbrauchbar werden.

Das Beenden oder Neustarten von dbus wird daher weder empfohlen noch unterstützt.

Fehlersuche für Dienste

Standardmäßig ist die Ausgabe von systemd auf ein Minimum beschränkt.

  • Wenn ein Dienst ordnungsgemäß gestartet wurde, erfolgt keine Ausgabe.
  • Bei einem Fehler wird eine kurze Fehlermeldung angezeigt.
  • Mit systemctl status können Sie jedoch die Fehlersuche für den Start und die Ausführung eines Dienstes vornehmen.

systemd umfasst einen Protokollierungsmechanismus („Journal“), mit dem die Systemmeldungen protokolliert werden.

  • Auf diese Weise können Sie die Dienstmeldungen zusammen mit den Statusmeldungen abrufen.
  • Das Kommando status hat eine ähnliche Funktion wie tail und kann zudem die Protokollmeldungen in verschiedenen Formaten anzeigen, ist also ein wirksames Hilfsmittel für die Fehlersuche.

Anzeigen von Fehlern beim Starten von Diensten

Wenn ein Dienst nicht gestartet wird, erhalten Sie mit systemctl status MEIN_DIENST eine ausführliche Fehlermeldung:

# systemctl start apache2
Job failed.
  • See system journal and 'systemctl status' for details.
root # systemctl status apache2
  Loaded: loaded (/usr/lib/systemd/system/apache2.service; disabled)
  Active: failed (Result: exit-code) since Mon, 04 Apr 2018 16:52:26 +0200; 29s ago
  Process: 3088 ExecStart=/usr/sbin/start_apache2 -D SYSTEMD -k start (code=exited, status=1/FAILURE)
  CGroup: name=systemd:/system/apache2.service
Apr 04 16:52:26 g144 start_apache2[3088]: httpd2-prefork: Syntax error on line
205 of /etc/apache2/httpd.conf: Syntax error on li...alHost>

Anzeigen der letzten n Dienstmeldungen

Standardmäßig zeigt das Subkommando status die letzten zehn Meldungen an, die ein Dienst ausgegeben hat.

  • Mit dem Parameter --lines=n legen Sie eine andere Anzahl fest:
# systemctl status chronyd
# systemctl --lines=20 status chronyd

Anzeigen von Dienstmeldungen im Anhängemodus

Mit der Option „--follow“ erhalten Sie einen Live-Stream mit Dienstmeldungen; diese Option entspricht tail -f:

# systemctl --follow status chronyd

Ausgabeformat der Meldungen

Mit dem Parameter --output=mode legen Sie das Ausgabeformat für die Dienstmeldungen fest.

  • Die wichtigsten Modi sind:

short

Das Standardformat.

  • Zeigt die Protokollmeldungen mit einem Zeitstempel in Klartext an.

verbose

Vollständige Ausgabe mit sämtlichen Feldern.

cat

Kurze Ausgabe ohne Zeitstempel.