Cours Linux / Liens physiques et symboliques : différences et création avec ln
Un lien physique, aussi appelé hard link, donne un autre nom au même fichier et au même inode. Un lien symbolique possède son propre inode et contient un chemin vers une cible. Cette différence explique pourquoi renommer un premier nom peut préserver l’accès par un lien physique tout en cassant un lien symbolique qui conservait ce chemin.
Le cours types de fichiers et métadonnées avec ls, file et stat explique comment lire l’inode et le nombre de liens. Ici, vous créez les deux formes dans un dossier neuf de votre Linux de pratique, observez leurs différences, puis restaurez le nom initial.
Deux noms pour un objet, ou un chemin vers un nom
Un nom comme original.txt est une entrée de répertoire permettant de retrouver un objet. Avec un lien physique supplémentaire, original.txt et hard.txt désignent le même inode dans le même système de fichiers. Aucun de ces deux noms n’a ensuite un statut technique d’« original principal » : ils sont deux accès au même objet.
Un lien symbolique est un objet distinct qui conserve du texte, par exemple original.txt. Lorsqu’une opération suit ce lien, elle cherche la cible indiquée. Si ce nom n’existe plus, le lien peut rester présent mais ne plus permettre l’ouverture de la cible : c’est un lien cassé, ou pendant.
Le schéma représente la relation entre les noms et les objets ; il ne présente pas une copie indépendante des données. La documentation Linux des liens décrit cette distinction et les limites des liens physiques.
| Critère | Lien physique | Lien symbolique |
|---|---|---|
| Relation | Autre nom du même objet | Objet contenant un chemin |
| Inode dans l’exercice | Identique à celui du premier nom | Inode propre au lien |
| Renommage du premier nom | L’autre nom continue de désigner l’objet | Le chemin enregistré peut devenir introuvable |
| Frontière de système de fichiers | Ne peut pas la traverser sous Linux | Peut désigner un chemin situé ailleurs |
| Cible répertoire | Création normalement interdite sous Linux | Possible |
Un lien physique ne constitue pas une sauvegarde indépendante : une écriture sur l’objet commun est visible par tous ses noms. Un lien symbolique ne transporte pas non plus une copie du contenu. Son chemin peut viser un autre système de fichiers, mais celui-ci doit être disponible et accessible au moment de l’utilisation.
Créer un atelier neuf et les deux liens
Utilisez Bash, GNU ln, stat et readlink dans la VM Linux préparée pour le cours. Le système de fichiers de l’atelier doit accepter les liens utilisés. Si le nom du dossier existe déjà, choisissez un autre nom à la ligne candidat et recommencez ; ne réutilisez pas des données antérieures.
atelier=
candidat="$HOME/linux-course-09-practice"
if mkdir -- "$candidat"; then
atelier=$candidat
printf 'Atelier : %s\n' "$atelier"
else
printf '%s\n' 'Choisir un autre dossier neuf ; ne pas poursuivre dans un dossier existant.' >&2
fi
La variable atelier ne reçoit un chemin que si mkdir réussit. Gardez le même terminal ; les étapes suivantes vérifient que cette variable n’est pas vide et utilisent des chemins complets entre guillemets. Ne la redéfinissez pas vers un autre emplacement.
test -n "$atelier" &&
printf 'version 1\n' > "$atelier/original.txt" &&
ln -- "$atelier/original.txt" "$atelier/hard.txt" &&
ln -s -- original.txt "$atelier/shortcut.txt"
Sans -s, GNU ln crée un lien physique. Avec -s, il crée le lien symbolique. Dans la dernière ligne, le texte original.txt est volontairement relatif : il sera interprété depuis le dossier contenant shortcut.txt, pas depuis le dossier courant de votre terminal.
Le manuel GNU de ln explique les deux formes. Aucun remplacement forcé n’est demandé ici. Si une étape échoue, examinez l’erreur et les entrées déjà créées avant de recommencer tout le bloc.
Comparer les inodes et le chemin enregistré
Demandez à GNU stat le numéro de système de fichiers/périphérique, le numéro d’inode, le nombre de liens physiques et le nom fourni :
test -n "$atelier" &&
stat -c '%d:%i | %h | %n' -- "$atelier/original.txt" "$atelier/hard.txt" "$atelier/shortcut.txt" &&
readlink -- "$atelier/shortcut.txt"
%d:%i permet de comparer l’identité dans le contexte observé ; %h indique le nombre de liens physiques. Les deux premières lignes doivent avoir le même couple et un nombre de liens de 2. Le lien symbolique possède son propre inode et normalement un seul nom dans cet exercice. Les nombres précis varient : il n’y a aucun identifiant particulier à reproduire.
readlink affiche original.txt, c’est-à-dire le texte conservé dans shortcut.txt. La documentation Linux de création des liens physiques précise que les deux noms d’un lien physique désignent le même fichier. Le manuel readlink distingue la lecture du texte et la résolution d’un chemin.
Pour l’instant, les trois accès permettent de lire la même ligne :
test -n "$atelier" &&
cat -- "$atelier/original.txt" &&
cat -- "$atelier/hard.txt" &&
cat -- "$atelier/shortcut.txt"
Chacun affiche version 1. Ce résultat identique ne signifie pas que les trois entrées ont la même structure : le dernier accès suit un chemin conservé dans un autre objet.
Observer une écriture par le lien physique
Ajoutez une ligne au fichier en passant seulement par hard.txt :
test -n "$atelier" &&
printf 'version 2\n' >> "$atelier/hard.txt" &&
cat -- "$atelier/original.txt"
La lecture par original.txt montre maintenant version 1 puis version 2. L’écriture a modifié l’objet commun, pas une seconde copie qui serait ensuite synchronisée. Le lien symbolique permet aussi de retrouver ces données tant que son chemin est valide.
Revenez au contenu initial avant l’expérience de renommage :
test -n "$atelier" &&
printf 'version 1\n' > "$atelier/hard.txt" &&
cat -- "$atelier/original.txt"
Vous devez de nouveau lire seulement version 1. Ici, la redirection écrit dans le fichier existant. Si un programme remplace au contraire une entrée par un nouvel objet, le nom remplacé peut ne plus partager l’ancien inode : contrôlez l’identité au lieu de supposer que toute opération présentée comme une « modification » conserve le même objet.
Renommer le premier nom et constater le lien cassé
Renommez seulement original.txt. Dans cet atelier neuf, renamed.txt ne doit pas exister. Si une confirmation de remplacement apparaît, n’écrasez pas un autre fichier : vérifiez l’état avant de poursuivre.
test -n "$atelier" &&
mv -i -- "$atelier/original.txt" "$atelier/renamed.txt" &&
test ! -e "$atelier/original.txt" &&
cat -- "$atelier/hard.txt" &&
readlink -- "$atelier/shortcut.txt"
hard.txt permet encore de lire version 1, car il désigne toujours le même inode. readlink affiche encore original.txt : le texte du lien symbolique n’a pas été réécrit automatiquement.
Essayez ensuite l’ouverture par le lien symbolique :
test -n "$atelier" && cat -- "$atelier/shortcut.txt"
Cette commande doit échouer avec un diagnostic de cible absente. C’est le résultat attendu de cette étape. Le lien shortcut.txt existe encore, mais la recherche de son chemin original.txt n’aboutit plus. Un readlink réussi ne prouve donc pas que la cible est disponible.
Dans le cas d’un chemin relatif, déplacer seulement le lien dans un autre répertoire change aussi son point de départ et peut casser sa cible. Déplacer ensemble un lien et son voisinage peut préserver leur relation, à condition que le chemin relatif reste correct.
Restaurer le nom et choisir le bon type de lien
Pour réparer le chemin dans cet exercice, remettez renamed.txt sous le nom initial. S’il existe entre-temps un nouveau original.txt, examinez-le et ne validez pas son remplacement sans comprendre ce qu’il contient.
test -n "$atelier" &&
mv -i -- "$atelier/renamed.txt" "$atelier/original.txt" &&
test ! -e "$atelier/renamed.txt" &&
cat -- "$atelier/shortcut.txt" &&
stat -c '%d:%i | %h | %n' -- "$atelier/original.txt" "$atelier/hard.txt"
shortcut.txt doit à nouveau permettre la lecture de version 1. original.txt et hard.txt doivent conserver la même identité et le nombre de liens attendu. La restauration a rétabli un nom ; elle n’a pas modifié le texte conservé dans le lien.
- Autre nom du même fichier, dans le même système de fichiers : utilisez un lien physique si le partage du même objet correspond au besoin.
- Chemin vers un fichier ou un répertoire, éventuellement sur un autre système de fichiers : utilisez un lien symbolique et choisissez consciemment un chemin relatif ou absolu.
- Copie indépendante pour conserver un contenu : un lien ne remplace pas une copie ou une sauvegarde adaptée.
Retirer un seul nom de lien physique laisse l’objet accessible par les autres noms restants. Retirer un lien symbolique ordinaire avec rm sur son nom exact retire le lien lui-même. Agir sur un chemin situé à l’intérieur de sa cible ou modifier le chemin avec un séparateur final peut désigner autre chose ; vérifiez toujours l’objet visé avant une suppression.
Les options de création sont détaillées dans le guide de ln, actuellement en anglais. Le guide français de readlink et des cibles relatives ou cassées permet d’approfondir l’examen d’un lien lorsque son texte et son résultat d’ouverture semblent se contredire.





