Systemd on RHEL & Fedora: Unit Files & Standards (Artikel 073)
Spezifika von systemd in der Red Hat Welt. Erfahren Sie den Umgang mit Unit-Files, die Nutzung von /etc/sysconfig und die korrekte Einbindung von Diensten in RHEL-Standards.
# systemd on RHEL: Enterprise Standards für Dienste
TL;DR / Management Summary Obwohl
systemdein universeller Standard ist, folgt Red Hat (RHEL/Rocky/Fedora) spezifischen Konventionen. Während Debian-Admins oft alles in Unit-Files hardcodieren, nutzt die Red Hat Welt intensiv EnvironmentFiles in/etc/sysconfig/, um Konfiguration von Logik zu trennen. Zudem ist die Interaktion zwischen systemd und SELinux in RHEL deutlich strikter. In diesem Modul lernen wir den “Red Hat Way” des Service-Managements.
# 1. Einführung & Architektur
Wo liegen die Dateien?
In RHEL gibt es eine klare Trennung zwischen System-Standards und Admin-Änderungen:
/usr/lib/systemd/system/: Standard-Units der Distribution (werden bei Updates überschrieben). Finger weg!/etc/systemd/system/: Ort für Admin-eigene Units oder Overrides. Hier arbeiten wir.
# Der Konfigurations-Fluss (Mermaid)
graph LR
A[/etc/systemd/system/app.service] -->|Loads Vars| B[/etc/sysconfig/app]
A -->|Execution| C[Process Binary]
C -->|Logging| D[Journald]
C -->|Security| E[SELinux Context]
F[systemctl] -->|Controls| A
# 2. Der Red Hat Standard: /etc/sysconfig
Konfiguration sauber trennen.
Anstatt das Unit-File für jede Änderung (z.B. ein anderer Port) zu bearbeiten, nutzen wir Variablen-Dateien.
# Schritt 1: Die Config-Datei (/etc/sysconfig/myapp)
# Optionen für mein Go-Binary
MYAPP_OPTS="--port 8080 --db-host 10.0.0.5"
LOG_LEVEL="debug"
# Schritt 2: Das Unit-File (/etc/systemd/system/myapp.service)
[Unit]
Description=My Enterprise App
After=network.target
[Service]
Type=simple
EnvironmentFile=-/etc/sysconfig/myapp
ExecStart=/usr/local/bin/myapp $MYAPP_OPTS
Restart=on-failure
[Install]
WantedBy=multi-user.target
Das - vor dem Pfad sorgt dafür, dass systemd nicht abbricht, wenn die Datei fehlt.
# 3. Overrides: Bestehende Dienste anpassen
Kein Copy-Paste von Distribution-Files.
Wenn Sie einen Standard-Dienst (z.B. Nginx) anpassen wollen, kopieren Sie nicht das File aus /usr/lib. Nutzen Sie Drop-in Files.
# Erstellt automatisch /etc/systemd/system/nginx.service.d/override.conf
sudo systemctl edit nginx
Fügen Sie nur die Änderungen ein:
[Service]
# Dienst soll nach Absturz schneller neustarten
RestartSec=2s
# Limit für offene Files erhöhen
LimitNOFILE=65535
# 4. Day-2 Operations: Legacy & Management
Von chkconfig zu systemctl.
# Legacy-Befehle
RHEL hat lange an chkconfig festgehalten. Systemd erkennt alte SysVinit-Skripte automatisch und wrappt sie. Dennoch sollten Sie nur noch systemctl nutzen.
# Startup-Analyse (RHEL spezifisch)
# Welche Dienste bremsen den Bootvorgang?
systemd-analyze blame
# Visualisierung der Abhängigkeiten
systemd-analyze dot | dot -Tsvg > boot.svg
# 5. Troubleshooting & “War Stories”
Wenn der Dienst im RHEL-Ökosystem hakt.
# Story 1: “Der Environment-Verlust”
Symptom: Ein Skript läuft in der Bash einwandfrei, scheitert aber als systemd-Service, weil Pfade oder API-Keys fehlen.
Ursache: systemd nutzt eine minimale Umgebung. $PATH ist oft nur /usr/bin:/bin.
Lösung: Definieren Sie alle benötigten Variablen explizit im EnvironmentFile in /etc/sysconfig/.
# Story 2: “SELinux verhindert ExecStart”
Symptom: systemctl start meldet “Permission Denied” für das Binary in /opt/mytool/bin, obwohl es 755 Rechte hat.
Ursache: Das Binary hat ein falsches Label (z.B. usr_t statt bin_t), und systemd darf keine unvertrauenswürdigen Typen ausführen.
Lösung: restorecon -v /opt/mytool/bin/tool.
# 6. Fazit & Empfehlung
- Finger weg von
/usr/lib: Nutzen Sie immer/etc/systemd/system/. - Modularität: Nutzen Sie
/etc/sysconfig/für Variablen. Das macht Ihre Ansible-Playbooks deutlich sauberer. - Status: Gewöhnen Sie sich an
systemctl status -l, um die volle Fehlermeldung (statt abgeschnittener Zeilen) zu sehen.
# Anhang: Cheatsheet
| Aufgabe | Befehl |
|---|---|
| Unit-Datei validieren | systemd-analyze verify myapp.service |
| Alle laufenden Units | systemctl list-units --type=service |
| Boot-Dienste anzeigen | systemctl list-unit-files --state=enabled |
| Dienst-Abhängigkeiten | systemctl list-dependencies <name> |
| Full Log eines Dienstes | journalctl -u <name> -e |