Les liens symboliques sous Linux représentent une fonctionnalité très utile, mais il arrive qu’ils deviennent invalides, pointant vers des cibles inexistantes. Cet article explique comment détecter ces liens symboliques brisés, les analyser et, si nécessaire, les éliminer de votre système.
Comprendre les liens symboliques
Les liens symboliques, également appelés « liens doux » ou « symlinks », sont une sorte de raccourci qui peut pointer vers des fichiers ou des dossiers. Un lien symbolique apparaît comme un fichier ou un dossier standard dans l’explorateur de fichiers. Il figure également dans les listes de fichiers affichées dans le terminal. La cible d’un lien symbolique peut se trouver n’importe où au sein de l’arborescence du système de fichiers.
Imaginons, par exemple, un lien symbolique nommé « mon-lien » dans votre répertoire personnel, qui pointe vers un fichier appelé « document.txt », situé ailleurs dans le système. Toutes les opérations que vous effectuez sur le lien symbolique sont automatiquement appliquées au fichier cible. Ainsi, si vous utilisez « cat » ou « less » sur le lien symbolique, vous visualiserez le contenu de « document.txt ».
Une installation Linux classique comporte de nombreux liens symboliques, créés par le système ou lors de l’installation d’applications. Les processus d’installation utilisent souvent des liens symboliques pour pointer vers les exécutables. Lorsqu’un logiciel est mis à jour, l’exécutable est remplacé par sa nouvelle version, mais tous les liens symboliques continuent de fonctionner, à condition que le nom du nouvel exécutable soit identique à l’ancien.
Pour identifier quelques liens symboliques, on peut utiliser la commande « ls » dans le répertoire racine. Certains éléments sont affichés avec une couleur distincte (dans notre environnement de test Ubuntu 20.10, ils sont en bleu clair).
Nous saisissons la commande suivante:
ls /
Pour une analyse plus détaillée, utilisons l’option « -l » (liste longue). La commande ci-dessous permet de visualiser les entrées « lib » ainsi que l’entrée « bin » :
ls -l /lib* /bin
Un « l » au début de chaque ligne indique que l’élément est un lien symbolique. Le texte suivant « -> » précise la cible du lien. Dans notre cas, ce sont tous des répertoires.
Les permissions affichées (lecture, écriture, exécution) ne sont que des valeurs par défaut et n’indiquent pas les réelles permissions sur l’objet cible. Ce sont les permissions sur le fichier ou le répertoire pointé par le lien symbolique qui prévalent et sont prises en compte par le système.
Liens symboliques cassés
Un lien symbolique est dit « cassé » ou « invalide » lorsque la cible qu’il désigne a été supprimée ou déplacée. Une désinstallation logicielle mal exécutée peut laisser des liens symboliques brisés.
Si un fichier est supprimé manuellement sans que l’utilisateur sache qu’il est ciblé par un lien symbolique, ce dernier ne fonctionnera plus. Il devient alors l’équivalent d’un panneau indicateur pointant vers une ville détruite.
Pour illustrer cela, créons un lien symbolique appelé « bonjour » pointant vers un programme dans un sous-répertoire. En exécutant « ls -l », on peut voir vers où il pointe:
ls -l
Si l’on exécute le lien symbolique, cela exécute le programme cible:
./hello
On peut vérifier que l’on obtient le même résultat en exécutant directement le programme:
../bin/htg
Supprimons maintenant le programme cible:
rm ../bin/htg
Si on regarde à nouveau le lien symbolique, il est maintenant affiché en rouge, indiquant que Linux détecte qu’il est invalide. De plus, la cible initialement visée est affichée, ce qui permet de remplacer le fichier, de recompiler le programme ou de prendre les mesures nécessaires pour réparer le lien.
Il faut noter que l’erreur renvoyée lorsque l’on tente d’exécuter le lien symbolique fait référence au nom du lien lui-même, et non au nom du programme cible.
Nous saisissons la commande suivante:
./hello
Localiser les liens symboliques brisés
La commande « find » possède une option « xtype » (type étendu) qui simplifie la recherche de liens symboliques cassés. Nous utiliserons l’option « l » avec « xtype » pour spécifier la recherche de liens. L’utilisation de « find » avec « xtype l » sans autre option de type force « xtype » à ne renvoyer que les liens invalides:
find . -xtype l
L’exécution de cette commande dans notre répertoire personnel de test a trouvé plusieurs liens symboliques brisés. Par défaut, la recherche est récursive et parcourt tous les sous-répertoires.
Le lien symbolique « bonjour » que nous avons volontairement cassé est bien listé, comme prévu. Un autre lien symbolique est relatif au navigateur Firefox, et les autres sont associés à des snaps.
En redirigeant la sortie de la commande vers « wc » avec l’option « -l » (lignes), nous pouvons compter le nombre de liens symboliques invalides.
Nous saisissons la commande suivante:
find . -xtype l | wc -l
Nous constatons que 24 liens symboliques ne pointent vers aucune cible existante.
Analyse et suppression des liens invalides
Avant de supprimer tous les liens symboliques brisés, il est important d’examiner les résultats de la commande « find » et de vérifier qu’il n’y ait pas de raison valable pour un de ces liens cassés.
Dans certains cas, le lien symbolique lui-même peut être la cause du problème, plutôt que le fichier cible. Un lien symbolique mal créé peut ne pointer vers rien, alors que la véritable cible existe. La recréation du lien symbolique est alors la solution.
Un lien symbolique qui semble cassé peut également être utilisé comme un indicateur (de verrouillage de fichier par exemple). Firefox utilise parfois cette méthode. C’est le cas du premier lien symbolique de notre liste. Comme Firefox n’est pas utilisé sur notre système de test, on peut le supprimer en toute sécurité.
Il est également possible que la cible d’un lien symbolique ne soit présente que périodiquement, et que ce comportement soit prévu. C’est le cas par exemple lorsque la cible est copiée à partir d’une autre machine ou du cloud, utilisée temporairement, puis supprimée.
Enfin, un lien symbolique invalide peut être le signe d’une installation logicielle qui a échoué. Dans ce cas, il faudra plutôt corriger l’installation ou la répéter.
Une fois que vous avez corrigé les liens symboliques que vous souhaitez conserver, il faut relancer la commande de recherche pour vérifier que les liens corrigés n’apparaissent plus dans les résultats.
Par précaution, il est préférable de limiter les opérations de suppression de liens symboliques à vos propres répertoires. Il est particulièrement important d’être très prudent lors de l’exécution de telles commandes en tant que « root » ou sur des répertoires système.
Suppression des liens symboliques invalides
L’option « -exec » permet d’exécuter des commandes sur les résultats de la recherche. Ici, nous allons utiliser « rm » pour supprimer chaque lien symbolique cassé. La chaîne « {} » est remplacée par le nom de chaque lien symbolique invalide trouvé par « find ».
Le point-virgule (;) termine la liste des commandes que « -exec » doit exécuter. Il faut le « protéger » à l’aide d’une barre oblique inverse (\), pour qu’il soit interprété comme une partie de la commande « find » et non comme une instruction Bash.
Nous saisissons la commande suivante:
find . -xtype l -exec rm {} \;
Après exécution, l’invite de commande réapparaît sans message particulier. Pour vérifier que les liens ont bien été supprimés, relançons la recherche:
find . -xtype l
L’absence de résultat indique que tous les liens symboliques invalides ont été supprimés.
Vérification préalable
Avant de supprimer des liens symboliques, il est primordial de les examiner attentivement. Si vous avez un doute, il est plus prudent d’éviter la suppression. Il est possible de cibler la suppression à des répertoires spécifiques.
Par exemple, dans l’exemple précédent, on aurait pu exécuter la commande de suppression dans le répertoire « .snap » puis supprimer manuellement le lien symbolique « hello ». Cela aurait permis de laisser intact le lien symbolique de verrouillage de Firefox.