Inodes & Liens (Physiques vs Symboliques)

Linux
Système & Réseau
Comprendre les nœuds d’index (inodes POSIX), les horodatages mtime/ctime/atime, et maîtriser la différence entre liens physiques (ln) et symboliques (ln -s).

Comment un système d’exploitation retrouve-t-il instantanément un fichier parmi des millions sur un disque dur ? Sous GNU/Linux, les systèmes de fichiers modernes (ext4, xfs, btrfs) reposent sur une structure fondamentale définie par la norme POSIX : le nœud d’index, universellement appelé Inode (Index Node).

🪪 Qu’est-ce qu’un Inode ?

Imaginez votre disque dur comme un immense entrepôt automatisé. Le contenu réel de vos fichiers (le texte, les pixels d’une image) est découpé et rangé dans des casiers numérotés appelés blocs de données. Pour savoir dans quels casiers se trouvent les morceaux d’un fichier et qui a le droit de les ouvrir, le système de fichiers tient à jour un registre de fiches cartonnées numérotées : ce sont les Inodes.

Chaque fichier ou dossier possède sa propre fiche d’identité Inode, qui regroupe exactement les métadonnées suivantes (spécification POSIX) :

Identité, Droits & Stockage
  1. Numéro d’inode : L’identifiant numérique unique du fichier au sein du système de fichiers.
  2. Périphérique : L’identifiant du disque/partition contenant le fichier.
  3. Mode du fichier : Le type du nœud (- fichier standard, d dossier, l lien symbolique) et les droits d’accès (rwxr-xr-x).
  4. Propriétaire & Groupe : L’identifiant numérique de l’utilisateur propriétaire (UID) et du groupe (GID).
  5. Taille & Blocs : La taille exacte en octets et les pointeurs vers les blocs de données sur le disque.
  6. Compteur de liens (Nlinks) : Le nombre de noms (liens physiques) pointant vers cet inode.
Les 3 Horodatages (Timestamps)

Chaque inode maintient trois dates précises que l’on inspecte avec stat ou ls :

  • mtime (Modify time) : Date de dernière modification du contenu du fichier. Affichée par défaut avec ls -l.
  • ctime (Change time) : Date de dernière modification de l’inode lui-même (ex: modification des droits chmod, du propriétaire ou du compteur de liens). Affichée par stat ou ls -lc.
  • atime (Access time) : Date du dernier accès en lecture au fichier. Affichée par stat ou ls -lu.

🤯 Le Secret d’UNIX : Le fichier ne connaît pas son nom !

Regardez attentivement la liste ci-dessus : le nom du fichier ne figure PAS dans son inode !

Sous Linux, un fichier n’est qu’un numéro d’inode. Mais alors, où sont stockés les noms des fichiers ? Dans les dossiers ! Un répertoire sous Linux n’est rien d’autre qu’un simple tableau à deux colonnes qui associe un Nom humain \(\leftrightarrow\) Numéro d'Inode :

Nom dans le dossier (~/workspace) Numéro d’Inode associé
. (dossier courant) 131105
.. (dossier parent) 131073
test_inode.txt 131420

Pour inspecter le numéro d’inode et la carte d’identité complète d’un fichier en direct :

# 1. Créer un fichier vide (touch sert à la base à mettre à jour les timestamps !)
touch test_inode.txt

# 2. Afficher son numéro d'inode en première colonne avec l'option -i
ls -li test_inode.txt

# 3. Ouvrir la carte d'identité complète de l'inode (Inode, Links, Uid, Gid, Access/Modify/Change)
stat test_inode.txt

🔗 Liens Physiques (ln) vs Liens Symboliques (ln -s)

Puisqu’un nom de fichier n’est qu’une étiquette pointant vers un inode, Linux permet de créer des liens entre plusieurs fichiers selon deux mécanismes radicalement différents :

Lien Symbolique : Le Raccourci (ln -s)
ln -s source cible
  • Mécanisme : Crée un nouveau fichier spécial doté de son propre numéro d’inode (type l, permissions lrwxrwxrwx). Au lieu de pointer vers des données, il contient simplement le chemin texte vers le fichier source (cible -> source).
  • Fragilité : Si le fichier source est supprimé ou déplacé, le lien symbolique pointe dans le vide et devient invalide (lien cassé).
  • Avantage : Peut pointer vers un dossier ou traverser des disques/partitions différents.
Lien Physique : L’Alias (ln)
ln source cible
  • Mécanisme : Ajoute une nouvelle ligne dans le tableau du dossier qui pointe vers exactement le même numéro d’inode que source. Le compteur Links (Nlinks) de l’inode est incrémenté de +1.
  • Robustesse : source et cible sont totalement indiscernables (aucun n’est plus « original » que l’autre). Si vous supprimez source avec rm, les données survivent intactes via cible tant que le compteur Nlinks n’est pas tombé à 0 !
  • Limitation : Interdit sur les dossiers (hors . et ..) et impossible entre deux partitions distinctes.

🧪 Simulateur Interactif : Inodes, Liens et Test de Suppression (rm)

Manipulez le fichier db.conf dans le simulateur ci-dessous pour visualiser l’architecture des inodes et vérifier ce qu’il se passe lorsque l’on supprime le fichier d’origine :

Laboratoire d’Inodes & Résilience des Liens

Un seul fichier db.conf pointant sur l’Inode #4012 (Links: 1).

Ajout d’un lien symbolique raccourci_sym.conf (ln -s) et d’un lien physique clone_physique.conf (ln).

On exécute rm db.conf : observez quel lien survit et quel lien se casse !

Sortie ls -li & État des Inodes

🚀 Cas Réel en Entreprise : Déploiement Zero-Downtime par Lien Symbolique

En production, les ingénieurs DevOps utilisent quotidiennement les liens symboliques pour mettre à jour un site web sans aucune coupure de service :

  1. Les différentes versions du site sont préparées dans des dossiers séparés : releases/v1.0/ et releases/v2.0/.
  2. Le serveur Web (Nginx/Apache) est configuré pour servir le dossier pointé par le lien symbolique current.
  3. Au moment de la mise en production, une seule commande atomique met à jour la cible du lien :
# Création initiale vers la v1.0
ln -s releases/v1.0 current

# Bascule instantanée vers la v2.0 (-s : symbolique, -f : écrase l'ancien lien, -n : traite le lien dossier comme un fichier)
ln -sfn releases/v2.0 current

Si un bug critique est découvert sur la v2.0, le retour arrière (rollback) prend moins d’une milliseconde avec ln -sfn releases/v1.0 current !