Wenn Sie jemals ein benutzerdefiniertes Verzeichnis in /var/run erstellt haben und es nach einem Neustart verschwunden war, sind Sie nicht allein. Dies ist eine der häufigsten Überraschungen für Linux-Administratoren. Diese Anleitung erklärt, warum das passiert und wie Sie Ihre Verzeichnisse mit systemd-tmpfiles dauerhaft machen.
Warum /var/run flüchtig ist
Das Verzeichnis /var/run (und sein modernes Äquivalent /run) wird als tmpfs-Dateisystem eingehängt — ein RAM-basiertes Dateisystem, das nur im Arbeitsspeicher existiert. Ubuntu reserviert einen Teil Ihres RAMs (typischerweise etwa 10%) für diesen Einhängepunkt.
Sie können dies überprüfen mit:
df -h /run
# Ausgabe:
# Filesystem Size Used Avail Use% Mounted on
# tmpfs 1.6G 1.2M 1.6G 1% /run
mount | grep tmpfs | grep run
# Ausgabe:
# tmpfs on /run type tmpfs (rw,nosuid,nodev,noexec,relatime,size=1632548k,mode=755)
Anwendungen verwenden /var/run zum Speichern von:
- PID-Dateien — Prozess-IDs für laufende Dienste (z.B.
/run/nginx.pid) - Socket-Dateien — Unix-Domain-Sockets für Interprozesskommunikation (z.B.
/run/php/php-fpm.sock) - Lock-Dateien — um mehrere Instanzen eines Prozesses zu verhindern
- Laufzeitstatus — temporäre Daten, die nur während des Systembetriebs benötigt werden
Da diese Daten im RAM liegen, ist der Zugriff extrem schnell — aber alles geht beim Neustart verloren.
Hinweis: Auf modernem Ubuntu (15.04+) ist
/var/runein symbolischer Link auf/run. Es handelt sich um denselben Speicherort.
ls -la /var/run
# Ausgabe:
# lrwxrwxrwx 1 root root 4 ... /var/run -> /run
Die Lösung: systemd-tmpfiles
Der Dienst systemd-tmpfiles ist für das Erstellen, Löschen und Bereinigen flüchtiger und temporärer Dateien und Verzeichnisse beim Booten verantwortlich. Er liest Konfigurationsdateien aus drei Verzeichnissen (in Prioritätsreihenfolge):
/etc/tmpfiles.d/— Lokale Administratoranpassungen (höchste Priorität)/run/tmpfiles.d/— Laufzeitkonfiguration/usr/lib/tmpfiles.d/— Paketstandards (niedrigste Priorität)
Schritt 1: Konfigurationsdatei erstellen
Erstellen Sie eine .conf-Datei in /etc/tmpfiles.d/:
sudo nano /etc/tmpfiles.d/myapp.conf
Schritt 2: Verzeichnisdefinition hinzufügen
Das Konfigurationsformat lautet:
# Typ Pfad Modus Benutzer Gruppe Alter Argument
d /run/myapp 0755 myuser mygroup - -
Die Bedeutung der einzelnen Felder:
| Feld | Beschreibung | Beispiel |
|---|---|---|
| Typ | d = Verzeichnis erstellen | d |
| Pfad | Vollständiger Pfad zum Erstellen | /run/myapp |
| Modus | Berechtigungen (oktal) | 0755 |
| Benutzer | Eigentümer-Benutzer | www-data |
| Gruppe | Eigentümer-Gruppe | www-data |
| Alter | Automatische Bereinigung nach diesem Alter (- = nie) | 10d oder - |
| Argument | Zusätzliche Argumente (normalerweise -) | - |
Schritt 3: Sofort anwenden (ohne Neustart)
sudo systemd-tmpfiles --create /etc/tmpfiles.d/myapp.conf
Schritt 4: Überprüfen
ls -la /run/myapp
# Ausgabe:
# drwxr-xr-x 2 myuser mygroup 40 ... /run/myapp
Praktische Beispiele
Nginx-PID-Verzeichnis
# /etc/tmpfiles.d/nginx.conf
d /run/nginx 0755 www-data www-data -
PHP-FPM-Socket-Verzeichnis
# /etc/tmpfiles.d/php-fpm.conf
d /run/php 0755 www-data www-data -
Benutzerdefinierte Anwendung mit mehreren Unterverzeichnissen
# /etc/tmpfiles.d/myapp.conf
d /run/myapp 0755 appuser appgroup -
d /run/myapp/pids 0755 appuser appgroup -
d /run/myapp/sock 0750 appuser appgroup -
Verzeichnis mit automatischer Bereinigung (Dateien älter als 30 Tage löschen)
# /etc/tmpfiles.d/myapp-tmp.conf
D /run/myapp/tmp 0755 appuser appgroup 30d
Beachten Sie das große D — es bereinigt den Verzeichnisinhalt basierend auf dem Altersparameter.
Weitere tmpfiles.d-Typen
Neben Verzeichnissen kann tmpfiles.d auch andere Ressourcen verwalten:
# Leere Datei erstellen
f /run/myapp/status 0644 appuser appgroup -
# Symbolischen Link erstellen
L /run/myapp/current - - - - /opt/myapp/latest
# Inhalt in eine Datei schreiben
f+ /run/myapp/config 0644 appuser appgroup - "key=value"
Die alte Methode (vor systemd)
Auf sehr alten Ubuntu-Systemen (vor 15.04), die kein systemd verwenden, war der äquivalente Mechanismus die Bearbeitung von /etc/rc.local oder das Erstellen von Init-Skripten:
# /etc/rc.local (veraltet — NICHT auf systemd-Systemen verwenden)
mkdir -p /var/run/myapp
chown myuser:mygroup /var/run/myapp
chmod 0755 /var/run/myapp
Warnung: Verwenden Sie
/etc/rc.localnicht auf modernem Ubuntu. Nutzen Sie stattdessentmpfiles.d— es ist der richtige systemd-Mechanismus und integriert sich korrekt in den Bootprozess.
Fehlerbehebung
Verzeichnis wird nach dem Neustart nicht erstellt
- Überprüfen Sie die Syntax der Konfigurationsdatei:
sudo systemd-tmpfiles --create --dry-run /etc/tmpfiles.d/myapp.conf
- Suchen Sie nach Syntaxfehlern im Journal:
journalctl -u systemd-tmpfiles-setup.service
Zugriff verweigert
Stellen Sie sicher, dass der in der Konfigurationsdatei angegebene Benutzer und die Gruppe existieren:
id myuser
getent group mygroup
Aktuelle tmpfiles-Konfiguration anzeigen
Alle aktiven tmpfiles-Regeln auflisten:
systemd-tmpfiles --cat-config
Oder prüfen Sie, was ein bestimmtes Paket konfiguriert hat:
cat /usr/lib/tmpfiles.d/nginx.conf
Zusammenfassung
Verzeichnisse in /var/run (oder /run) verschwinden nach dem Neustart, weil sie auf einer tmpfs-RAM-Disk liegen. Um persistente Verzeichnisse zu erstellen, die beim Booten automatisch neu erstellt werden:
- Erstellen Sie eine Datei unter
/etc/tmpfiles.d/ihreapp.conf - Definieren Sie Ihre Verzeichnisse mit dem Typ
d, mit Pfad, Berechtigungen und Eigentümer - Wenden Sie es an mit
sudo systemd-tmpfiles --create
Dies ist der standardmäßige systemd-Mechanismus, den alle großen Pakete (Nginx, PHP-FPM, MySQL usw.) zur Verwaltung ihrer Laufzeitverzeichnisse verwenden.