Question Quelle est la différence entre un lien symbolique et un lien physique?


Récemment, on m'a posé cette question lors d'un entretien d'embauche. J'étais honnête et j'ai dit que je savais comment un lien symbolique se comporte et comment en créer un, mais je ne comprends pas l'utilisation d'un lien physique et comment il diffère d'un lien symbolique.


634
2017-10-09 04:05


origine


Réponses:


Sous les fichiers du système de fichiers sont représentés par inodes (ou est-ce que plusieurs inodes ne sont pas sûrs)

Un fichier dans le système de fichiers est essentiellement un lien vers un inode.
Un lien dur crée alors simplement un autre fichier avec un lien vers le même inode sous-jacent.

Lorsque vous supprimez un fichier, il supprime un lien vers l'inode sous-jacent. L'inode est uniquement supprimé (ou supprimé / écrasable) lorsque tous les liens vers l'inode ont été supprimés.

Un lien symbolique est un lien vers un autre nom dans le système de fichiers.

Une fois qu'un lien dur a été fait, le lien est à l'inode. supprimer le changement de nom ou déplacer le fichier d'origine n'affectera pas le lien physique car il est lié à l'inode sous-jacent. Toutes les modifications apportées aux données sur l'inode sont reflétées dans tous les fichiers faisant référence à cet inode.

Remarque: Les liens physiques ne sont valides que dans le même système de fichiers. Les liens symboliques peuvent s'étendre sur des systèmes de fichiers car ils sont simplement le nom d'un autre fichier.


665
2017-10-09 04:07



Une bonne intuition qui pourrait vous aider, en utilisant n'importe quelle console Linux (ish).

Créez deux fichiers:

$ touch blah1; touch blah2

Entrez des données en eux:

$ echo "Cat" > blah1
$ echo "Dog" > blah2

(En fait, j'aurais pu utiliser echo en premier lieu, car il crée les fichiers s'ils n'existent pas ... mais peu importe.)

Et comme prévu:

$cat blah1; cat blah2
Cat
Dog

Créons des liens durs et doux:

$ ln blah1 blah1-hard
$ ln -s blah2 blah2-soft

Voyons voir ce qui vient de se passer:

$ ls -l

blah1
blah1-hard
blah2
blah2-soft -> blah2

Changer le nom de blah1 n'a pas d'importance:

$ mv blah1 blah1-new
$ cat blah1-hard
Cat

blah1-points durs à l'inode, le contenu du fichier - qui n'a pas été changé.

$ mv blah2 blah2-new
$ ls blah2-soft
blah2-soft
$ cat blah2-soft  
cat: blah2-soft: No such file or directory

Le contenu du fichier n'a pas pu être trouvé car le lien symbolique pointe vers le nom, qui a été modifié et non vers le contenu. De même, si blah1 est supprimé, blah1-hard conserve toujours le contenu; si blah2 est supprimé, blah2-soft est juste un lien vers un fichier inexistant.


378
2017-10-07 13:54



Comme le dit le dicton, une image vaut mille mots. Voici comment je le visualise:

enter image description here

Voici comment nous arrivons à cette image:

  1. Créer un nom myfile.txt dans le système de fichiers qui pointe vers un nouvel inode (qui contient les métadonnées du fichier et pointe vers les blocs de données contenant son contenu, c'est-à-dire le texte "Hello, World!"

    $ echo 'Hello, World!' > myfile.txt
    
  2. Créer un lien dur my-hard-link au fichier myfile.txt, ce qui signifie "créer un fichier qui doit pointer vers le même inode que myfile.txt pointe vers":

    $ ln myfile.txt my-hard-link
    
  3. Créer un lien souple my-soft-link au fichier myfile.txt, ce qui signifie "créer un fichier qui doit pointer vers le fichier myfile.txt":

    $ ln -s myfile.txt my-soft-link
    

Regardez ce qui va arriver maintenant si myfile.txt est supprimé (ou déplacé): my-hard-link pointe toujours vers le même contenu, et n'est donc pas affecté, alors que my-soft-link maintenant pointe vers rien. D'autres réponses discutent les avantages / inconvénients de chacun.


332
2018-04-22 01:45



Les liens physiques sont utiles lorsque le fichier original est déplacé. Par exemple, déplacer un fichier de / bin vers / usr / bin ou vers / usr / local / bin. Tout lien symbolique vers le fichier dans / bin serait cassé par ceci, mais un lien physique, étant un lien directement vers l'inode pour le fichier, ne s'en soucierait pas.

Les liens durs peuvent prendre moins d'espace disque car ils n'acceptent qu'une entrée de répertoire, tandis qu'un lien symbolique a besoin de son propre inode pour stocker le nom vers lequel il pointe.

Les liens matériels prennent également moins de temps à résoudre - les liens symboliques peuvent pointer vers d'autres liens symboliques situés dans des répertoires à liens symboliques. Et certains d'entre eux pourraient être sur NFS ou d'autres systèmes de fichiers à latence élevée, ce qui pourrait entraîner une résolution du trafic réseau. Les liens durs, toujours sur le même système de fichiers, sont toujours résolus en une seule recherche et n'impliquent jamais de latence réseau (si c'est un lien physique sur un système de fichiers NFS, le serveur NFS ferait la résolution, et serait invisible le système client). Parfois c'est important. Pas pour moi, mais je peux imaginer des systèmes performants où cela pourrait être important.

Je pense aussi que des choses comme mmap (2) et même open (2) utilisent la même fonctionnalité que les hardlinks pour garder l'inode d'un fichier actif de sorte que même si le fichier est dissocié, l'inode reste pour permettre l'accès continu au processus, et seulement une fois le processus fermé, le fichier disparaît vraiment. Cela permet des fichiers temporaires beaucoup plus sûrs (si vous pouvez obtenir l'ouverture et la dissociation atomique, ce qui peut être une API POSIX pour laquelle je ne me souviens pas, alors vous avez vraiment un fichier temporaire sécurisé) où vous pouvez lire / écrire vos données sans que personne ne puisse y accéder. Eh bien, c'était vrai avant / proc a donné à tout le monde la possibilité de regarder vos descripteurs de fichiers, mais c'est une autre histoire.

En parlant de cela, récupérer un fichier qui est ouvert dans le processus A, mais non lié sur le système de fichiers, utilise des liens physiques pour recréer les liens inodes afin que le fichier ne disparaisse pas quand le processus qui l'ouvre le ferme ou s'en va.


63
2017-10-09 05:22



Un moyen simple de voir la différence entre un lien physique et un lien symbolique est un exemple simple. Un lien direct vers un fichier pointe vers l'endroit où le fichier est stocké ou l'inode de ce fichier. Un lien symbolique pointera sur le fichier lui-même.

Donc, si nous avons un fichier appelé "a" et créez un lien "b" et un lien symbolique "c" qui se réfèrent tous au fichier "a":

echo "111" > a
ln a b
ln -s a c

La sortie de "a", "b" et "c" sera:

cat a --> 111
cat b --> 111
cat c --> 111

Maintenant, supprimons le fichier "a" et voyons ce qui arrive à la sortie de "a", "b" et "c":

rm a
cat a --> No such file or directory
cat b --> 111
cat c --> No such file or directory

Alors, qu'est-ce-qu'il s'est passé?

Comme le fichier "c" pointe lui-même vers le fichier "a", si le fichier "a" est supprimé, le fichier "c" n'aura aucun point à pointer, en fait il est également supprimé.

Cependant, le fichier "b" pointe vers l'emplacement de stockage, ou l'inode, du fichier "a". Donc, si le fichier "a" est supprimé, il ne pointera plus vers l'inode, mais comme le fichier "b" le fait, l'inode continuera à stocker tout contenu appartenant à "a" jusqu'à ce que plus de liens durs pointent dessus.


32
2017-12-08 20:09



Lien souple:

doux ou symbolique est plus d'un raccourci vers le fichier d'origine .... si vous supprimez l'original, le raccourci échoue et si vous supprimez seulement le raccourci, rien ne se passe à l'original.

Syntaxe du lien souple: ln -s Pathof_Target_file link

Sortie:  link -> ./Target_file

Preuve:  readlink linkAussi dans ls -l link sortie, vous verrez la première lettre lrwxrwxrwx comme l ce qui indique que le fichier est un lien logiciel.

Supprimer le lien:  unlink link 

Remarque: Si vous le souhaitez, votre softlink peut fonctionner même après l'avoir déplacé ailleurs dans le répertoire actuel. Assurez-vous de donner un chemin absolu et non un chemin relatif lors de la création d'un lien logiciel. c'est-à-dire (à partir de / root / user / Target_file et non ./Target_file)

Lien dur:

Le lien dur est plus une copie miroir ou plusieurs chemins vers le même fichier. Faire quelque chose à file1 et il apparaît dans le fichier 2. La suppression d'un reste toujours l'autre ok.

L'inode (ou le fichier) n'est supprimé que lorsque tous les liens (durs) ou tous les chemins vers l'inode (même fichier) ont été supprimés.

Une fois qu'un lien dur a été établi, le lien contient l'inode du fichier original. Supprimer le changement de nom ou le déplacement du fichier d'origine n'affectera pas le lien physique car il est lié à l'inode sous-jacent. Toutes les modifications apportées aux données sur l'inode sont reflétées dans tous les fichiers faisant référence à cet inode.

La syntaxe Hard Link: ln Target_file link

Sortie: Un fichier avec un lien de nom sera créé avec le même numéro d'inode que celui de Targetfile.

Preuve:  ls -i link Target_file  (vérifiez leurs inodes)

Supprimer le lien:  rm -f link (Supprimer le lien comme un fichier normal)

RemarqueLes liens symboliques peuvent s'étendre sur des systèmes de fichiers car ils sont simplement le nom d'un autre fichier. Alors que les liens physiques ne sont valides que dans le même système de fichiers.

Les liens symboliques ont certaines fonctionnalités dont les liens sont absents:

  • Lien pointant vers le contenu du fichier. tandis que le lien souple pointe vers nom de fichier.
  • tandis que la taille du lien dur est la taille du contenu tandis que le lien souple est avoir la taille du nom de fichier.
  • Les liens durs partagent le même inode. Les liens mous ne le font pas.
  • Les liens physiques ne peuvent pas traverser les systèmes de fichiers. Les liens mous font.
  • vous savez immédiatement où un lien symbolique pointe vers dur avec liens, vous devez explorer l'ensemble du système de fichiers pour trouver des fichiers partage le même inode.
  • les liens physiques ne peuvent pas pointer vers des répertoires.

Raison pour laquelle les liens physiques ne peuvent pas traverser les systèmes de fichiers ou les partitions:

Sur un disque dur, il y a beaucoup de secteurs.

Dites qu'un fichier commence à inode (secteur) 4001 et se termine à 5000. Le fichier est "/export/home/john/mail.doc"

Alors: 1. Un lien vers "mail.doc" qui s'appelle "hardLinkToMail" contient la valeur: "4001". 2. Un lien logiciel vers "mail.doc" nommé "softLinkToMail" contient la valeur: "/export/home/john/mail.doc".

Dans 1) le lien dur ne peut pointer que vers le même disque. Il ne peut pas pointer vers un autre lecteur. Tous les lecteurs ont un inode de valeur "4001", comment le lien dur peut-il distinguer tous les disques? Quel est le "4001" du lecteur?

En 2) le lien mou contient une chaîne. La chaîne peut pointer vers un autre système de fichiers sur un autre lecteur, car le chemin complet est spécifié.


30
2018-05-02 06:55



Les liens symboliques sont liés à un nom de chemin. Cela peut être n'importe où dans l'arborescence d'un système, et n'a même pas besoin d'exister lorsque le lien est créé. Le chemin cible peut être relatif ou absolu.

Les liens durs sont des pointeurs supplémentaires vers un inode, ce qui signifie qu'ils ne peuvent exister que sur le même volume que la cible. Les liens physiques supplémentaires vers un fichier sont indiscernables du nom "original" utilisé pour référencer un fichier.


26
2017-10-09 04:09



Je voudrais vous diriger vers Wikipédia:

Quelques points:

  • Les liens symboliques, contrairement aux liens physiques, peuvent traverser les systèmes de fichiers (la plupart du temps).
  • Les liens symboliques peuvent pointer vers des répertoires.
  • Les liens physiques pointent vers un fichier et vous permettent de faire référence au même fichier avec plus d'un nom.
  • Tant qu'il y a au moins un lien, les données sont toujours disponibles.

18
2017-10-09 04:11