Systemd mit Rocky

Aus Xinux Wiki
Zur Navigation springen Zur Suche springen

Systemd

Systemd ist das Init-System und der Dienst-Manager unter Rocky Linux. Es startet beim Booten alle Prozesse, verwaltet Dienste, mountet Dateisysteme und protokolliert Ereignisse. Alles dreht sich um sogenannte Units – kleine Konfigurationsdateien die beschreiben was gestartet, gemountet oder überwacht werden soll.

Units

Eine Unit ist eine Konfigurationsdatei mit der Endung die ihren Typ beschreibt
Unit-Typ Endung Beschreibung
Service .service Startet und überwacht einen Prozess
Timer .timer Führt eine Unit zeitgesteuert aus
Mount .mount Hängt ein Dateisystem ein
Target .target Gruppiert Units – vergleichbar mit Runleveln
Socket .socket Startet einen Dienst bei eingehender Verbindung

Wo liegen Units?

Pfad Beschreibung
/lib/systemd/system/ Vom System mitgelieferte Units – nicht anfassen
/etc/systemd/system/ Eigene Units und Overrides – hier arbeiten wir

systemctl

Der zentrale Befehl zur Steuerung von Diensten und Units
Befehl Beschreibung
systemctl start <unit> Unit starten
systemctl stop <unit> Unit stoppen
systemctl restart <unit> Unit neu starten
systemctl reload <unit> Konfiguration neu laden ohne Neustart
systemctl enable <unit> Unit beim Boot aktivieren
systemctl disable <unit> Unit beim Boot deaktivieren
systemctl enable --now <unit> Aktivieren und sofort starten
systemctl status <unit> Status und letzte Logzeilen anzeigen
systemctl is-active <unit> Nur prüfen ob aktiv – gut für Skripte
systemctl list-units Alle aktiven Units anzeigen
systemctl list-unit-files Alle bekannten Units anzeigen
systemctl daemon-reload Neue oder geänderte Units einlesen

Service Unit

Als Beispiel bauen wir einen einfachen HTTP-Server mit Python – der Webserver lauscht auf Port 8080 und liefert den Inhalt des aktuellen Verzeichnisses aus.

Unit-Datei erstellen

  • vi /etc/systemd/system/webshare.service
[Unit]
Description=Python HTTP Server auf Port 8080
After=network.target

[Service]
Type=simple
User=nobody
WorkingDirectory=/var/www/html
ExecStart=/usr/bin/python3 -m http.server 8080
Restart=on-failure
RestartSec=5

[Install]
WantedBy=multi-user.target

Verzeichnis vorbereiten

  • mkdir -p /var/www/html
  • echo "Hallo vom Python HTTP Server" > /var/www/html/index.html

Dienst starten

Nach jeder Änderung an einer Unit-Datei muss systemd neu eingelesen werden
  • systemctl daemon-reload
  • systemctl enable --now webshare.service

Firewall

  • firewall-cmd --permanent --add-port=8080/tcp
  • firewall-cmd --reload

Test

Erklärungen

After=network.target
Der Dienst startet erst nachdem das Netzwerk verfügbar ist.
Type=simple
systemd betrachtet den Prozess als gestartet sobald ExecStart läuft.
Restart=on-failure
Wenn der Prozess abstürzt startet systemd ihn automatisch neu – nach 5 Sekunden.
WantedBy=multi-user.target
Die Unit wird beim Erreichen des multi-user.target aktiviert – also beim normalen Systemstart ohne GUI.

Timer Unit

Timer ersetzen Cronjobs – sie sind in systemd integriert, werden geloggt und können von anderen Units abhängen.
Als Beispiel räumen wir täglich alte Logdateien auf.

Service Unit für den Cleanup

  • vi /etc/systemd/system/log-cleanup.service
[Unit]
Description=Alte Logdateien aufräumen

[Service]
Type=oneshot
ExecStart=/usr/bin/find /var/log -name "*.log" -mtime +30 -delete

Timer Unit

  • vi /etc/systemd/system/log-cleanup.timer
[Unit]
Description=Log-Cleanup täglich um 02:00 Uhr

[Timer]
OnCalendar=*-*-* 02:00:00
Persistent=true

[Install]
WantedBy=timers.target

Timer aktivieren

Nicht den Service – den Timer aktivieren
  • systemctl daemon-reload
  • systemctl enable --now log-cleanup.timer

Kontrolle

Alle aktiven Timer anzeigen – mit nächstem und letztem Auführungszeitpunkt
  • systemctl list-timers

Erklärungen

Type=oneshot
Der Service läuft einmal durch und beendet sich – kein dauerhafter Prozess.
OnCalendar=*-*-* 02
00:00
Täglich um 02:00 Uhr – Syntax: Jahr-Monat-Tag Stunde:Minute:Sekunde.
Persistent=true
Falls der Rechner um 02:00 ausgeschaltet war wird der Timer beim nächsten Start nachgeholt.

Mount Unit

Mount Units hängen Dateisysteme ein – als Alternative zu /etc/fstab, aber mit allen systemd-Vorteilen wie Abhängigkeiten und Logging.
Der Name der Unit-Datei muss dem Mountpunkt entsprechen – Slashes werden durch Bindestriche ersetzt.
Beispiel
/mnt/daten einbinden

Unit-Datei erstellen

/mnt/daten → mnt-daten.mount
  • vi /etc/systemd/system/mnt-daten.mount
[Unit]
Description=Datenverzeichnis einbinden
After=network.target

[Mount]
What=/dev/sdb1
Where=/mnt/daten
Type=ext4
Options=defaults

[Install]
WantedBy=multi-user.target

NFS-Beispiel

Für einen NFS-Share von einem anderen Server im Netz
  • vi /etc/systemd/system/mnt-nfs.mount
[Unit]
Description=NFS Share einbinden
After=network-online.target
Wants=network-online.target

[Mount]
What=ns.it2XX.int:/srv/share
Where=/mnt/nfs
Type=nfs
Options=defaults,_netdev

[Install]
WantedBy=multi-user.target

Mount aktivieren

  • systemctl daemon-reload
  • systemctl enable --now mnt-daten.mount

Kontrolle

  • systemctl status mnt-daten.mount
  • findmnt /mnt/daten

Erklärungen

What=
Was eingebunden wird – Gerät, NFS-Share oder UUID.
Where=
Der Mountpunkt – muss als Verzeichnis existieren.
_netdev
Teilt systemd mit dass dieses Dateisystem Netzwerk benötigt – verhindert Hänger beim Boot.

Targets

Targets gruppieren Units und definieren den Systemzustand – vergleichbar mit Runleveln unter SysV
Target Entspricht Beschreibung
poweroff.target Runlevel 0 System ausschalten
rescue.target Runlevel 1 Einzelbenutzermodus
multi-user.target Runlevel 3 Mehrbenutzermodus ohne GUI
graphical.target Runlevel 5 Mehrbenutzermodus mit GUI
reboot.target Runlevel 6 Neustart
Aktuelles Target anzeigen
  • systemctl get-default
Standard-Target setzen – Boot ohne GUI
  • systemctl set-default multi-user.target
Standard-Target setzen – Boot mit GNOME
  • systemctl set-default graphical.target
In ein Target wechseln ohne Neustart
  • systemctl isolate multi-user.target

journalctl

journalctl ist das Werkzeug zum Lesen des systemd-Journals – alle Logs aller Dienste an einem Ort.

Grundlegende Befehle

Befehl Beschreibung
journalctl Gesamtes Journal anzeigen
journalctl -f Live mitverfolgen (wie tail -f)
journalctl -b Nur aktueller Boot
journalctl -b -1 Letzter Boot
journalctl -u sshd Nur Logs von sshd
journalctl -fu sshd sshd live verfolgen
journalctl -n 50 Letzte 50 Zeilen
journalctl -p err Nur Fehler anzeigen
journalctl --since "1 hour ago" Letzte Stunde
journalctl --since "2025-06-01" --until "2025-06-02" Zeitraum

Prioritäten

Kürzel Priorität Beschreibung
0 emerg System nicht mehr nutzbar
1 alert Sofortiger Handlungsbedarf
2 crit Kritischer Fehler
3 err Fehler
4 warning Warnung
5 notice Normaler aber wichtiger Hinweis
6 info Informationen
7 debug Debug-Ausgaben

Persistentes Journal

Standardmäßig wird das Journal nach einem Reboot gelöscht – mit dieser Einstellung bleibt es erhalten
  • mkdir -p /var/log/journal
  • vi /etc/systemd/journald.conf
[Journal]
Storage=persistent
SystemMaxUse=500M
  • systemctl restart systemd-journald

Praktische Beispiele

Fehler seit dem letzten Boot
  • journalctl -b -p err
firewalld live beobachten
  • journalctl -fu firewalld
named Logs der letzten Stunde
  • journalctl -u named --since "1 hour ago"
Alle Logs eines bestimmten Dienstes mit Kontext
  • journalctl -u sshd -n 100 --no-pager