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
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
- 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
- firewalld live beobachten
- 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