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/run ein 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):

  1. /etc/tmpfiles.d/ — Lokale Administratoranpassungen (höchste Priorität)
  2. /run/tmpfiles.d/ — Laufzeitkonfiguration
  3. /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:

FeldBeschreibungBeispiel
Typd = Verzeichnis erstellend
PfadVollständiger Pfad zum Erstellen/run/myapp
ModusBerechtigungen (oktal)0755
BenutzerEigentümer-Benutzerwww-data
GruppeEigentümer-Gruppewww-data
AlterAutomatische Bereinigung nach diesem Alter (- = nie)10d oder -
ArgumentZusä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.local nicht auf modernem Ubuntu. Nutzen Sie stattdessen tmpfiles.d — es ist der richtige systemd-Mechanismus und integriert sich korrekt in den Bootprozess.

Fehlerbehebung

Verzeichnis wird nach dem Neustart nicht erstellt

  1. Überprüfen Sie die Syntax der Konfigurationsdatei:
sudo systemd-tmpfiles --create --dry-run /etc/tmpfiles.d/myapp.conf
  1. 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:

  1. Erstellen Sie eine Datei unter /etc/tmpfiles.d/ihreapp.conf
  2. Definieren Sie Ihre Verzeichnisse mit dem Typ d, mit Pfad, Berechtigungen und Eigentümer
  3. 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.

Verwandte Artikel