Un fichier déposé dans /tmp et retrouvé disparu sans qu’aucun redémarrage n’ait eu lieu entre-temps n’est pas un mystère : sur la plupart des distributions modernes utilisant systemd, un timer dédié nettoie périodiquement /tmp selon l’âge des fichiers, indépendamment de tout reboot. La croyance selon laquelle /tmp ne se vide qu’au démarrage de la machine ne correspond plus au comportement réel depuis longtemps.
Le mécanisme : un timer, pas un reboot
systemd-tmpfiles-clean.timer déclenche périodiquement systemd-tmpfiles --clean, un service qui parcourt les répertoires configurés (/tmp et /var/tmp par défaut) et supprime les fichiers dont l’âge dépasse un seuil défini dans les fichiers de configuration tmpfiles.d.
# Vérifie l'activation et la prochaine
# exécution planifiée du nettoyage
systemctl status systemd-tmpfiles-clean.timer
systemctl list-timers systemd-tmpfiles-clean.timer
Où l’âge limite est réellement configuré
La configuration par défaut (/usr/lib/tmpfiles.d/tmp.conf sur la plupart des distributions) définit un âge maximal, souvent 10 jours pour /tmp, avant qu’un fichier n’y soit considéré comme éligible à la suppression.
# Extrait typique de tmp.conf : d = répertoire,
# 1777 = permissions avec sticky bit, 10d = âge max
d /tmp 1777 root root 10d
d /var/tmp 1777 root root 30d
Un fichier stocké dans /tmp en pensant qu’il n’en sera retiré qu’au prochain redémarrage peut en réalité disparaître bien avant, dès que son âge dépasse ce seuil, que la machine tourne en continu depuis des semaines ou non.
Le correctif pour un fichier qui doit vraiment persister
Un fichier ou répertoire nécessitant une durée de vie plus longue que la valeur par défaut ne doit pas contourner la règle en modifiant tmp.conf directement (écrasé à la prochaine mise à jour du paquet), mais via un fichier de configuration propre dans /etc/tmpfiles.d/, qui surcharge proprement la configuration système sans risque d’écrasement.
# /etc/tmpfiles.d/mon-app.conf : exclut ce chemin
# spécifique du nettoyage automatique (x = exclu)
x /tmp/mon-app/cache
Le lien avec ce qu’on a déjà vu sur /tmp
Le sticky bit déjà couvert empêche un utilisateur de supprimer les fichiers d’un autre dans /tmp, mais ne protège en rien contre le nettoyage automatique par âge de systemd-tmpfiles, qui agit avec les privilèges du service, pas ceux d’un utilisateur normal soumis aux règles de permissions classiques.
À retenir
/tmp n’est pas nettoyé qu’au redémarrage : systemd-tmpfiles-clean.timer déclenche périodiquement une suppression basée sur l’âge des fichiers, configuré par défaut à 10 jours pour /tmp dans tmpfiles.d. Un fichier qui doit survivre plus longtemps nécessite une règle d’exclusion dans /etc/tmpfiles.d/, jamais une modification directe de la configuration système par défaut, écrasée à la prochaine mise à jour. Le sticky bit protège contre la suppression par d’autres utilisateurs, mais n’a aucun effet sur ce nettoyage automatique par âge, un mécanisme entièrement distinct qui agit avec les privilèges du service systemd lui-même.