Quand le terme « modifié » ne signifie-t-il pas vraiment « modifié »? La réponse se trouve dans la gestion des horodatages de fichiers sous Linux. Ce guide vous expliquera comment le système met à jour ces informations et comment vous pouvez les modifier vous-même.
Distinction entre atime, mtime et ctime
Chaque fichier sous Linux possède trois horodatages distincts : l’horodatage d’accès (atime), l’horodatage de modification (mtime) et l’horodatage de changement (ctime). Ces données enregistrent des moments clés de l’histoire d’un fichier.
L’horodatage d’accès (atime) indique la dernière fois qu’un fichier a été lu. Cela se produit lorsqu’un programme accède au contenu du fichier pour consultation, sans y apporter de modification. L’information est lue, mais le fichier reste inchangé.
L’horodatage de modification (mtime) enregistre la dernière fois que le contenu d’un fichier a été altéré. Cela survient lorsqu’un programme ou un processus modifie, manipule ou ajoute des données au fichier. En résumé, le contenu du fichier est affecté.
L’horodatage de changement (ctime), lui, ne concerne pas les modifications du contenu du fichier. Il enregistre plutôt l’heure à laquelle les métadonnées associées au fichier ont été changées. Par exemple, toute modification des permissions d’accès au fichier mettra à jour cet horodatage.
Le système de fichiers ext4, couramment utilisé sous Linux, réserve également un espace pour un horodatage de création de fichier dans ses structures internes. Cependant, cette fonctionnalité n’est pas encore pleinement implémentée. Cet horodatage peut parfois être renseigné, mais sa fiabilité n’est pas garantie.
Anatomie d’un horodatage
Les horodatages sous Linux ne stockent pas directement une date et une heure, mais plutôt un nombre. Ce nombre représente le nombre de secondes écoulées depuis l’Époque Unix, qui correspond au 1er janvier 1970 à 00:00:00, Temps Universel Coordonné (UTC). Il est important de noter que les secondes intercalaires ne sont pas prises en compte dans les horodatages Linux, ce qui les rend légèrement différents du temps réel.
Lorsque Linux doit afficher un horodatage, il convertit ce nombre de secondes en une date et une heure compréhensibles pour l’humain. Cette conversion est influencée par le fuseau horaire et la localisation de l’ordinateur qui consulte le fichier, assurant ainsi une présentation cohérente et traduite dans la langue appropriée.
Quelle est la capacité de stockage de ces horodatages ? Ils peuvent enregistrer jusqu’à 2 147 483 647 secondes, ce qui est un nombre considérable. Cette limite correspond au mardi 19 janvier 2038 à 03:14:07, ce qui signifie que nous aurons besoin d’un système de stockage différent pour les dates ultérieures.
Visualisation des horodatages
La commande `ls` avec l’option `-l` permet d’afficher l’horodatage de modification (mtime) :
ls -l dp.c
Pour afficher l’horodatage d’accès (atime), utilisez l’option `-lu` :
ls -lu dp.c
Enfin, pour voir l’horodatage de changement (ctime), utilisez l’option `-lc` :
ls -lc dp.c
Les exemples ci-dessus montrent que le fichier `dp.c` a été modifié pour la dernière fois le 21 avril 2019. L’accès et la modification ont été synchronisés le 20 janvier 2020 lors de la copie du fichier depuis un autre ordinateur.
Pour afficher tous les horodatages simultanément, utilisez la commande `stat` :
stat dp.c
Les fuseaux horaires sont indiqués en bas de l’écran. Notez la précision des fractions de secondes et les décalages temporels comme `-0500` ou `-0400`. Ces valeurs représentent les décalages par rapport au Temps Universel Coordonné (UTC). Le système de fichiers enregistre les horodatages en UTC et les convertit dans le fuseau horaire local lors de l’affichage avec `stat`.
Par exemple, l’ordinateur utilisé pour cet article est configuré dans le fuseau horaire EST (Heure Normale de l’Est) des États-Unis, qui a cinq heures de retard sur UTC en hiver, mais seulement quatre heures en été, lorsque l’heure d’été (HAE) est en vigueur.
Il est crucial de comprendre que les décalages et fuseaux horaires ne sont pas stockés dans des métadonnées spécifiques des fichiers. Ces informations sont calculées à la volée en utilisant l’horodatage (toujours en UTC), le fuseau horaire de l’ordinateur et la prise en compte éventuelle de l’heure d’été.
Enfin, la mention « Naissance » est réservée à la date de création du fichier, mais cette fonctionnalité n’étant pas implémentée, un tiret « – » est affiché.
Manipulation des horodatages
Il est possible de modifier les horodatages d’un fichier grâce à la commande `touch`. Cette commande permet de changer les horodatages d’accès (atime) et de modification (mtime), ou les deux.
Pour modifier uniquement l’horodatage d’accès (atime), utilisez l’option `-a` :
touch -a dp.c
Cette commande met l’horodatage d’accès à l’heure actuelle de l’ordinateur. Après cette commande, l’horodatage d’accès change, et, de façon attendue, l’horodatage de modification est aussi mis à jour.
stat dp.c
Pour modifier l’horodatage de modification (mtime), utilisez l’option `-m` :
touch -m dp.c
stat dp.c
Cette fois, les horodatages de modification (mtime) et de changement (ctime) ont été mis à jour.
Si vous souhaitez modifier les horodatages d’accès (atime) et de modification (mtime) simultanément, vous pouvez utiliser l’option `-d` (date). Cette option permet également de spécifier une date et une heure précises, vous n’êtes pas limité à l’heure actuelle.
Par exemple, la commande suivante mettra à jour les horodatages d’accès et de modification au 15 janvier 2020 à 10:30:45 :
touch -d "2020-01-15 10:30:45" dp.c
stat dp.c
Cette commande a permis de changer les horodatages de modification et d’accès avec une date du passé. Notez que l’horodatage de changement (ctime) a également été mis à jour à l’heure actuelle de l’ordinateur.
L’option `-r` (référence) permet de définir les horodatages d’un fichier en se basant sur les valeurs d’horodatage d’un autre fichier :
touch dp.c -r dice_words.sl3
stat dp.c
Nous revenons ici à des horodatages décalés, mélangés entre -0400 et -0500. Faisons maintenant une opération qui ne modifie que l’horodatage de changement (ctime). Nous allons donner au fichier dp des permissions d’exécution pour tous les utilisateurs, en utilisant la commande `chmod` :
chmod +x dp
stat dp
Seul l’horodatage de changement (ctime) a été mis à jour, car le contenu du fichier lui-même n’a pas été modifié, ni consulté. Cependant, des métadonnées relatives au fichier ont changé.
Mise à jour des horodatages par le système de fichiers
Lors du montage d’un système de fichiers, il est possible de spécifier des options qui déterminent son comportement. Ces options sont généralement stockées dans le fichier `/etc/fstab`, qui est lu au démarrage du système. Il est notamment possible de définir des options pour la mise à jour de l’horodatage d’accès (atime).
Voici les options les plus courantes :
- `strictatime` : L’horodatage d’accès est mis à jour à chaque accès au fichier. Cette méthode entraîne une surcharge, mais elle peut être utile pour certains serveurs. Elle n’a généralement pas d’intérêt sur un ordinateur personnel.
- `noatime` : Les horodatages d’accès sont totalement désactivés pour les fichiers et répertoires, ce qui peut améliorer les performances. Seuls les horodatages de modification (mtime) sont mis à jour.
- `nodiratime` : Les horodatages d’accès des fichiers sont mis à jour, mais ceux des répertoires sont désactivés.
- `relatime` : L’horodatage d’accès n’est mis à jour que si sa valeur est antérieure de plus de 24 heures, ou si elle est antérieure à l’horodatage actuel de modification (mtime) ou de changement (ctime). C’est un bon compromis entre mise à jour excessive et absence de mise à jour des horodatages d’accès.
Consultons le contenu du fichier `/etc/fstab` pour voir quelles options sont définies :
less /etc/fstab
Le contenu du fichier `/etc/fstab` s’affiche ainsi :
Voici le contenu du fichier sans le bouclage :
# /etc/fstab: static file system information. # # Use 'blkid' to print the universally unique identifier for a # device; this may be used with UUID= as a more robust way to name devices # that works even if disks are added and removed. See fstab(5). # ## / was on /dev/sda1 during installation UUID=4a143d08-8695-475b-8243-b13b56050fc2 / ext4 errors=remount-ro 0 1 /swapfile none swap sw 0 0
Il y a deux entrées. La première est un fichier d’échange, que nous pouvons ignorer. La seconde concerne le système de fichiers racine (`/`), monté depuis le périphérique `/dev/sda1`. Il s’agit de la première partition du premier disque dur et elle utilise le système de fichiers ext4.
La seule option passée à ce système de fichiers est `errors=remount-ro`, qui indique au système de le remonter en lecture seule s’il y a des erreurs lors du montage en lecture/écriture. Aucune option de gestion des horodatages d’accès n’est mentionnée ici.
Allons plus loin et examinons le fichier `/proc/mounts`. Nous allons filtrer les résultats avec `grep`, en recherchant `sda` qui est l’identifiant de notre disque dur :
Nous utilisons la commande suivante :
cat /proc/mounts | grep "sda"
Nous obtenons les options suivantes:
`rw`: Le système de fichiers est monté en lecture et écriture.
`relatime`: Le système de fichiers utilise la méthode `relatime` pour mettre à jour les horodatages d’accès.
D’où vient cette option `relatime` ? Elle est utilisée dans les cas suivants :
- Lorsque l’option par défaut de `/etc/fstab` est utilisée.
- Lorsque l’option `relatime` est spécifiée dans `/etc/fstab`.
- Lorsque aucune option spécifique de gestion des horodatages d’accès n’est spécifiée dans `/etc/fstab` et que le noyau Linux utilisé est 2.6.30 ou plus récent.
Notre entrée `/etc/fstab` pour le système de fichiers ext4 ne spécifie aucune option particulière de mise à jour des horodatages d’accès. C’est donc Linux qui a fait le choix d’utiliser `relatime`.
L’importance des horodatages
Les horodatages nous fournissent un moyen simple et rapide de savoir quand un fichier a été consulté, modifié ou changé. Ils jouent aussi un rôle crucial pour les logiciels de sauvegarde et de synchronisation, leur permettant de déterminer quels fichiers ont besoin d’être traités.
La capacité de modifier les horodatages peut s’avérer très utile pour forcer un logiciel à inclure ou ignorer certains fichiers ou ensembles de fichiers.