Supprimer le fichier original derrière un lien symbolique casse ce lien (ls -l affiche le chemin en rouge, cassé), mais supprimer le fichier original derrière un hard link ne change rien pour ce lien : le contenu reste accessible, intact. Cette différence de comportement n’est pas arbitraire, elle découle directement de ce qu’est réellement chacun des deux types de lien.
Ce qu’un inode représente
Chaque fichier sur un système Linux est en réalité un inode (les métadonnées et l’emplacement des données sur le disque), et un ou plusieurs noms dans un répertoire qui pointent vers cet inode. Le nom qu’on utilise couramment pour désigner « le fichier » n’est qu’une entrée de répertoire parmi d’éventuelles autres, toutes pointant vers le même inode sous-jacent.
Hard link : un nom de plus pour le même inode
Un hard link ajoute une entrée de répertoire supplémentaire pointant vers exactement le même inode que l’original, incrémentant son compteur de références. Supprimer un des noms décrémente ce compteur sans jamais toucher aux données tant qu’au moins un nom pointe encore vers cet inode, exactement le même mécanisme qui explique pourquoi un fichier supprimé mais encore ouvert par un processus continue d’occuper de l’espace disque.
# Deux noms, un seul inode, un compteur de références à 2
ln original.txt hardlink.txt
ls -li original.txt hardlink.txt
# 123456 -rw-r--r-- 2 user user ... original.txt
# 123456 -rw-r--r-- 2 user user ... hardlink.txt
Symlink : un chemin, pas un inode
Un lien symbolique est un fichier à part entière, avec son propre inode, dont le contenu est simplement le chemin vers un autre fichier. Le kernel résout ce chemin à chaque accès : si le fichier cible disparaît ou se déplace, le symlink continue d’exister, mais pointe désormais vers rien, un état appelé lien orphelin (dangling symlink).
# Un inode différent, un contenu qui est un chemin texte
ln -s original.txt symlink.txt
ls -li original.txt symlink.txt
# 123456 -rw-r--r-- 1 user user ... original.txt
# 789012 lrwxrwxrwx 1 user user ... symlink.txt -> original.txt
Deux limitations propres aux hard links
Un hard link ne peut jamais traverser une frontière de système de fichiers (deux partitions différentes n’ont pas les mêmes tables d’inodes), une limitation que les symlinks n’ont pas puisqu’ils ne stockent qu’un chemin texte. Un hard link vers un répertoire est également interdit sur la plupart des systèmes (au risque de créer des boucles impossibles à parcourir de façon fiable), alors qu’un symlink vers un répertoire est parfaitement courant.
À retenir
Un hard link est un nom de plus pointant vers le même inode, incrémentant son compteur de références : supprimer l’original ne détruit rien tant qu’un autre nom subsiste, le même principe qui explique la persistance d’un fichier supprimé mais encore ouvert. Un symlink est un fichier séparé dont le contenu est un chemin, résolu à chaque accès : supprimer ou déplacer la cible laisse un lien orphelin, cassé mais toujours présent. Les hard links ne peuvent ni traverser une frontière de système de fichiers ni pointer vers un répertoire, deux limitations qui n’existent pas pour les symlinks, un chemin texte n’ayant par nature aucune de ces contraintes.