Liens symboliques ou liens physiques sous Linux : ce que vous devez savoir
Points clés à retenir
- Les liens sous Linux sont comme des raccourcis : des références à un fichier qui ne le dupliquent pas.
- Un lien symbolique fait référence par nom de fichier mais se rompt si sa cible bouge.
- Un lien physique fait référence à l'inode d'un fichier qui peut être plus robuste mais plus difficile à comprendre.
Sous Linux, un lien est comme un raccourci vers un fichier, vous donnant un grand pouvoir pour décider de la manière dont vous organisez votre système de fichiers. Mais il existe deux types de liens, et ils sont très différents.
Que sont les liens sous Linux ?
Sous Linux, un fichier comporte deux parties : son nom et son contenu. Une structure appelée « inode » relie un nom de fichier aux données qu'il contient. Cet inode stocke également les métadonnées sur le fichier, comme son propriétaire, ses autorisations et la date de la dernière modification.
Un nom de fichier pointe simplement, ou "lien", vers cette structure d'inode. Cela signifie que plusieurs noms de fichiers peuvent faire référence à la même structure, c'est-à-dire au même fichier sous-jacent.
Créer un lien physique
Le type de lien par défaut est un « lien physique ». Vous pouvez créer un lien physique vers un fichier existant à l'aide de la commande ln sous cette forme :
ln existing_file new_hard_link
Vous aurez maintenant deux noms de fichiers pointant vers le même inode. Il est important de comprendre qu'il n'y a en réalité qu'un seul fichier ici, il se trouve qu'il a deux noms de fichier. Vous pouvez donc utiliser l'un ou l'autre nom (ou chemin) pour faire référence au même fichier, et tout restera synchronisé.
Essayez-le et vous verrez ce qui se passe. Commencez par copier un fichier comme vous le feriez normalement, en utilisant la commande cp :
echo "hello world" > foo
cp foo bar
ls -li
cat foo bar
Passer l'option i à ls lui demande d'imprimer le numéro d'inode de chaque fichier au début de la ligne. Notez que le nouveau fichier a un inode distinct, mais le même contenu que l'original.
Créez maintenant un lien physique vers le fichier d'origine et comparez-le :
ln foo hum
ls -li
cat foo bar hum
Notez que le lien physique a le même inode que le fichier d'origine : 43458473. foo et hum pointent tous deux vers le même fichier sous-jacent. Notez également le numéro dans la 3ème colonne, juste à droite des autorisations. Pour le fichier original (foo) et le lien physique (hum), cela indique "2", mais c'est "1" pour la copie (bar). Ce nombre représente le nombre total de liens physiques vers ce fichier.
Redessiner le premier schéma pour représenter le fichier original et son lien physique donne :
Il n'y a aucune différence significative entre le fichier original et le lien physique. En fait, les deux sont des "liens" au sens Linux du terme, et c'est pourquoi il existe une commande unlink qui fait le même travail que rm pour supprimer un fichier.
En répertoriant les numéros d'inodes, vous pouvez confirmer qu'il n'existe réellement qu'un seul fichier réel pour les deux noms de fichiers. Si vous avez encore des doutes, essayez de modifier le contenu de l'un ou l'autre fichier :
echo "some new contents" > hum
cat foo
Création d'un lien symbolique (soft)
Les liens symboliques (liens symboliques) vous permettent également de faire référence au même fichier à plusieurs emplacements. La différence est que, alors que les liens physiques référencent des inodes, les liens symboliques référencent d'autres fichiers par nom de fichier. Vous utilisez toujours la commande ln pour créer un lien symbolique, mais transmettez également l'indicateur -s (symbolique) :
ln -s existing_file new_soft_link
Un lien symbolique est un fichier à part entière ; il a un inode avec son propre contenu. Mais le contenu d'un lien symbolique n'est rien de plus qu'un nom de fichier, une référence à un fichier distinct pour lequel le lien symbolique doit servir de proxy. Les métadonnées stockées dans l'inode du lien symbolique le marquent explicitement comme un lien symbolique, de sorte que tout programme qui l'utilise saura récupérer le nom de fichier vers lequel il pointe.
Voici un exemple :
ln -s foo baz
cat baz
ls -li
Notez que cela ressemble beaucoup au cas du lien physique, mais la sortie de ls est assez différente. Tout d'abord, le lien symbolique est marqué d'un "l" (lien) au tout début des autorisations. Mais, plus utile encore, le nom de fichier du lien symbolique est coloré en rose et suivi d'une flèche et du nom de fichier d'origine.
La relation entre le lien symbolique et le fichier d'origine ressemble à ceci :
Lorsque vous créez un lien symbolique, vous pouvez choisir exactement comment référencer le fichier vers lequel il pointe. L'exemple précédent utilise simplement un nom de fichier simple qui est une référence relative à un fichier dans le même répertoire. Mais vous pouvez utiliser n'importe quel chemin valide, relatif ou absolu, par exemple :
ln -s foo sub/dir/baz
ln -s foo ../../baz
ln -s foo /tmp/baz
Vous avez peut-être déjà repéré une faille ici : que se passe-t-il si le fichier d'origine change de nom ou d'emplacement ? En fait, que se passe-t-il si le fichier du lien symbolique change d'emplacement ? Eh bien, selon le type de chemin que vous utilisez (relatif ou absolu) et selon que les deux fichiers sont déplacés ou un seul, tout va bien. Mais vous devrez être prudent.
Quand devriez-vous utiliser des liens physiques ou souples ?
Une utilisation courante des liens symboliques consiste à gérer les logiciels installés. Par exemple, sur mon système, j'ai vim, l'éditeur de texte, et vi, l'ancien éditeur à partir duquel il a évolué. Ils sont installés comme ceci :
Avec cette configuration, tout script utilisant vi utilisera silencieusement vim à la place.
Les deux types de liens sont utiles pour la gestion du système de fichiers. Vous pouvez utiliser des liens pour organiser vos fichiers et répertoires, les rendant plus accessibles sans gaspiller d'espace disque. Par exemple:
# Create a hard link to the apache log file in home directory
~ $ ln /var/log/apache2/access_log apache-log
# Create a soft link to a deeply-nested directory
~ $ ln -s ./work/acme/2024/10 current-work
Les liens peuvent être très utiles pour basculer entre différents fichiers sans avoir à les modifier. Par exemple, imaginez que vous disposez d'un fichier de configuration, conf, qu'un logiciel utilise. Vous pouvez créer plusieurs configurations, les stocker dans des fichiers séparés, puis basculer entre elles à l'aide de liens :
# Create two config files
config $ mv conf dark.conf
config $ cp dark.conf light.conf
# Use the dark config
config $ ln -s dark.conf conf
# Switch to the light config. Note -f to force overwrite of existing link.
config $ ln -fs light.conf conf
Un lien symbolique fonctionne jusqu'à ce que le fichier vers lequel il pointe soit déplacé ou renommé, il devient alors un lien rompu :
Pour cette raison, les liens symboliques fonctionnent souvent mieux dans un cadre restreint, lorsqu'un fichier et son lien se trouvent dans le même répertoire, par exemple.
Les liens physiques ne souffrent pas de ce problème ; vous pouvez les déplacer en toute sécurité n'importe où dans le même système de fichiers. Mais ils souffrent d’un problème différent. Certains éditeurs et autres programmes agissant sur un fichier créent une copie d'un fichier et le renomment lors de l'enregistrement, à des fins de sauvegarde. Ce comportement peut rompre les liens physiques, les rendant désynchronisés et occupant deux fois l'espace disque. Vous devez vérifier soigneusement les programmes avec lesquels vous modifiez les liens physiques, pour vous assurer qu'ils ne le font pas.
Si vous créez un lien vers un répertoire, un lien symbolique est votre seule option. Les liens physiques n’ont tout simplement pas beaucoup de sens lorsqu’il s’agit de répertoires et créeraient plus de problèmes qu’ils n’en résoudraient. Les liens physiques ne peuvent pas non plus être stockés dans un référentiel git.
Sur la ligne de commande, un lien physique est la valeur par défaut, mais les interfaces graphiques, comme Nautilus, par exemple, ne prennent généralement en charge que les liens symboliques. Même dans ce cas, vous devrez activer l’option via les Préférences :
Le concept de lien logiciel est légèrement plus facile à comprendre et, potentiellement, plus sûr. Les liens symboliques sont plus visibles, plus populaires et généralement plus faciles à comprendre.
Quel que soit le type de lien que vous utilisez, le concept peut prendre du temps et de la pratique pour être compris. Mais les liens sont très puissants et populaires, vous en ressentirez donc les avantages. Assurez-vous d'utiliser ls pour garder une trace des liens et essayez de ne pas en faire trop !