Si vous avez déjà créé un répertoire personnalisé dans /var/run pour découvrir qu’il avait disparu après un redémarrage, vous n’êtes pas seul. C’est l’une des surprises les plus courantes pour les administrateurs Linux. Ce guide explique pourquoi cela se produit et comment rendre vos répertoires persistants entre les redémarrages avec systemd-tmpfiles.

Pourquoi /var/run est volatile

Le répertoire /var/run (et son équivalent moderne /run) est monté en tant que système de fichiers tmpfs — un système de fichiers basé sur la RAM qui n’existe qu’en mémoire. Ubuntu alloue une partie de votre RAM (généralement environ 10%) pour ce point de montage.

Vous pouvez le vérifier avec :

df -h /run
# Sortie :
# Filesystem      Size  Used Avail Use% Mounted on
# tmpfs           1.6G  1.2M  1.6G   1% /run

mount | grep tmpfs | grep run
# Sortie :
# tmpfs on /run type tmpfs (rw,nosuid,nodev,noexec,relatime,size=1632548k,mode=755)

Les applications utilisent /var/run pour stocker :

  • Fichiers PID — identifiants de processus pour les démons en cours d’exécution (ex. /run/nginx.pid)
  • Fichiers socket — sockets de domaine Unix pour la communication inter-processus (ex. /run/php/php-fpm.sock)
  • Fichiers de verrouillage — pour empêcher les instances multiples d’un processus
  • État d’exécution — données temporaires nécessaires uniquement pendant que le système fonctionne

Comme ces données sont en RAM, l’accès est extrêmement rapide — mais tout est perdu au redémarrage.

Note : Sur Ubuntu moderne (15.04+), /var/run est un lien symbolique vers /run. C’est le même emplacement.

ls -la /var/run
# Sortie :
# lrwxrwxrwx 1 root root 4 ... /var/run -> /run

La solution : systemd-tmpfiles

Le service systemd-tmpfiles est responsable de la création, suppression et du nettoyage des fichiers et répertoires volatiles et temporaires au démarrage. Il lit les fichiers de configuration depuis trois emplacements (par ordre de priorité) :

  1. /etc/tmpfiles.d/ — Personnalisations de l’administrateur local (priorité la plus haute)
  2. /run/tmpfiles.d/ — Configuration d’exécution
  3. /usr/lib/tmpfiles.d/ — Valeurs par défaut des paquets (priorité la plus basse)

Étape 1 : Créer un fichier de configuration

Créez un fichier .conf dans /etc/tmpfiles.d/ :

sudo nano /etc/tmpfiles.d/myapp.conf

Étape 2 : Ajouter la définition du répertoire

Le format de configuration est :

# Type  Chemin        Mode  Utilisateur  Groupe   Âge  Argument
d       /run/myapp    0755  myuser       mygroup  -    -

Signification de chaque champ :

ChampDescriptionExemple
Typed = créer un répertoired
CheminChemin complet à créer/run/myapp
ModePermissions (octal)0755
UtilisateurUtilisateur propriétairewww-data
GroupeGroupe propriétairewww-data
ÂgeNettoyage automatique après cet âge (- = jamais)10d ou -
ArgumentArguments supplémentaires (généralement -)-

Étape 3 : Appliquer immédiatement (sans redémarrer)

sudo systemd-tmpfiles --create /etc/tmpfiles.d/myapp.conf

Étape 4 : Vérifier

ls -la /run/myapp
# Sortie :
# drwxr-xr-x 2 myuser mygroup 40 ... /run/myapp

Exemples pratiques

Répertoire PID de Nginx

# /etc/tmpfiles.d/nginx.conf
d /run/nginx 0755 www-data www-data -

Répertoire de sockets PHP-FPM

# /etc/tmpfiles.d/php-fpm.conf
d /run/php 0755 www-data www-data -

Application personnalisée avec plusieurs sous-répertoires

# /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 -

Répertoire avec nettoyage automatique (supprimer les fichiers de plus de 30 jours)

# /etc/tmpfiles.d/myapp-tmp.conf
D /run/myapp/tmp 0755 appuser appgroup 30d

Notez le D majuscule — il nettoie le contenu du répertoire en fonction du paramètre d’âge.

Autres types tmpfiles.d

Au-delà des répertoires, tmpfiles.d peut gérer d’autres ressources :

# Créer un fichier vide
f /run/myapp/status 0644 appuser appgroup -

# Créer un lien symbolique
L /run/myapp/current - - - - /opt/myapp/latest

# Écrire du contenu dans un fichier
f+ /run/myapp/config 0644 appuser appgroup - "key=value"

L’ancienne méthode (pré-systemd)

Sur les très anciens systèmes Ubuntu (avant 15.04) qui n’utilisent pas systemd, le mécanisme équivalent était de modifier /etc/rc.local ou de créer des scripts d’initialisation :

# /etc/rc.local (ancien — NE PAS utiliser sur les systèmes systemd)
mkdir -p /var/run/myapp
chown myuser:mygroup /var/run/myapp
chmod 0755 /var/run/myapp

Avertissement : N’utilisez pas /etc/rc.local sur Ubuntu moderne. Utilisez tmpfiles.d à la place — c’est le mécanisme systemd approprié qui s’intègre correctement au processus de démarrage.

Dépannage

Le répertoire n’est pas créé après le redémarrage

  1. Vérifiez la syntaxe du fichier de configuration :
sudo systemd-tmpfiles --create --dry-run /etc/tmpfiles.d/myapp.conf
  1. Cherchez les erreurs de syntaxe dans le journal :
journalctl -u systemd-tmpfiles-setup.service

Permission refusée

Assurez-vous que l’utilisateur et le groupe spécifiés dans le fichier de configuration existent :

id myuser
getent group mygroup

Afficher la configuration tmpfiles actuelle

Listez toutes les règles tmpfiles actives :

systemd-tmpfiles --cat-config

Ou vérifiez ce qu’un paquet spécifique a configuré :

cat /usr/lib/tmpfiles.d/nginx.conf

Résumé

Les répertoires dans /var/run (ou /run) disparaissent au redémarrage car ils résident sur un disque RAM tmpfs. Pour créer des répertoires persistants qui sont automatiquement recréés au démarrage :

  1. Créez un fichier dans /etc/tmpfiles.d/votreapp.conf
  2. Définissez vos répertoires avec le type d, en spécifiant le chemin, les permissions et le propriétaire
  3. Appliquez avec sudo systemd-tmpfiles --create

C’est le mécanisme systemd standard utilisé par tous les paquets majeurs (Nginx, PHP-FPM, MySQL, etc.) pour gérer leurs répertoires d’exécution.

Articles connexes