creation time sur ext4

Pour avoir la date de création d’un fichier sur ext4 avec la commande stat, il vous faut 3 ingrédients :

  • kernel 4.11 ou supérieur (4.19 à ce jour sur Debian Buster)
  • libc 2.28 ou supérieur (2.28-10 à ce jour sur Debian Buster)
  • coreutils 8.31 ou supérieur (8.30 à ce jour sur Debian Buster)

Par un miracle miraculeux à croire que j’ai tout prévu, coreutils 8.32 est arrivé le 02/10 sur Debian Testing et sera disponible sur Ubuntu 20.10 lors de sa sortie prévue le 22/10.

atime, mtime, ctime, crtime

Commençons par un petit rappel des dates d’un fichier sur Linux qu’on affiche en général avec stat.

Date du dernier accès (access time – atime) : Quand le fichier est consulté
Date de dernière modification (modification time – mtime) : Quand le contenu du fichier est modifié
Date du dernier changement (change time – ctime) : Quand les attributs (permissions, propriétaire…) ou le contenu du fichier sont modifiés
Date de création (creation time – crtime pour ext4) : Quand le fichier est créé

Ce sujet étant complexe, je vous renvoie vers ces saines lectures (1, 2, 3).

En pratique

On identifie les partitions en ext4 mount -t ext4 (ou mount | grep ext4) et on vérifie les options de montage, notamment pour noatime (ne pas mettre à jour la date d’accès). L’option relatime est utilisée par défaut dans le kernel depuis la version 2.6.30 (man mount puis /relatime).

sudo touch /toto
stat /toto
  Fichier : /toto
   Taille : 0           Blocs : 0          Blocs d'E/S : 4096   fichier vide
Périphérique : 10305h/66309d  Inœud : 8571        Liens : 1
Accès : (0644/-rw-r--r--)  UID : (    0/    root)   GID : (    0/    root)
 Accès : 2020-10-15 17:02:49.212202834 +0200
Modif. : 2020-10-15 17:02:49.212202834 +0200
Changt : 2020-10-15 17:02:49.212202834 +0200
  Créé : 2020-10-15 17:02:49.212202834 +0200
cat /toto
stat /toto
  Fichier : /toto
   Taille : 0           Blocs : 0          Blocs d'E/S : 4096   fichier vide
Périphérique : 10305h/66309d  Inœud : 8571        Liens : 1
Accès : (0644/-rw-r--r--)  UID : (    0/    root)   GID : (    0/    root)
 Accès : 2020-10-15 17:03:26.660363346 +0200
Modif. : 2020-10-15 17:02:49.212202834 +0200
Changt : 2020-10-15 17:02:49.212202834 +0200
  Créé : 2020-10-15 17:02:49.212202834 +0200
sudo nano /toto # Faites une modification et enregistrez
stat /toto
  Fichier : /toto
   Taille : 2           Blocs : 8          Blocs d'E/S : 4096   fichier
Périphérique : 10305h/66309d  Inœud : 8571        Liens : 1
Accès : (0644/-rw-r--r--)  UID : (    0/    root)   GID : (    0/    root)
 Accès : 2020-10-15 17:03:26.660363346 +0200
Modif. : 2020-10-15 17:04:31.244640195 +0200
Changt : 2020-10-15 17:04:31.244640195 +0200
  Créé : 2020-10-15 17:02:49.212202834 +0200
sudo chmod 777 /toto
stat /toto
  Fichier : /toto
   Taille : 2           Blocs : 8          Blocs d'E/S : 4096   fichier
Périphérique : 10305h/66309d  Inœud : 8571        Liens : 1
Accès : (0777/-rwxrwxrwx)  UID : (    0/    root)   GID : (    0/    root)
 Accès : 2020-10-15 17:03:26.660363346 +0200
Modif. : 2020-10-15 17:04:31.244640195 +0200
Changt : 2020-10-15 17:05:10.028806446 +0200
  Créé : 2020-10-15 17:02:49.212202834 +0200
LANG=en_US.UTF-8 stat /toto
  File: /toto
  Size: 2         	Blocks: 8          IO Block: 4096   regular file
Device: 10305h/66309d	Inode: 8571          Links: 1
Access: (0777/-rwxrwxrwx)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2020-10-15 17:03:26.660363346 +0200
Modify: 2020-10-15 17:04:31.244640195 +0200
Change: 2020-10-15 17:05:10.028806446 +0200
 Birth: 2020-10-15 17:02:49.212202834 +0200
stat -c '%w' /toto
2020-10-15 17:02:49.212202834 +0200
ls -l --time=birth /toto # ou --time=creation
-rwxrwxrwx 1 root root 7 15 oct.  17:02 /toto

Quelques réflexions

Notez bien que la date de création d’un fichier sur ext4 est disponible depuis des années sur Linux (article de 2012) mais il fallait utiliser debugfs pour la récupérer… On a « seulement » accès à cette date facilement en 2020 sur Debian/Ubuntu avec les commandes ls et stat du paquet coreutils. coreutils 8.31 est sorti en mars 2019 (« stat now prints file creation time »), coreutils 8.32 en mars 2020 (« ls now supports the –time=birth option to display and sort by file creation time »).

L’évolution est intéressante à vivre et à suivre je trouve. Il y a eu une première phase « implémentation », ça fonctionne, on peut récupérer l’info avec debugfs. Nous sommes à la seconde phase « utilisable », on récupère l’information simplement, à hauteur de l’utilisateur. Ensuite viendra la phase « intégration », on sera en mesure de chercher/trouver les fichiers avec telle date de création typiquement avec find. Enfin la dernière phase « diffusion et prise en charge », tous les logiciels en ayant l’usage prendront en charge la date de création. Par exemple les gestionnaires de fichiers Caja et Thunar qui permettront de trier les fichiers par date de création. Je suis curieux de voir si on aura cela dans les 5 ans.

Tout ça pour vous dire que vous êtes à la pointe en me lisant, vous allez pouvoir briller dans les soirées mondaines (sur IRC évidemment).

Vus : 369
Publié par blog-libre : 133