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/runest 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é) :
/etc/tmpfiles.d/— Personnalisations de l’administrateur local (priorité la plus haute)/run/tmpfiles.d/— Configuration d’exécution/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 :
| Champ | Description | Exemple |
|---|---|---|
| Type | d = créer un répertoire | d |
| Chemin | Chemin complet à créer | /run/myapp |
| Mode | Permissions (octal) | 0755 |
| Utilisateur | Utilisateur propriétaire | www-data |
| Groupe | Groupe propriétaire | www-data |
| Âge | Nettoyage automatique après cet âge (- = jamais) | 10d ou - |
| Argument | Arguments 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.localsur Ubuntu moderne. Utiliseztmpfiles.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
- Vérifiez la syntaxe du fichier de configuration :
sudo systemd-tmpfiles --create --dry-run /etc/tmpfiles.d/myapp.conf
- 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 :
- Créez un fichier dans
/etc/tmpfiles.d/votreapp.conf - Définissez vos répertoires avec le type
d, en spécifiant le chemin, les permissions et le propriétaire - 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.