TerminalObjectif 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

InfoLa 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.

ImportantMé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.

InfoLe 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.

ImportantNotez 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

Laisser un commentaire

Emplacement de l’avatar

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *