Existe-t-il un inconvénient à la suppression de tous les liens symboliques brisés dans un système?

46

J'étais en train d'exécuter un script qui parcourait tous les fichiers de mon système Linux et créait des métadonnées à leur sujet. Une erreur s'est produite lorsqu'elle a heurté un lien symbolique brisé.

Je suis novice en * nix, mais je comprends l'idée principale de la liaison de fichiers et de la façon dont les liens rompus sont créés. Pour autant que je sache, ils sont comme l'équivalent de déchets dans la rue. Les éléments qu'un programme que je supprimais n'étaient pas assez intelligents pour indiquer au gestionnaire de paquets qu'il existait et y appartenaient, ou quelque chose qui a été laissé pour compte lors d'une mise à niveau. Au début, j'ai commencé à peaufiner le script que je courais pour les ignorer, puis je me suis dit: "On pourrait toujours les supprimer pendant qu'on est ici ..."

J'utilise Ubuntu 14.04 (Trusty Tahr). Je ne vois aucune raison de ne pas le faire, mais avant de poursuivre et d’examiner cette question dans mon système de développement, n’existe-t-il aucune raison pour que ce soit réellement une idée terrible? Les liens symboliques brisés servent-ils à quelque chose dont je ne suis pas au courant?

blanket_cat
la source
7
Oui: voir réponse cochée ci-dessous. Mais plus important encore, ceci n’est pas une solution à votre problème: le script doit fonctionner correctement, pas seulement un système assaini. Un système pourrait être assaini au bout d’une demi-seconde entre l’assainissement et la 2e moitié du script en cours. De plus, cela violait le principe de responsabilité unique et la philosophie Unix: «bien faire une chose».
ctrl-alt-delor

Réponses:

68

Les liens symboliques brisés sont multiples:

  • Un lien a été créé vers une cible qui n'existe plus.
    Résolution: supprimez le lien symbolique brisé.
  • Un lien a été créé pour une cible qui a été déplacée. Ou c'est un lien relatif qui a été déplacé par rapport à sa cible. (Cela ne veut pas dire que les liens symboliques relatifs sont une mauvaise idée - bien au contraire: les liens symboliques absolus sont plus enclins à devenir obsolètes car leur cible a été déplacée.)
    Résolution: recherchez la cible voulue et corrigez le lien.
  • Il y avait une erreur lors de la création du lien.
    Résolution: recherchez la cible et corrigez le lien.
  • Le lien est dirigé vers un fichier qui se trouve sur un disque amovible, un système de fichiers réseau ou une autre zone de stockage non montée actuellement. Résolution: aucune, le lien n'est pas cassé tout le temps. Le lien fonctionnera lorsque la zone de stockage sera montée.
  • Le lien est dirigé vers un fichier qui n'existe que de temps en temps. Par exemple, le fichier est la sortie mise en cache d'un processus, qui est supprimée lorsque les informations deviennent obsolètes mais ne sont recréées que sur demande explicite. Ou le lien est une boîte de réception qui est supprimée lorsqu'elle est vide. Ou bien le lien est dirigé vers un fichier de périphérique présent uniquement lorsque le périphérique correspondant est connecté. Résolution: aucune, le lien n'est pas cassé tout le temps.
  • Le lien n'est valide que dans une hiérarchie de stockage différente. Par exemple, il est valide uniquement dans une prison chroot ou est exporté par un serveur NFS et valide uniquement sur le serveur ou sur certains de ses clients.
    Résolution: aucune, le lien n'est pas rompu partout.
  • Le lien est rompu pour vous, car vous ne disposez pas de l'autorisation nécessaire pour parcourir un répertoire afin d'atteindre la cible, mais il n'est pas rompu pour les utilisateurs disposant des privilèges appropriés.
    Résolution: aucune, le lien n'est pas rompu pour tout le monde.
  • Le lien est utilisé pour stocker des informations, comme dans l' exemple de verrouillage Firefox cité par vinc17 . Une des raisons de le faire est qu’il est plus facile de peupler un lien symbolique de manière atomique - il n’ya pas d’autre moyen, alors que remplir un fichier de façon atomique est plus complexe: vous devez créer le contenu du fichier sous un nom temporaire, puis le déplacer à sa place, puis gérer les fichiers temporaires périmés laissés par un crash. Une autre raison est que les liens symboliques sont généralement stockés directement dans leur inode sur certains systèmes de fichiers, ce qui rend leur lecture plus rapide que la lecture du contenu d'un fichier.
    Résolution: aucune. Dans ce cas, la suppression du lien serait préjudiciable.

Si vous pouvez déterminer qu'un lien symbolique tombe dans la première catégorie, alors bien sûr, supprimez-le. Sinon, abstiens-toi.

Un programme qui parcourt les répertoires de manière récursive et se soucie du contenu des fichiers doit généralement ignorer les liens symboliques brisés.

Gilles, arrête de faire le mal
la source
Les liens symboliques ne sont (généralement) pas contenus dans leur répertoire parent. Cependant, sur certains systèmes de fichiers, la cible du lien est stockée dans l'inode.
James Youngman
Très bonne liste. J'ai un tas de liens qui appartiennent aux types 4 et 6. Ils pointent dans un système de fichiers que je monte avec SSHFS. Lorsque le système de fichiers n'est pas monté, ils sont de type 4; lorsque le système de fichiers est monté, je suis le seul à pouvoir y accéder. Ils sont donc de type 6 pour tout le monde (même racine).
Barmar
Une autre raison possible pour un lien symbolique rompu: un lien symbolique vers un fichier réel qui existe seulement de temps en temps. Par exemple, dans un flux de travail avec des chemins profonds, vous pouvez avoir un lien symbolique vers un fichier de travail (par souci de commodité) qui est supprimé une fois le flux de travail terminé, mais sera recréé lors de la prochaine utilisation de ce flux de travail. / dev / modem est un peu comme ça parce que le fichier de périphérique sur lequel il pointe n'existe que lorsque le périphérique physique est connecté.
Joe
réponse assez complète!
njzk2
1
@ MichaelDurrant Euh? Le fait est que l'inconvénient (ou son absence) dépend de la façon dont le lien symbolique brisé a été créé.
Gilles, arrête de faire le mal '12
19

Ne supprimez pas aveuglément tous les liens symboliques qui pendent. Ils peuvent n’exister que pour transporter certaines informations et peuvent être plus sûrs que les fichiers normaux, car la création d’un lien symbolique est atomique.

Par exemple, Firefox crée un fichier de verrouillage "lock" qui est un lien symbolique dont la valeur a la forme "IP_address: + PID".

vinc17
la source
1
Ainsi, un programme peut peupler dynamiquement un fichier vide pour lequel l'un de ces liens symboliques est un lien brisé, alors que le programme n'est pas en cours d'exécution ? Ou peut-être juste une information?
blanket_cat
1
@knotech Le but de certains liens symboliques (pas nécessairement associés à un programme en cours d'exécution) peut être simplement d'exister. Leur valeur n'a pas de sens ou transmet des informations particulières; dans les deux cas, en général, ils ne signalent rien. Il n'y a pas de fichier vide, juste un lien symbolique. Notez également, à titre d'exemple, le cas des versions de gcc, qui créent des liens symboliques "stamp-bits" pointant vers eux-mêmes: gcc.gnu.org/ml/libstdc++/2011-02/msg00014.html
vinc17
6

Les serveurs Web fnord et Gatling utilisent tous deux le système de fichiers Unix comme base de données de configuration (par exemple, Microsoft IIS, qui utilise le registre Windows, ou Apache, qui utilise un fichier de configuration complexe).

Par exemple, les hôtes virtuels ne sont que des répertoires et la création d'un nouvel hôte virtuel est aussi simple que

mkdir www.example.com:80

Configurer quels fichiers servir?

chmod o+r file_that_should_be_served
chmod o-r secret_passwords

Configurer quels fichiers exécuter en tant que CGI et lesquels servir?

chmod a-x plain_file.html
chmod a+x cgi_script.html

Et enfin (et en rapport avec cette question): configurer une redirection?

ln -s 'http://www.google.com/?q=awesome+query+site:www.example.com' search.html

Vous aurez maintenant un lien symbolique appelé search.htmlqui ne pointe nulle part, mais il est crucial pour le fonctionnement de votre site.

Jörg W Mittag
la source
0

Un lien symbolique peut pointer vers un emplacement encore très lourd simplement pour forcer la création à un emplacement ou un nom de système de fichiers spécifique.

Donc non, ne les enlevez pas aveuglément.

Nils
la source
0

Un inconvénient majeur de la suppression des liens symboliques périmés est que vous perdez la référence à l'endroit où ils indiquaient ce qui peut être très utile!

Supposons que j'ai un lien symbolique vers un fichier appelé " send_to" qui pointe vers /Users/myname/tmpet suppose que cela /Users/myname/tmpn'existe pas.

Avec le lien symbolique , je sais où le fichier a été destiné à être. Par exemple, dans ce cas, je peux voir qu’il s’agit d’un répertoire temporaire et si j’ai besoin de le "réparer", je devrais considérer un répertoire temporaire comme destination.

De même, un lien " my_config" pointant sur " /etc/conf_filequi va mal" parce que le conf_filenom renommé confirmation_file est toujours une information utile. Si vous êtes allé dans le /etcrépertoire et que vous avez lsvu le fichier conf_filemanquant mais confirmation_fileque vous y étiez, vous auriez peut-être assez d’informations pour réparer le lien.

Michael Durrant
la source
-2

Citant The Linux Command Line (meilleur livre de tous les temps pour les débutants Linux, et vous pouvez le télécharger gratuitement ici ):

Imaginez ce scénario: un programme nécessite l'utilisation d'une ressource partagée quelconque dans un fichier nommé "foo", mais "foo" comporte de fréquentes modifications de version. Il serait bon d'inclure le numéro de version dans le nom du fichier pour que l'administrateur ou toute autre partie intéressée puisse voir quelle version de «foo» est installée. Cela pose un problème. Si nous changeons le nom de la ressource partagée, nous devons localiser tous les programmes susceptibles de l’utiliser et le changer pour rechercher un nouveau nom de ressource à chaque fois qu’une nouvelle version de la ressource est installée. Cela ne semble pas amusant du tout.

Voici où des liens symboliques sauvent la journée. Supposons que nous installions la version 2.6 de “foo”, qui porte le nom de fichier “foo-2.6”, puis créons un lien symbolique simplement appelé “foo” qui pointe vers “foo-2.6”. Cela signifie que lorsqu'un programme ouvre le fichier “ foo ”, il ouvre en fait le fichier“ foo-2.6 ”. Maintenant tout le monde est heureux. Les programmes qui reposent sur «foo» peuvent le trouver et nous pouvons toujours voir quelle version actuelle est installée. Lorsqu'il est temps de passer à «foo-2.7», nous ajoutons simplement le fichier à notre système, supprimons le lien symbolique «foo» et en créons un nouveau qui pointe vers la nouvelle version. Cela résout non seulement le problème de la mise à niveau, mais nous permet également de conserver les deux versions sur notre machine. Imaginez que “foo-2.7” ait un bug (putain ces développeurs!) Et que nous devions revenir à l'ancienne version. Encore,

Donc, non, je ne supprimerais pas les liens symboliques, ce qui serait certainement un casse-tête et vous risqueriez de détériorer gravement votre système.

gacanepa
la source
6
Le PO ne préconisait pas la suppression des liens symboliques tout court , mais uniquement des liens symboliques rompus , c'est-à-dire des liens symboliques qui ne pointent vers aucun fichier existant.
LSerni