Lien symbolique

Un article de Wikipédia, l'encyclopédie libre.
Aller à : navigation, rechercher
Page d'aide sur l'homonymie Pour les articles homonymes, voir Lien.
Le fichier Nom B est un lien symbolique sur le fichier Nom A.

Un lien symbolique (en anglais soft link, symbolic link ou symlink par troncation) est une entrée spéciale de répertoire dans les systèmes Unix ou type Unix modernes qui permet de référencer de manière quasi transparente d'autres entrées de répertoire, typiquement, des fichiers ordinaires ou des répertoires. On peut dire qu'un lien symbolique est un alias d'un fichier ordinaire ou d'un répertoire.

On appelle déréférencement l'action du système d'exploitation consistant à remplacer le nom du lien symbolique par celui qu'il pointe.

L'appel système permettant de retrouver le fichier pointé par le lien est readlink[1].

Utilisation[modifier | modifier le code]

Sous un système Unix, les liens symboliques sont créés par la présence de l'option -s à la commande ln :

ln -s nom_du_fichier_pointé nom_du_lien_symbolique

Sous Windows et uniquement sur une partition NTFS, les liens symboliques sont créés par la présence de l'option /D dans une invite de commandes ; toutefois, il y a une inversion entre le lien et la cible (par rapport à la commande ln) :

MKLINK /D nom_du_lien_symbolique nom_du_fichier_pointé

Bien que la syntaxe (l'ordre des arguments) soit similaire à celles des commandes cp et mv, elle est finalement contre-intuitive, et il arrive souvent que l'ordre des paramètres soit inversé par erreur, ce qui aboutit à des résultats surprenants : le lien est créé à l'intérieur du répertoire pointé, et se référence lui-même. L'origine de cette erreur provient probablement du fait que l'on transpose mentalement la phrase « je veux aller de nom_du_lien_symbolique à nom_du_fichier_pointé » dans laquelle l'ordre des objets est exactement l'inverse de ce qu'ils seront dans la commande. Une autre source de confusion est que pour liens relatifs, si nom_du_lien_symbolique ne se situe pas dans le répertoire courant, alors nom_du_fichier_pointé ne désigne pas le fichier tel qu'accessible depuis le répertoire courant : nom_du_fichier_pointé doit être résolu à partir du répertoire où se situera le lien.

Avec la version GNU de cp, il est possible de créer de façon beaucoup plus intuitive un lien symbolique vers un fichier donné. Ceci ne fonctionnera cependant pas avec les répertoires, et pour les liens relatifs, le lien symbolique à créer doit se trouver dans le répertoire courant. De plus, puisque cela n'est pas POSIX, il n'est pas recommandé d'utiliser ceci dans un script (la version BSD de cp, entre autres, ne supporte pas cette option) :

cp -s nom_du_fichier_pointé nom_du_lien_symbolique

La plupart des opérations (lecture, écriture, exécution) sur un lien symbolique le déréférencent automatiquement et opèrent sur sa cible (le fichier réel). La suppression (rm) ou le déplacement/renommage (mv) portent sur le lien et n'affectent pas le fichier.

Un lien symbolique a toujours les mêmes droits d'accès que le fichier sur lequel il pointe. En réalité, les droits d'accès indiqués pour un lien symbolique sont sans signification. La commande chmod déréférence toujours les fichiers qui lui sont passés en argument et il n'est donc pas possible de donner des autorisations spécifiques au lien symbolique.

La commande d'affichage de contenu de répertoire ls représente les liens symboliques de la façon suivante :

lrwxrwxrwx  1 root root  9 2005-08-26 21:47 python -> python2.3

Le l de la première colonne indique que cette entrée est un lien symbolique. À l'extrême droite de la ligne sont affichés les caractéristiques de ce lien symbolique : quand l'utilisateur accèdera à python, il sera redirigé de façon transparente par le système vers la version python2.3. Dans cet exemple, le lien symbolique a été créé pour conserver à la fois plusieurs versions (2.1, 2.2, 2.3, etc.) du langage Python.

Contrairement aux liens matériels, les liens symboliques peuvent pointer sur des fichiers ordinaires, des répertoires, sur eux-mêmes ou sur des cibles qui n'existent pas (l'existence du nom_du_fichier_pointé n'est même pas vérifiée lors de la création du lien par la commande ln). C'est seulement au moment d'accéder à un lien symbolique que la vérification est faite. Quand la cible d'un lien symbolique n'existe pas, on dit que le « lien est cassé » (broken link, en anglais). Une tentative d'ouvrir en lecture un lien cassé conduit à un message d'erreur de type « fichier non trouvé », assez surprenant car le lien symbolique existe bel et bien.

Les liens symboliques peuvent être source de mauvaises surprises aux débutants, car ils donnent l'impression qu'un fichier est présent de multiples fois dans l'arborescence du système de fichiers. Une suppression de la cible faite dans l'illusion que ce même fichier existe ailleurs (alors que ce ne sont que des liens), conduit alors à la perte définitive du fichier, et casse instantanément tous les liens symboliques qui pointaient dessus.

Certains vieux programmes, créés alors que les liens n'existaient pas, peuvent avoir des conséquences assez catastrophiques quand ils sont confrontés à des liens, qu'ils soient symboliques ou matériels. Dans le meilleur des cas, ils peuvent tomber dans une boucle sans fin en tentant de suivre indéfiniment une arborescence liée sur elle-même. Au pire, la suppression d'un lien symbolique pointant sur un répertoire conduira à la suppression du contenu du répertoire lié. Fort heureusement, la gestion des liens par Unix est assez ancienne, et il est peu probable de rencontrer de tels programmes. Cependant, cela n'empêche pas le système de se protéger en interdisant, par exemple, la suppression d'un lien symbolique pointant sur un répertoire au moyen de la commande rmdir (comportement typique d'un programme non prévu pour les liens).

Stockage[modifier | modifier le code]

Nom A (de type slow symlink) et Nom C (de type fast symlink) sont deux liens symboliques pointant sur Nom B.

Les premières implémentations des liens symboliques traitaient les informations concernant le fichier pointé comme les données d'un fichier ordinaire. Ce fichier ordinaire contenait juste la chaîne de caractères représentant le nom du fichier pointé et seul un drapeau indiquait au système de ne pas ouvrir ce fichier, mais celui dont le nom y était indiqué.

Cette méthode a l'avantage d'être simple à réaliser mais présente cependant deux inconvénients. Premièrement, chaque ouverture d'un fichier via un lien symbolique ouvre en réalité deux fichiers, et même plus si le chemin d'accès au fichier est lui-même constitué de liens symboliques. Ces ouvertures multiples ralentissent le système. Deuxièmement, les quelques octets nécessaires au stockage du nom du fichier pointé étant considérés comme un fichier, ils occupent la place d'une unité d'allocation complète sur le disque, ce qui entraine un gaspillage de l'espace de stockage. Cette première implémentation a été rétroactivement appelée slow symlink.

Une évolution appelée fast symlink est à la fois plus rapide et moins dispendieuse en capacité de stockage. Elle consiste à stocker la chaîne de caractères représentant le nom du fichier pointé dans une zone supplémentaire de l'inode. Ceux-ci contenant les informations vitales du système de fichiers, ils sont souvent utilisés par le système, qui les maintient donc en mémoire centrale pour leur garantir un accès immédiat. Le nom du fichier pointé faisant partie de cette structure, il bénéficie lui aussi de cet accès rapide en mémoire, ce qui accélère grandement son déréférencement. Cependant, le système peut se replier sur l'ancienne méthode (lente) si la longueur de la chaîne de caractères dépasse les capacités limitées de stockage d'un inode.

Autres systèmes d'exploitation[modifier | modifier le code]

  • Sous Windows, les liens symboliques sont connus sous le nom de raccourcis. Cependant, à la différence des systèmes Unix, ils sont implémentés sous forme de fichiers classiques portant l'extension .lnk. De plus, le déréférencement n'est pas effectué par le système, mais par l'interface graphique, ce qui oblige les programmes à utiliser une interface de programmation spécifique pour s'en servir. À partir de la version Windows 2000 de NTFS, il existe des « points de jonction » qui permettent de simuler le comportement des liens symboliques vers des répertoires locaux[2]. Il est également possible d'utiliser l'outil fsutil avec l'option hardlink, intégré dès Windows XP.
  • Sous Windows Vista et Windows 7, il est possible de créer des liens symboliques ayant le même fonctionnement que sous Linux grâce à la commande mklink.
  • Sous Mac OS X, les liens symboliques ne doivent pas être confondus avec les alias. Contrairement aux raccourcis, les alias s'adaptent aux déplacements du fichier pointé, c'est-à-dire que si on déplace le fichier pointé, l'alias pointera toujours dessus alors que le lien symbolique (raccourci) ne sera pas en mesure de retrouver le fichier déplacé et sera donc inutile.
  • Sous OS/2, les liens symboliques sont ou étaient connus sous le nom de shadows dans la version anglaise.

Notes et références[modifier | modifier le code]

Voir aussi[modifier | modifier le code]

Articles connexes[modifier | modifier le code]

Liens externes[modifier | modifier le code]