Fichiers temporaires

La plupart des applications, services et utilisateurs utilisent des fichiers et des répertoires temporaires dans /tmp.
Les daemons (et parfois les utilisateurs) utilisent le répertoire /run.
Ces répertoires /tmp et /run existent uniquement en mémoire et quand le système redémarre un nettoyage automatique est effectué.

L’outil systemd-tmpfiles permet de gérer les répertoires et les fichiers temporaires. Il exécute au démarrage la commande systemd-tmpfiles avec les l’options --create ou --remove et lit la configuration des fichiers /usr/lib/tmpfiles.d/*.conf, /run/tmpfiles.d/*.conf et /etc/tmpfiles.d/*.conf pour savoir s’il faut créer, supprimer ou sécuriser les fichiers et dossiers temporaires.

Exemples :

[root@SERVER01 ~]# ls -l /usr/lib/tmpfiles.d/*.conf
-rw-r--r--. 1 root root 175 Sep 7 2023 /usr/lib/tmpfiles.d/cockpit-tempfiles.conf
-rw-r--r--. 1 root root 29 Apr 26 2023 /usr/lib/tmpfiles.d/criu.conf
-rw-r--r--. 1 root root 35 Jul 2 2023 /usr/lib/tmpfiles.d/cryptsetup.conf
[...]

[root@SERVER01 ~]# ls -l /run/tmpfiles.d/*.conf
-rw-r--r--. 1 root root 595 Aug 14 09:23 /run/tmpfiles.d/static-nodes.conf

[root@SERVER01 ~]# ls -l /etc/tmpfiles.d/*.conf
-rw-r--r--. 1 root root 117 Sep 1 2023 /etc/tmpfiles.d/sos.conf

Suppression auto des fichiers temporaires avec un minuteur systemd

L’unité minuteur systemd appelle systemd-tmpfiles-clean.timer pour lancer à intervalles réguliers l’unité systemd-tmpfiles-clean.service qui exécute la commande systemd-tmpfiles --clean.

Pour résumer :
unité.timer > call > unité.servive > call > unité cmd -options

La commande systemctl permet d’afficher le fichier de configuration de l’unité systemd-tmpfiles-clean.timer :

[root@SERVER01 ~]# systemctl edit systemd-tmpfiles-clean.timer

# systemctl cat systemd-tmpfiles-clean.timer

# /usr/lib/systemd/system/systemd-tmpfiles-clean.timer
# SPDX-License-Identifier: LGPL-2.1-or-later
#
# This file is part of systemd.
#

[Unit]
Description=Daily Cleanup of Temporary Directories
Documentation=man:tmpfiles.d(5) man:systemd-tmpfiles(8)
ConditionPathExists=!/etc/initrd-release

[Timer]
OnBootSec=15min
OnUnitActiveSec=12h

La section [Timer] indique comment démarrer le service avec le même nom que le minuteur :

  • OnBootSec=10min : l’unité systemd-tmpfiles-clean.service se déclenche 10 min après le démarrage du système
  • OnUnitActiveSec=12h : tout déclenchement ultérieur de l’unité systemd-tmpfiles-clean.service se produit 12h après sa dernière activation

La commande systemctl daemon-reload permet à systemd de charger la nouvelle configuration :

# systemctl daemon-reload

Nettoyage manuel des fichiers temporaires

Le format des fichiers de configuration pour systemd-tmpfiles est détaillé dans la page de manuel tmpfiles.d(5).
La syntaxe de base se compose de sept colonnes : Type, Path, Mode, UID, GID, Age, et Argument

  • type : action que les fichiers systemd-tmp doivent entreprendre
    • d : créer un répertoire s’il n’existe pas encore
    • Z : restaurer de façon récursive les contextes SELinux, autorisations et propriété des fichiers

Exemples

Pour créer un répertoire /run/systemd/seats appartenant à root et au groupe root en rwxr-xr-r. Ce répertoire ne sera pas automatiquement purgé :

d /run/systemd/seats 0755 root root

Pour créer un répertoire /home/user :

D /home/user 0700 john john 1

Pour créer un lien symbolique /run/fstablink pointant vers /etc/fstab. Ne jamais purgez automatiquement cette ligne :

L /run/fstablink – root root – /etc/fstab

Ordre de priorité des fichiers de configuration

Les fichiers de configuration du service systemd-tmpfiles-clean peuvent être stockés dans 3 répertoires :

  • Priorité 0 : /etc/tmpfiles.d/*.conf :
    • configurer des emplacements temporaires personnalisés et pour remplacer les valeurs par défaut définies par les fournisseurs
  • Priorité -1 : /run/tmpfiles.d/*.conf :
    • fichiers volatils que les daemons utilisent généralement pour gérer leurs propres fichiers temporaires d’exécution
  • Priorité -2 : /usr/lib/tmpfiles.d/*.conf :
    • paquetages RPM pertinents fournissent les fichiers dans le répertoire

Si un fichier se trouve dans les 3 répertoires, l’ordre de priorité pour appliquer la configuration sera :

/etc/tmpfiles.d/*.conf > /run/tmpfiles.d/*.conf > /usr/lib/tmpfiles.d/*.conf

/!\ Résumé des commandes

Commandes :

systemd-tmpfiles --create
systemd-tmpfiles --remove
systemd-tmpfiles --clean

systemctl edit systemd-tmpfiles-clean.timer

Fichiers :

/usr/lib/systemd/system/systemd-tmpfiles-clean.timer

/usr/lib/tmpfiles.d/*.conf
/run/tmpfiles.d/*.conf
/etc/tmpfiles.d/*.conf

Cas Pratique

Configuration du service systemd-tmpfiles pour qu’il purge le répertoire /tmp de tous les fichiers inutilisés au cours des cinq derniers jours.

Copie de /usr/lib/tmpfiles.d/tmp.conf dans /etc/tmpfiles.d/:

[root@SERVER01 ~]# cp /usr/lib/tmpfiles.d/tmp.conf /etc/tmpfiles.d/tmp.conf

Fichier /etc/tmpfiles.d/tmp.conf d’origine :

[root@SERVER01 ~]# cat /usr/lib/tmpfiles.d/tmp.conf
# This file is part of systemd.
#
# systemd is free software; you can redistribute it and/or modify it
# under the terms of the GNU Lesser General Public License as published by
# the Free Software Foundation; either version 2.1 of the License, or
# (at your option) any later version.

# See tmpfiles.d(5) for details

# Clear tmp directories separately, to make them easier to override
q /tmp 1777 root root 10d
q /var/tmp 1777 root root 30d

Modification du fichier /etc/tmpfiles.d/tmp.conf précédemment copié (juste 1 ligne est nécessaire) :

q /tmp 1777 root root 5d

Vérification de la configuration de /etc/tmpfiles.d/tmp.conf avec la commande systemd-tmpfiles --clean (si aucun retour, la configuration est OK) :

[root@SERVER01 ~]# systemd-tmpfiles --clean /etc/tmpfiles.d/tmp.conf

Création d’un nouveau fichier purge30s.conf qui supprimera dans le répertoire /run/purge30s tous les fichiers qui restent inutilisés pendant 30 secondes :

[root@SERVER01 ~]# vim /etc/tmpfiles.d/purge30s.conf
d /run/purge30s 0700 root root 30s

Création de /etc/tmpfiles.d/purge30s.conf avec la commande systemd-tmpfiles --create (si aucun retour, la configuration est OK) :

[root@SERVER01 ~]# systemd-tmpfiles --create /etc/tmpfiles.d/purge30s.conf

Le répertoire /run/purge30s a bien été crée :

[root@SERVER01 ~]# ls -l /run/
total 28
[...]
drwxr-xr-x. 6 root root 160 Aug 14 09:24 NetworkManager
drwxr-xr-x. 2 root root 40 Aug 14 09:23 plymouth
drwx------. 2 root root 40 Aug 14 09:23 podman
drwx------. 2 root root 40 Sep 15 04:50 purge30s
[...]

Création de plusieurs fichiers dans /run/purge30s/ :

[root@SERVER01 ~]# touch /run/purge30s/test{1..5}

[root@SERVER01 ~]# ls -l /run/purge30s/
total 0
-rw-r--r--. 1 root root 0 Sep 15 04:55 test1
-rw-r--r--. 1 root root 0 Sep 15 04:55 test2
-rw-r--r--. 1 root root 0 Sep 15 04:55 test3
-rw-r--r--. 1 root root 0 Sep 15 04:55 test4
-rw-r--r--. 1 root root 0 Sep 15 04:55 test5

Attendre 30s et lancer la commande systemd-tmpfiles --clean /etc/tmpfiles.d/purge30s.conf pour nettoyer les fichiers inutilisés de + de 30s :

[root@SERVER01 ~]# systemd-tmpfiles --clean /etc/tmpfiles.d/purge30s.conf

Vérification :

[root@SERVER01 ~]# ls -l /run/purge30s/
total 0

Documentation

MAN systemd-tmpfiles(5)
MAN tmpfiles.d(8)
MAN stat(2)
MAN stat(5)
MAN systemd.timer(1)
https://www.interserver.net/tips/kb/managing-temporary-files-systemd-tmpfiles/

> Partager <