Aller au contenu

Créer et manipuler des liens

Objectif : gérer les liens symboliques et les liens physiques sous Linux.

Jusqu'ici, notre prise en main du système Linux consistait essentiellement à manipuler des fichiers et des répertoires. À l'occasion de nos travaux pratiques, peut-être avez-vous remarqué ici ou là, la présence de fichiers mystérieux qui ne semblent tomber ni dans l'une ni dans l'autre de ces deux catégories.

Les liens symboliques

Si vous affichez les détails du fichier /bin/sh, vous obtenez ceci :

$ ls -l /bin/sh
lrwxrwxrwx. 1 root root 4 May 15 09:57 /bin/sh -> bash

Cet OVNI (Objet virtuel non identifié) est un lien ; plus exactement, un lien symbolique. Dans l'affichage détaillé, il est identifié non pas par un tiret - (fichier) ou un d (directory, c'est-à-dire répertoire), mais par un l comme link, autrement dit un lien.

Notez la petite flèche -> qui pointe vers un autre nom de fichier, en l'occurrence bash. Il faut donc lire : /bin/sh est un lien symbolique qui pointe vers le fichier bash situé dans le même répertoire.

Créer des liens symboliques

Le meilleur moyen de maîtriser un nouvel objet, c'est de faire comme les enfants : jouer avec. Dans votre répertoire d'utilisateur, créez un répertoire test_liens, placez-vous dedans, puis créez un fichier texte.txt avec un peu de contenu (bidon, certes) :

$ mkdir test_liens
$ cd test_liens/
$ cat > texte.txt << EOF
> Première ligne
> Deuxième ligne
> Troisième ligne
> EOF

Maintenant, créons un lien symbolique vers ce fichier :

$ ln -s texte.txt lien.txt

Voyons le résultat de cette opération :

$ ls -l
total 4
lrwxrwxrwx. 1 microlinux microlinux  9 May 26 08:09 lien.txt -> texte.txt
-rw-rw-r--. 1 microlinux microlinux 49 May 26 08:09 texte.txt

Arrêtons-nous là et essayons d'établir un état des lieux sommaire :

  • les permissions rwxrwxrwx semblent pour le moins insolites ;

  • les deux fichiers n'ont pas la même taille : 9 octets pour l'un, 49 octets pour l'autre ;

  • dans la console, lien.txt apparaît non pas en blanc sur fond noir, mais en turquoise.

Nous pouvons déjà expliquer les différences de taille. Le fichier texte.txt comprend en gros 49 caractères, si l'on additionne y compris les retours chariot. Quant à lien.txt, il pointe vers "texte.txt", c'est-à-dire vers un nom de fichier comptant exactement 9 caractères. Pouvons-nous afficher le contenu de lien.txt ?

$ cat lien.txt
Première ligne
Deuxième ligne
Troisième ligne

Vu sous cet angle, le contenu des deux fichiers est identique. Voyons si nous pouvons ajouter du contenu :

$ echo "Quatrième ligne" >> lien.txt
$ cat lien.txt
Première ligne
Deuxième ligne
Troisième ligne
Quatrième ligne

Regardons à nouveau le listing détaillé :

$ ls -l
total 4
lrwxrwxrwx. 1 microlinux microlinux  9 May 26 08:09 lien.txt -> texte.txt
-rw-rw-r--. 1 microlinux microlinux 66 May 26 08:10 texte.txt

Depuis que nous avons ajouté du texte à lien.txt, la taille de ce dernier n'a pas changé. En revanche, c'est bien texte.txt qui compte désormais 66 au lieu de 49 octets.

À quoi servent les liens symboliques ?

Les liens symboliques sont omniprésents sur un système Linux. Notre installation minimale en compte déjà plus de 9000 :

$ sudo find / -type l 2> /dev/null | wc -l
9666

La commande wc (word count) sert à compter les octets, les mots ou les lignes d'un fichier. Avec l'option -l (pour --lines), elle affiche le nombre de sauts de ligne. Reportez-vous à sa page man pour plus d'informations.

Exemple n°1 : awk

Dans la leçon consacrée à la gestion des utilisateurs, nous avons utilisé awk pour extraire des informations du fichier /etc/passwd. AWK est un langage de programmation et il en existe plusieurs implémentations.

$ ls -l /usr/bin/awk
lrwxrwxrwx. 1 root root 4 May 15 09:57 /usr/bin/awk -> gawk

Sur notre système, /usr/bin/awk pointe vers gawk, ce qui signifie que lorsque nous invoquons awk, c'est en réalité la commande gawk qui est utilisée sous le capot. Plus précisément, on dira que GNU AWK (gawk) est l'implémentation de AWK sur notre système.

Exemple n°2 : ex

L'éditeur ex (raccourci pour EXtended) a été utilisé sur les systèmes Unix depuis la fin des années 1970. La commande /usr/bin/ex existe encore sur notre système Linux, sous forme de lien symbolique qui pointe vers l'éditeur Vi :

$ ls -l /usr/bin/ex
lrwxrwxrwx. 1 root root 2 May 15 09:58 /usr/bin/ex -> vi

On peut y voir une forme d'hommage envers la tradition. Plutôt que de rendre une commande obsolète, on va la faire pointer vers une implémentation plus récente.

Exemple n°3 : gpg

Le lien symbolique utilisé pour l'outil de chiffrement gpg (GNU Privacy Guard) répond probablement à une logique similaire :

$ ls -l /usr/bin/gpg
lrwxrwxrwx. 1 root root 4 May 15 09:59 /usr/bin/gpg -> gpg2

Conclusion

Dans tous ces cas de figure, les liens symboliques servent manifestement à accéder à un programme (gawk, vi, gpg2) avec un nom habituel (awk, ex, gpg).

Lequel est le vrai ?

Un lien symbolique n'est pas seulement susceptible de pointer vers un fichier, mais également vers un répertoire. Replacez-vous dans le répertoire ~/test_liens en tant qu'utilisateur et saisissez les commandes suivantes :

$ ln -s /tmp/ depot
$ ls -l
total 4
lrwxrwxrwx. 1 microlinux microlinux  5 May 26 08:56 depot -> /tmp/
lrwxrwxrwx. 1 microlinux microlinux  9 May 26 08:09 lien.txt -> texte.txt
-rw-rw-r--. 1 microlinux microlinux 66 May 26 08:10 texte.txt

Nous l'avons dit plus haut : /tmp est un répertoire temporaire, comme son nom le suggère. Affichez le contenu de ce répertoire :

$ ls /tmp/
systemd-private-6eab...-chronyd.service-wBmOBA
systemd-private-80a2...-chronyd.service-H7mM7j
systemd-private-8b6e...-chronyd.service-R2I0Pf

Sans rentrer dans les détails, notons que ces données temporaires appartiennent à chronyd, un service qui se charge d'ajuster l'horloge système en consultant des sources de temps externes.

Et maintenant, voyez ce que contient le répertoire depot :

$ ls depot/
systemd-private-6eab...-chronyd.service-wBmOBA
systemd-private-80a2...-chronyd.service-H7mM7j
systemd-private-8b6e...-chronyd.service-R2I0Pf

Il ne s'agit pas d'une copie du contenu de /tmp, mais bel et bien des mêmes données. Autrement dit, le lien symbolique depot fonctionne comme un représentant à part entière du répertoire /tmp vers lequel il pointe.

Casser un lien symbolique

Que se passe-t-il maintenant si la cible d'un lien symbolique vient à disparaître ? Nous n'allons pas effacer notre répertoire /tmp, ce serait une très mauvaise idée, mais nous pouvons tenter l'expérience avec le fichier texte.txt, la cible du lien symbolique lien.txt :

$ ls -l
total 4
lrwxrwxrwx. 1 microlinux microlinux  5 May 26 08:56 depot -> /tmp/
lrwxrwxrwx. 1 microlinux microlinux  9 May 26 08:09 lien.txt -> texte.txt
-rw-rw-r--. 1 microlinux microlinux 66 May 26 08:10 texte.txt
$ rm texte.txt
$ ls -l
total 0
lrwxrwxrwx. 1 microlinux microlinux 5 May 26 08:56 depot -> /tmp/
lrwxrwxrwx. 1 microlinux microlinux 9 May 26 08:09 lien.txt -> texte.txt

Un lien dont la cible a disparu est un "lien cassé" (broken link). Dans notre terminal, le lien cassé apparaît en rouge sur fond noir, un choix de couleur qui suggère que quelque chose ne tourne pas rond.

Nous pourrions très bien recréer la cible moyennant un simple touch. Le fichier serait certes vide, son ancien contenu serait perdu, mais le lien "saurait" que sa cible existe et ne rouspéterait plus.

$ ls -l
total 0
lrwxrwxrwx. 1 microlinux microlinux 5 May 26 08:56 depot -> /tmp/
lrwxrwxrwx. 1 microlinux microlinux 9 May 26 08:09 lien.txt -> texte.txt
$ touch texte.txt
$ ls -l
total 0
lrwxrwxrwx. 1 microlinux microlinux 5 May 26 08:56 depot -> /tmp/
lrwxrwxrwx. 1 microlinux microlinux 9 May 26 08:09 lien.txt -> texte.txt
-rw-rw-r--. 1 microlinux microlinux 0 May 26 09:06 texte.txt

Effacer un lien symbolique

Nous avons vu comment il est possible d'associer des fichiers et des répertoires à des liens symboliques. Voyons maintenant comment lever cette association, c'est-à-dire effacer des liens :

$ ls -l
total 4
lrwxrwxrwx. 1 microlinux microlinux  5 May 26 08:56 depot -> /tmp/
lrwxrwxrwx. 1 microlinux microlinux  9 May 26 09:09 lien.txt -> texte.txt
-rw-rw-r--. 1 microlinux microlinux 66 May 26 09:09 texte.txt
$ rm lien.txt
$ ls -l
total 4
lrwxrwxrwx. 1 microlinux microlinux  5 May 26 08:56 depot -> /tmp/
-rw-rw-r--. 1 microlinux microlinux 66 May 26 09:09 texte.txt

Ce qu'il faut retenir ici, c'est que la suppression d'un lien symbolique par le biais de la commande rm n'entraîne en aucun cas la suppression de la cible. En effet, texte.txt est toujours là.

Il en va de même pour un lien symbolique qui pointe vers un répertoire :

$ ls -l
total 4
lrwxrwxrwx. 1 microlinux microlinux  5 May 26 08:56 depot -> /tmp/
-rw-rw-r--. 1 microlinux microlinux 66 May 26 09:09 texte.txt
[microlinux@linuxbox test_liens]$ rm depot
[microlinux@linuxbox test_liens]$ ls -ld /tmp/
drwxrwxrwt. 8 root root 4096 May 26 09:09 /tmp/

Ici, nous utilisons bien un simple rm, car depot n'est pas un répertoire à proprement parler. C'est un lien symbolique pointant vers un répertoire. Vous ne pourrez donc pas utiliser rmdir pour supprimer ce genre de lien.

Gare à la barre oblique !

Méfiez-vous de la complétion automatique lorsque vous supprimez un lien symbolique qui pointe vers un répertoire. Notez bien que, dans l'exemple, j'ai écrit rm depot et non pas rm depot/ avec la barre oblique finale. Dans le cas contraire, je me serais retrouvé confronté à un problème quelque peu ubuesque :

$ ls -l
total 4
lrwxrwxrwx. 1 microlinux microlinux  5 May 26 09:14 depot -> /tmp/
-rw-rw-r--. 1 microlinux microlinux 66 May 26 09:09 texte.txt
[microlinux@linuxbox test_liens]$ rm depot/
rm: cannot remove ‘depot/’: Is a directory
[microlinux@linuxbox test_liens]$ rmdir depot/
rmdir: failed to remove ‘depot/’: Not a directory

Les liens physiques

Un nom de fichier alternatif

Il existe une autre catégorie de liens : les liens physiques. La désignation de "lien" peut prêter à confusion dans ce cas ; il vaut mieux y voir quelque chose de l'ordre d'un "nom de fichier alternatif". En principe, un lien symbolique n'est rien d'autre qu'un petit fichier qui pointe vers un autre fichier, nous l'avons vu. La suppression du lien symbolique ne change rien au fichier original en soi, qui reste intact. Un lien physique, en revanche, constitue une référence supplémentaire à un emplacement du système de fichiers. C'est bien un seul et même fichier, mais accessible à partir d'un autre endroit et sous un autre nom. Un exemple éclaircira la nuance.

Videz le répertoire ~/test_liens et (re)créez-y un fichier texte.txt, comme pour le premier cas de figure :

$ cat > texte.txt << EOF
> Première ligne
> Deuxième ligne
> Troisième ligne
> EOF

À présent, créez un lien physique vers texte.txt. C'est très simple, il suffit d'omettre l'option -s de la commande ln :

$ ln texte.txt lien.txt
[microlinux@linuxbox test_liens]$ ls -l
total 8
-rw-rw-r--. 2 microlinux microlinux 49 May 26 09:17 lien.txt
-rw-rw-r--. 2 microlinux microlinux 49 May 26 09:17 texte.txt

Là aussi, arrêtons-nous un instant pour apprécier le résultat :

  • le lien physique n'apparaît pas en turquoise dans le terminal, mais en blanc (ou noir) sur fond bleu ;

  • ses permissions sont identiques à celles du fichier cible ;

  • apparemment, il a également la même taille que la cible : 49 octets dans l'exemple.

Le moment est venu de vous dévoiler solennellement la signification de la deuxième colonne du listing détaillé. Dans l'exemple, notez le 2 dans la deuxième colonne après les droits d'accès. Il s'agit tout simplement du nombre de liens physiques du fichier.

Un lien physique a la vie dure

Vous avez du mal à croire qu'un lien physique se comporte en tous points comme le fichier vers lequel il pointe ? Pour en avoir le coeur net, il suffit de supprimer l'original de l'exemple et de voir ce qui se passe :

$ ls
lien.txt  texte.txt
$ rm texte.txt
$ ls -l
total 4
-rw-rw-r--. 1 microlinux microlinux 49 May 26 09:17 lien.txt
$ cat lien.txt
Première ligne
Deuxième ligne
Troisième ligne

Ici, nous avons supprimé texte.txt, mais le fichier a en quelque sorte bénéficié d'une seconde vie, sous forme du lien physique lien.txt. Pour nous débarrasser une bonne fois pour toutes du fichier et de son contenu, il faudra donc également supprimer lien.txt.

Hard ou soft ?

Les liens symboliques et physiques sont souvent désignés par les termes anglais soft link et hard link.

Notez une restriction importante concernant la deuxième catégorie : un lien physique doit obligatoirement pointer vers un fichier dans le même système de fichiers, c'est-à-dire que la cible ne peut pas se situer sur une autre partition que le lien.

Si vous ne comprenez pas cette dernière précision, ce n'est pas bien grave.


La rédaction de ces cours demande du temps et des quantités significatives de café espresso. Vous appréciez cette formation ? Offrez un café au formateur.