Objectif de cet atelier pratique :
- 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 Apr 12 09:05 /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 Sep 9 07:25 lien.txt -> texte.txt -rw-rw-r--. 1 microlinux microlinux 49 Sep 9 07:25 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, 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 Sep 9 07:25 lien.txt -> texte.txt -rw-rw-r--. 1 microlinux microlinux 66 Sep 9 07:29 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à un peu moins de 13000 :
$ sudo find / -type l 2> /dev/null | wc -l 12891
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 l’atelier pratique consacré à 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 Apr 15 23:17 /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 Apr 26 18:16 /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 : gpg2
Le lien symbolique utilisé pour l’outil de chiffrement gpg2
(GNU Privacy Guard) répond à une logique similaire. Ici, le lien symbolique permet de s’affranchir du numéro de version du logiciel :
$ ls -l /usr/bin/gpg2 lrwxrwxrwx. 1 root root 3 Apr 19 2021 /usr/bin/gpg2 -> gpg
Conclusion
Dans tous ces cas de figure, les liens symboliques servent manifestement à accéder à un programme (gawk
, vi
, gpg
) avec un nom habituel (awk
, ex
, gpg2
).
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 Sep 9 07:47 depot -> /tmp/ lrwxrwxrwx. 1 microlinux microlinux 9 Sep 9 07:25 lien.txt -> texte.txt -rw-rw-r--. 1 microlinux microlinux 66 Sep 9 07:29 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/ Fichiers Sauvegarde20220829
Et maintenant, voyez ce que contient le répertoire depot
:
$ ls depot/ Fichiers Sauvegarde20220829
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 Sep 9 07:47 depot -> /tmp/
lrwxrwxrwx. 1 microlinux microlinux 9 Sep 9 07:25 lien.txt -> texte.txt
-rw-rw-r--. 1 microlinux microlinux 66 Sep 9 07:29 texte.txt
$ rm texte.txt
$ ls -l
total 0
lrwxrwxrwx. 1 microlinux microlinux 5 Sep 9 07:47 depot -> /tmp/
lrwxrwxrwx. 1 microlinux microlinux 9 Sep 9 07:25 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 Sep 9 07:47 depot -> /tmp/
lrwxrwxrwx. 1 microlinux microlinux 9 Sep 9 07:25 lien.txt -> texte.txt
$ touch texte.txt
$ ls -l
total 0
lrwxrwxrwx. 1 microlinux microlinux 5 Sep 9 07:47 depot -> /tmp/
lrwxrwxrwx. 1 microlinux microlinux 9 Sep 9 07:25 lien.txt -> texte.txt
-rw-rw-r--. 1 microlinux microlinux 0 Sep 9 08:05 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 0 lrwxrwxrwx. 1 microlinux microlinux 5 Sep 9 07:47 depot -> /tmp/ lrwxrwxrwx. 1 microlinux microlinux 9 Sep 9 07:25 lien.txt -> texte.txt -rw-rw-r--. 1 microlinux microlinux 0 Sep 9 08:05 texte.txt $ rm lien.txt $ ls -l total 0 lrwxrwxrwx. 1 microlinux microlinux 5 Sep 9 07:47 depot -> /tmp/ -rw-rw-r--. 1 microlinux microlinux 0 Sep 9 08:05 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 0 lrwxrwxrwx. 1 microlinux microlinux 5 Sep 9 07:47 depot -> /tmp/ -rw-rw-r--. 1 microlinux microlinux 0 Sep 9 08:05 texte.txt $ rm depot $ ls -ld /tmp/ drwxrwxrwt. 9 root root 135 Sep 10 08:57 /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.
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 0 lrwxrwxrwx. 1 microlinux microlinux 5 Sep 10 09:00 depot -> /tmp/ -rw-rw-r--. 1 microlinux microlinux 0 Sep 9 08:05 texte.txt $ rm depot/ rm: cannot remove 'depot/': Is a directory $ rmdir depot/ rmdir: failed to remove 'depot/': Not a directory
Les liens physiques
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 $ ls -l total 8 -rw-rw-r--. 2 microlinux microlinux 49 Sep 10 09:06 lien.txt -rw-rw-r--. 2 microlinux microlinux 49 Sep 10 09:06 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).
- 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 cœur 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 Sep 10 09:06 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.
Lire la suite : Gérer les processus
La rédaction de cette documentation demande du temps et des quantités significatives de café espresso. Vous appréciez ce blog ? Offrez un café au rédacteur en cliquant sur la tasse.
0 commentaire