Qu’est-ce qu’un lien dur ? — définition par The Linux Information Project (LINFO)

Un lien dur est simplement un nom supplémentaire pour un fichier existant sur Linux ou d’autres systèmes d’exploitation de type Unix.

Un nombre quelconque de liens durs, et donc un nombre quelconque de noms, peut être créé pour n’importe quel fichier. Les liens durs peuvent également être créés vers d’autres liens durs. Cependant, ils ne peuvent pas être créés pour des répertoires, et ils ne peuvent pas traverser les frontières des systèmes de fichiers ou s’étendre sur des partitions.

Le système d’exploitation ne fait aucune distinction entre le nom qui a été attribué à l’origine à un fichier lorsqu’il a été créé pour la première fois et tous les liens durs qui sont créés par la suite vers ce fichier, si ce n’est qu’ils sont simplement des noms multiples pour le même fichier. Ceci est dû au fait que le nom d’origine et tous les liens matériels pointent tous vers le même inode. Un inode est une structure de données (c’est-à-dire une façon optimisée de stocker des informations) qui stocke toutes les informations sur un fichier (par exemple, sa taille, ses autorisations d’accès, sa date de création et son emplacement sur le système) à l’exception de son ou ses noms et de ses données réelles. Le fait que les numéros d’inode ne soient uniques qu’au sein de tout système de fichiers est la raison pour laquelle ils ne fonctionnent pas entre les systèmes de fichiers et les partitions.

Les liens durs sont créés avec la commande ln. Par exemple, ce qui suit créerait un lien dur nommé hlink1 vers un fichier nommé file1, tous deux dans le répertoire courant (c’est-à-dire le répertoire dans lequel l’utilisateur travaille actuellement):

ln file1 hlink1

Lorsqu’un lien dur est créé, il n’y a aucune indication évidente qu’il est différent de tout autre fichier. C’est-à-dire que les liens durs semblent être des fichiers du même type que leurs fichiers cibles (c’est-à-dire les fichiers auxquels ils sont liés) lorsqu’ils sont visualisés avec des commandes telles que ls (c’est-à-dire liste) et file (qui est utilisé pour déterminer le type de tout fichier spécifié). De même, lorsqu’ils sont visualisés dans une IUG (interface utilisateur graphique), les icônes des liens durs sont identiques à celles de leurs fichiers cibles.

Le fait que le nom initial d’un fichier et tous les liens durs vers ce fichier partagent tous le même inode peut être clairement vu en utilisant la commande ls avec son option -i (c’est-à-dire inode). Ainsi, par exemple, ce qui suit montrerait que les numéros d’inode de file1 et hlink1 de l’exemple ci-dessus sont identiques:

ls -i file1 hlink1

Le nombre de liens durs vers n’importe quel fichier est montré dans la deuxième colonne de la sortie produite en utilisant ls avec son option -l (i.e., long). On peut voir que le nombre est la somme du fichier cible et de tous les liens durs vers lui (c’est-à-dire, la somme du nom initial et de tous les noms ajoutés par la suite) et qu’il est le même pour la cible et pour chacun de ces liens.

Les fichiers liés en dur peuvent également être trouvés en utilisant la commande find avec son option -type f (pour ne sélectionner que les fichiers réguliers) suivie de son option -links +1 (pour afficher tous les fichiers réguliers ayant plus d’un lien en dur vers eux) comme suit :

find -type f -links +1

Lorsqu’une modification est apportée au contenu d’un fichier, le lien vers tous les liens en dur est préservé. Cependant, certains éditeurs de texte peuvent rompre le lien en créant un nouvel inode pour le contenu révisé,1 et il peut donc être prudent de vérifier les liens importants après avoir modifié les fichiers.

La commande rm semble superficiellement retirer ou supprimer des fichiers. Ce qu’elle fait réellement, cependant, c’est de réduire d’une unité le compte de liens durs d’un fichier (c’est-à-dire le nombre de noms que le fichier possède), et elle n’affecte pas directement l’inode ou les données du fichier. Lorsque le compte atteint zéro, le fichier semble avoir disparu car il n’y a plus aucun moyen facile de le référencer. Cependant, les données du fichier ne sont réellement supprimées que lorsque le ou les emplacements du disque dur (HDD) ou d’un autre support de stockage qui le contient sont écrasés par un nouveau fichier.

Ainsi, par exemple, ce qui suit supprimerait le lien dur hlink1 qui a été créé dans l’exemple ci-dessus :

rm hlink1

Utiliser à nouveau rm avec le seul nom restant comme suit rendrait alors les données du fichier virtuellement inaccessibles :

rm file1

Peut-être que l’application la plus utile des liens durs est de permettre aux fichiers, aux programmes et aux scripts (i.c’est-à-dire des programmes courts) d’être facilement accessibles dans un répertoire différent de celui du fichier original ou du fichier exécutable (c’est-à-dire, la version prête à être exécutée d’un programme). En tapant le nom du lien dur, le programme ou le script sera exécuté de la même manière qu’en utilisant son nom original.

Les liens symboliques, également appelés liens souples, sont plus utiles que les liens durs car ils peuvent être faits vers des répertoires ainsi que vers des fichiers sur différents systèmes de fichiers et sur différentes partitions. De plus, lorsqu’on utilise une interface graphique, les liens symboliques ont des icônes spéciales qui les identifient immédiatement comme étant des liens plutôt que des fichiers ordinaires. Cependant, ils ont l’inconvénient de devenir inutilisables si leur fichier cible est supprimé.

Les alias ressemblent superficiellement aux liens symboliques en ce qu’ils sont une autre façon de fournir des noms multiples pour tout fichier. Cependant, la commande alias est intégrée au shell (c’est-à-dire le programme qui fournit l’interface utilisateur en mode texte) plutôt que d’être un programme séparé et le mécanisme est très différent de celui des liens durs. Comme les liens symboliques, les alias peuvent être utilisés non seulement pour les fichiers mais aussi pour les répertoires et peuvent traverser les frontières des systèmes de fichiers et des partitions. En outre, un alias peut être utilisé comme un nom court pour tout texte de l’interpréteur de commandes (c’est-à-dire une commande ou une série de commandes liées, y compris leurs options et/ou arguments).

________
1Des tests sur Red Hat Linux 9 ont révélé que les liens durs étaient rompus lors de la modification de fichiers à l’aide de l’éditeur de texte gedit. Cependant, ils n’étaient pas rompus lors de l’utilisation des éditeurs de texte vi et Abiword ainsi que de l’éditeur hexagonal KHexEdit sur la même version de Linux. L’incapacité de gedit à préserver les liens durs était due au fait qu’il crée en fait une copie du fichier modifié qu’il enregistre (et donc le nouveau numéro d’inode) plutôt que d’apporter les modifications au fichier original, mais cette copie reçoit le nom du fichier original. Cependant, un test similaire utilisant une version plus récente de gedit (2.14.0) sur Fedora Core 5 a montré que le problème avait été corrigé et qu’il n’y avait pas de rupture de liens.