11 votes

Que se passe-t-il lorsque le fichier original est remplacé par un lien symbolique?

J'ai mis à jour le logiciel dans /opt/minergate-cli. J'ai renommé le répertoire minergate-cli en minergate-old avec une commande mv, puis installé une version plus récente du logiciel en donnant le même nom de répertoire.

En supposant que j'avais un ancien programme et maintenant un nouveau programme portant le même nom, à savoir "minergate", que se passe-t-il avec les liens symboliques pointant vers le programme minergate ?

Sont-ils pointés vers le programme original se trouvant dans minergate-old, ou le lien a-t-il été déplacé vers le nouveau programme minergate.cli ?

12voto

Sergiy Kolodyazhnyy Points 97292

Résumé

  • Les liens symboliques ne suivent pas les fichiers vers lesquels ils pointent. Si vous avez link_file -> original_file et que vous faites mv original_file original_file.backup, le link_file sera cassé

  • Si vous recréez le nom de fichier d'origine (ce que l'OP a fait), le lien symbolique fonctionnera à nouveau

  • Si vous devez faire link_file -> original_file.backup, vous devez supprimer link_file et le recréer, en pointant vers le nouveau nom de fichier

Réponse

Que se passe-t-il avec un lien symbolique si nous renommons un fichier ?

Une fois que vous déplacez un fichier vers lequel le lien symbolique pointe, le lien symbolique est cassé, aussi appelé lien symbolique suspendu. Vous devez le supprimer et en créer un nouveau si vous souhaitez pointer vers le nouveau nom de fichier.

Par exemple, créons un lien symbolic vers un fichier :

$ ln -s testfile.txt mysymlink
$ ls -l mysymlink
lrwxrwxrwx 1 adm adm 12 Dec  8 13:28 mysymlink -> testfile.txt

Maintenant, renommons le fichier. Vous verrez que le lien symbolique pointe toujours vers le chemin d'accès qui n'existe plus (ce qui est important, le fichier existe, le chemin d'accès - n'existe pas) :

$ mv testfile.txt testfile.txt.bak
$ ls -l mysymlink
lrwxrwxrwx 1 xie xie 12 Dec  8 13:28 mysymlink -> testfile.txt
$ cat mysymlink
cat: mysymlink: Aucun fichier ou dossier de ce type

Comment réparer un lien symbolique cassé ?

Si vous pouvez renommer le fichier avec le chemin d'accès d'origine, le lien symbolique recommencera à fonctionner.

$ mv testfile.txt.bak testfile.txt $ cat mysymlink un deux trois

Si le renommage n'est pas une option et que vous ne pouvez pas renommer le fichier, créez un nouveau lien symbolique et supprimez l'ancien.

# casser le lien symbolique
$ mv  testfile.txt testfile.txt.bak
$ cat mysymlink
cat: mysymlink: Aucun fichier ou dossier de ce type
# supprimer l'ancien lien symbolique
$ rm mysymlink
# créer un lien symbolique avec le même nom de fichier mais pointant vers un nouveau chemin d'accès
$ ln -s testfile.txt.bak mysymlink
$ cat mysymlink 
un deux trois

Question de l'OP: Le lien a-t-il été déplacé vers le nouveau programme minergate.cli ?

Si la cible du lien symbolique /opt/minergate-cli a été recréée lors de l'installation de la nouvelle version de l'application, le lien symbolique pointera vers le nouveau fichier. Si le nouveau fichier a un nom de fichier différent, alors le lien symbolique sera cassé. Les liens symboliques ne suivent pas le nom de fichier s'il a été déplacé, comme dans l'exemple de l'OP lorsqu'ils ont fait mv /opt/minergate-cli /opt/minergate.old, le lien symbolique continuera donc de pointer vers /opt/minergate-cli que ce fichier existe ou non.

Voir aussi

8voto

Todd Gamblin Points 101

Un lien symbolique ne fait que contenir le nom du fichier auquel il pointe.(astuce, faites ls -l lien_symbolique et notez sa taille de fichier). Si vous supprimez le fichier cible, mais créez ensuite un nouveau fichier avec le même nom, le lien symbolique continuera à fonctionner joyeusement, se référant au contenu du nouveau fichier :

$ echo "premier fichier" > fichier
$ ln -s fichier lien_symbolique
$ ls -l lien_symbolique
lrwxrwxrwx 1 jackman jackman 4 Oct 23 23:33 lien_symbolique -> fichier
# ...........................^=taille ...................^^^^ cible est de 4 caractères
$ cat lien_symbolique
premier fichier
$ mv fichier fichier.old
$ echo "c'est le deuxième" > fichier
$ cat lien_symbolique
c'est le deuxième

Vous pouvez penser à un lien "dur", qui se réfère à l'inode du fichier cible :

$ echo "première ligne" > fichier
$ ln fichier lien_dur
$ ls -li lien_dur fichier
1078415 -rw-r--r-- 2 jackman jackman 11 Oct 23 23:38 fichier
1078415 -rw-r--r-- 2 jackman jackman 11 Oct 23 23:38 lien_dur
$ cat lien_dur
première ligne
$ mv fichier fichier.old
$ echo "ceci est le nouveau contenu" > fichier
$ cat lien_dur
première ligne
$ ls -li lien_dur fichier fichier.old
1059446 -rw-r--r-- 1 jackman jackman 25 Oct 23 23:39 fichier
1078415 -rw-r--r-- 2 jackman jackman 11 Oct 23 23:38 fichier.old
1078415 -rw-r--r-- 2 jackman jackman 11 Oct 23 23:38 lien_dur

ici lien_dur est le même fichier que le fichier original fichier.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X