Question

Récemment, on m'a posé cette question lors d'un entretien d'embauche. J'étais honnête et je savais comment se comportait un lien symbolique et comment en créer un, mais je ne comprenais pas l'utilisation d'un lien dur et comment il différait d'un lien symbolique.

Était-ce utile?

La solution

Sous le système de fichiers, les fichiers sont représentés par des 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 physique crée alors 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 n'est supprimé (ou supprimable / réinscriptible) que lorsque tous les liens vers l'inode ont été supprimés.

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

Une fois qu'un lien physique a été établi, le lien est vers l'inode. La suppression du changement de nom ou du déplacement du fichier d'origine n'affectera pas le lien physique, car il est lié à l'inode sous-jacent. Toute modification des données sur l’inode est reflétée dans tous les fichiers qui font référence à cet inode.

Remarque: les liens physiques ne sont valables que dans le même système de fichiers. Les liens symboliques peuvent s’étendre sur les systèmes de fichiers car il s’agit simplement du nom d’un autre fichier.

Autres conseils

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

Créez deux fichiers:

$ touch foo; touch bar

Entrez des données dans celles-ci:

$ echo "Cat" > foo
$ echo "Dog" > bar

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

Et comme prévu:

$cat foo; cat bar
Cat
Dog

Créons des liens physiques et durs:

$ ln foo foo-hard
$ ln -s bar bar-soft

Voyons ce qui vient de se passer:

$ ls -l

foo
foo-hard
bar
bar-soft -> bar

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

$ mv foo foo-new
$ cat foo-hard
Cat

foo-hard pointe sur l'inode, le contenu du fichier, qui n'a pas été modifié.

$ mv bar bar-new
$ ls bar-soft
bar-soft
$ cat bar-soft  
cat: bar-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 foo est supprimé, foo-hard en conserve le contenu; si la barre est supprimée, bar-soft est simplement un lien vers un fichier non existant.

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

entrer la description de l'image ici

Voici comment nous arrivons à cette image:

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

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

    $ ln myfile.txt my-hard-link
    
  3. Créez un lien symbolique mon-lien-souple vers le fichier monFichier.txt , ce qui signifie "créer un fichier devant pointer vers le fichier < code> monfichier.txt ":

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

Regardez ce qui va se passer maintenant si monfichier.txt est supprimé (ou déplacé): mon-lien-dur pointe toujours sur le même contenu et n'est donc pas affecté, alors que my-soft-link ne pointe désormais plus rien. D'autres réponses discutent des avantages / inconvénients de chacune.

Les liens physiques sont utiles lorsque le fichier d'origine est déplacé. Par exemple, déplacez 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 dur, étant un lien direct vers l'inode du fichier, s'en ficherait.

Les liens physiques peuvent prendre moins d’espace disque car ils ne prennent qu’une entrée de répertoire, alors qu’un lien symbolique a besoin de son propre inode pour stocker le nom auquel il pointe.

La résolution des liens durs prend également moins de temps - les liens symboliques peuvent pointer vers d'autres liens symboliques se trouvant dans des répertoires liés par 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 la résolution du trafic réseau. Les liens physiques, étant toujours sur le même système de fichiers, sont toujours résolus en une seule recherche et n'impliquent jamais de latence du réseau (s'il s'agit d'un lien physique sur un système de fichiers NFS, le serveur NFS ferait la résolution et il serait invisible de le faire. le système client). Parfois c'est important. Pas pour moi, mais je peux imaginer des systèmes hautes performances où cela pourrait être important.

Je pense aussi que des choses comme mmap (2) et même open (2) utilisent les mêmes fonctionnalités que les liens durs pour maintenir l’inode d’un fichier actif. Ainsi, même si le fichier est délié (2), l’inode reste pour permettre le traitement. accès continu, et le fichier ne disparaît vraiment que lorsque le processus est fermé. Cela permet de créer des fichiers temporaires beaucoup plus sûrs (si vous pouvez obtenir l'ouverture et la suppression des liens de manière atomique, ce qui peut donner lieu à une API POSIX pour que je ne me souvienne plus, alors vous avez vraiment un fichier temporaire sûr) où vous pouvez lire / écrire. vos données sans que personne ne puisse y accéder. C’était vrai avant que / proc donne à chacun la possibilité de consulter vos descripteurs de fichiers, mais c’est une autre histoire.

À ce propos, récupérer un fichier ouvert dans le processus A mais non lié au système de fichiers consiste à utiliser des liens physiques pour recréer les liens inode afin que le fichier ne disparaisse pas lorsque le processus qui l'a ouvert le ferme ou le ferme. s'en va.

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

Donc, si nous avons un fichier appelé "a" et créer un lien dur " 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

Supprimons maintenant le fichier " a " et voyez 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, que s'est-il passé?

Parce que le fichier " c " points pour déposer " a " lui-même, si le fichier "a" est supprimé, puis le fichier " c " n'aura rien à signaler, en fait, il est également supprimé.

Cependant, le fichier "b". pointe vers le lieu de stockage, ou l'inode, du fichier "a". Donc, si le fichier " un " est supprimé, il ne sera plus pointé sur l'inode, mais parce que le fichier "b" Dans ce cas, l’inode continuera à stocker tout le contenu appartenant à " un " jusqu'à ce qu'il n'y ait plus de liens durs qui pointent plus loin.

Lien symbolique :

soft ou symbolique est davantage un raccourci vers le fichier d'origine .... si vous supprimez l'original, le raccourci échouera et si vous ne supprimez que le raccourci, rien ne se passe pour l'original.

Syntaxe du lien symbolique : ln -s lien Pathof_Target_file

Résultat: link - > ./Target_file

Preuve: lien de lien de lecture De plus, dans la sortie ls -l link , vous verrez la première lettre de lrwxrwxrwx sous la forme l , ce qui indique que le fichier est un lien symbolique.

Suppression du lien: lien dissocié

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

Lien dur:

Le lien physique est plutôt une copie miroir ou plusieurs chemins d'accès au même fichier. Faites quelque chose à file1 et il apparaît dans le fichier 2. La suppression de l’un garde toujours l’autre en ordre.

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

Une fois qu'un lien physique a été créé, le lien contient l'inode du fichier d'origine. La suppression du changement de nom ou du déplacement du fichier d'origine n'affectera pas le lien physique car il est lié à l'inode sous-jacent. Toute modification des données sur l’inode est reflétée dans tous les fichiers qui font référence à cet inode.

Syntaxe du lien physique : ln Lien_fichier cible

Résultat: un fichier avec un lien de nom sera créé avec le même numéro d'inode que celui du fichier cible.

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

Suppression du lien: lien rm -f (supprimez le lien comme un fichier normal)

Remarque : les liens symboliques peuvent s'étendre aux systèmes de fichiers car ils représentent simplement le nom d'un autre fichier. Considérant que les liens physiques ne sont valables que dans le même système de fichiers.

Les liens symboliques ont certaines fonctionnalités. Il manque des liens physiques:

  • Le lien direct pointe vers le contenu du fichier. tandis que Soft link pointe vers le nom de fichier.
  • alors que la taille du lien physique est la taille du contenu alors que le lien symbolique est ayant la taille du nom de fichier.
  • Les liens durs partagent le même inode. Les liens symboliques ne le font pas.
  • Les liens physiques ne peuvent pas croiser les systèmes de fichiers. Les liens symboliques font.
  • vous savez immédiatement où un lien symbolique pointe vers tout en dur liens, vous devez explorer tout le système de fichiers pour trouver des fichiers partage le même inode.

    # find / -inum 517333

    /home/bobbin/sync.sh
    /root/synchro
    
  • les liens durs ne peuvent pas pointer vers des répertoires.

Les liens physiques ont deux limitations:

  • Les répertoires ne peuvent pas être liés durement. Linux ne permet pas de conserver la structure arborescente acyclique des répertoires.
  • Il est impossible de créer un lien physique entre systèmes de fichiers. Les deux fichiers doivent figurer sur le même système de fichiers, car différents systèmes de fichiers ont des tables inode indépendantes différentes (deux fichiers sur des systèmes de fichiers différents, mais avec le même numéro d'inode différent.)

Les liens symboliques renvoient à un nom de chemin. Cela peut être n'importe où dans l'arborescence de fichiers d'un système et ne doit même pas exister lors de la création du lien. Le chemin cible peut être relatif ou absolu.

Les liens physiques sont des pointeurs supplémentaires sur 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 ne peuvent pas être distingués du fichier "original". nom utilisé pour référencer un fichier.

Je vous renvoie à Wikipedia:

Quelques points:

  • Contrairement aux liens physiques, les liens symboliques peuvent traverser des 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 plusieurs noms.
  • Tant qu'il existe au moins un lien, les données sont toujours disponibles.

Les liens physiques sont très utiles pour les sauvegardes incrémentielles. Voir rsnapshot , par exemple. L'idée est de faire une copie en utilisant des liens physiques:

  • copier le numéro de sauvegarde n sur n + 1
  • copier la sauvegarde n - 1 sur n
  • ...
  • copie la sauvegarde 0 dans la sauvegarde 1
  • mettez à jour la sauvegarde 0 avec tous les fichiers modifiés.

La nouvelle sauvegarde n'occupera pas d'espace supplémentaire en dehors des modifications que vous avez apportées, car toutes les sauvegardes incrémentielles pointeront vers le même ensemble d'inodes pour les fichiers non modifiés.

J'ajoute à la question de Nick: à quel moment les liens physiques sont-ils utiles ou nécessaires? La seule application qui me vienne à l’esprit, dans laquelle les liens symboliques ne fonctionneraient pas, consiste à fournir une copie d’un fichier système dans un environnement chrooté.

 Lien dur contre lien symbolique

Lien dur contre lien virtuel peut être facilement expliqué par cette image.

Aussi:

  1. La performance en lecture des liens physiques est meilleure que celle des liens symboliques (micro-performance)
  2. Les liens symboliques peuvent être copiés, contrôlés par la version, etc. En d'autres termes, ils sont un fichier réel. À l’autre extrémité, un lien physique correspond à un niveau légèrement inférieur et vous constaterez que, par rapport aux liens symboliques, il existe moins d’outils permettant de travailler avec les liens physiques en tant que liens physiques et non en tant que fichiers normaux.

Ce que vous considérez comme un "fichier" ordinaire est en fait deux choses distinctes: Les données d'un fichier et une entrée de répertoire. Lorsque vous créez un lien physique pour un fichier, vous créez en réalité une deuxième entrée de répertoire qui fait référence aux mêmes données. Les deux entrées du répertoire ont exactement la même fonctionnalité. chacun peut être utilisé pour ouvrir le fichier pour le lire. Donc, vous n'avez pas vraiment "un fichier plus un lien physique", vous avez "des données de fichier avec deux entrées de répertoire". Ce que vous considérez comme supprimer un fichier supprime en réalité une entrée de répertoire. Lorsque la dernière entrée de répertoire pour les données est supprimée, les données elles-mêmes sont également supprimées. Pour les fichiers ordinaires ne comportant qu'une entrée de répertoire, la suppression de l'entrée de répertoire supprime les données comme toujours. (Pendant qu'un fichier est ouvert, le système d'exploitation crée un lien temporaire vers le fichier. Ainsi, même lorsque vous supprimez toutes les entrées du répertoire, les données restent, mais disparaissent dès que vous fermez le fichier).

Par exemple, créez un fichier A.txt, un lien physique B.txt et supprimez A.txt. Lorsque vous avez créé A.txt, des données ont été créées, ainsi qu'une entrée de répertoire A.txt. Lorsque vous avez créé le lien physique, une autre entrée de répertoire, B.txt, a été créée, pointant exactement sur les mêmes données. Lorsque vous supprimez A.txt, vous disposez toujours de toutes les données et d'une seule entrée de répertoire, B.txt, exactement comme si vous aviez créé un fichier B.txt.

Un lien symbolique est juste un fichier (presque) ordinaire, sauf qu'il ne contient pas de données, mais le chemin d'une autre entrée du répertoire. Si vous supprimez le fichier auquel le lien symbolique fait référence, celui-ci contiendra un chemin qui ne pointe plus vers une entrée de répertoire; elle est cassée. Si vous supprimez le lien symbolique, c'est comme si vous supprimiez tout autre fichier, le fichier vers lequel il pointe n'est pas affecté.

De MSDN ,

Lien symbolique

  

Un lien symbolique est un objet du système de fichiers qui pointe vers un autre objet du système de fichiers. L’objet pointé est appelé la cible.

     

Les liens symboliques sont transparents pour les utilisateurs. les liens apparaissent comme d'habitude   fichiers ou répertoires, et l'utilisateur ou l'application peuvent y donner suite   exactement de la même manière.

     

Les liens symboliques sont conçus pour faciliter la migration et l'application   compatibilité avec les systèmes d'exploitation UNIX. Microsoft a mis en place   ses liens symboliques fonctionnent comme des liens UNIX.

     

Les liens symboliques peuvent être des liens absolus ou relatifs. Absolu   les liens sont des liens qui spécifient chaque partie du nom du chemin d'accès; relatif   les liens sont déterminés par rapport à l'endroit où se trouvent les spécificateurs de lien relatif   un chemin spécifié

Exemple de lien symbolique absolu

X: "C:\alpha\beta\absLink\gamma\file"
Link: "absLink" maps to "\\machineB\share"
Modified Path: "\\machineB\share\gamma\file"

Un exemple de liens symboliques relatifs

X: C:\alpha\beta\link\gamma\file
Link: "link" maps to "..\..\theta"
Modified Path: "C:\alpha\beta\..\..\theta\gamma\file"
Final Path: "C:\theta\gamma\file"

Lien direct

  

Un lien dur est la représentation du système de fichiers d’un fichier par lequel   plusieurs chemins référencent un seul fichier dans le même volume .

Pour créer un lien solide dans des fenêtres, accédez à l'emplacement où le lien doit être créé et entrez cette commande:

mklink /H Link_name target_path

Notez que vous pouvez supprimer les liens physiques dans n’importe quel ordre, quel que soit leur ordre de création. De même, les liens physiques ne peuvent pas être créés lorsque

  • les références se trouvent dans différents lecteurs locaux
  • Les références
  • incluent le lecteur réseau. En d’autres termes, l’une des références est un lecteur réseau
  • le lien dur à créer est dans le même chemin que la cible

Jonction

NTFS prend en charge un autre type de lien appelé jonction. MSDN le définit comme suit:

  

Une jonction (également appelée lien symbolique) diffère d'un lien physique en ce que les objets de stockage qu'elle référence sont des répertoires distincts, et une jonction peut relier des répertoires situés sur différents volumes locaux sur le même ordinateur . . Sinon, les jonctions fonctionnent de manière identique aux liaisons en dur.

Les parties en gras de la section lien dur et de la section jonction indiquent la différence fondamentale entre les deux.

Commande permettant de créer une jonction dans Windows, accédez à l'emplacement où le lien doit être créé, puis entrez:

mklink /J link_name target_path

Simplement, lien dur: c’est simplement ajouter un nouveau nom à un fichier, c’est-à-dire qu’un fichier peut avoir plusieurs noms en même temps, tous les noms sont égaux les uns aux autres, aucun préféré, le lien dur n’est pas censé être copié tout le contenu du fichier et créer un nouveau fichier n’est pas cela, il suffit de créer un nom alternatif à connaître.

Lien symbolique (lien symbolique): est un pointeur de fichier sur un autre fichier. Si le lien symbolique pointe vers un fichier existant qui est supprimé ultérieurement, le lien symbolique continue de pointer vers le même nom de fichier, même si le nom ne se nomme plus. fichier.

Une entrée de répertoire est un lien vers une structure:

struct dentry{
    ino_t ino;
    char  name[256];
}

l'ino est le numéro de l'inode, le nom est le nom du fichier. La structure de l'inode est peut-être semblable à & # 65306;

.
struct inode{
      link_t nlink; 
      ...
}

par exemple, vous créez un fichier / 1, l’entrée du répertoire peut ressembler à:

struct dentry{
     ino_t ino; /* such as 15 */
     char  name[256]; /* "1" */
} 

la structure d'inode peut-être comme:

   struct inode{ /* inode number 15 */
         link_t nlink; /* nlink = 1 */
         ...
    }

alors vous créez un lien dur (peut être / 100), l'entrée de répertoire peut ressembler à:

  struct dentry{
     ino_t ino; /* 15 */
     char  name[256]; /* 100 */
  }

la structure d'inode peut-être comme:

   struct inode{ /* inode numebr 15 */
         link_t nlink; /* nlink = 2 */
         ...
    }

alors vous créez un lien symbolique (peut être / 200) vers le fichier 1, l’entrée de répertoire peut ressembler à:

  struct dentry{
        ino_t ino; /* such as 16 */
        char  name[256]; /* "200" */
  }

la structure d'inode peut-être comme:

   struct inode{ /* inode number 15 */ 
         link_t nlink; /* nlink = 2 */
         ...
    }

   struct inode{ /* inode number 16 */
         link_t nlink; /* nlink = 1 */
         ...
    } /* the data of inode 16 maybe /1 or 1 */

En ajoutant à toutes les réponses ci-dessus, la différence dans la recherche du lien physique et du fichier de lien logiciel peut être comprise comme suit:

J'ai un fichier f6 dans mon répertoire actuel, ainsi qu'un répertoire nommé t2 .

Le fichier nommé f1 et ./ t2 / f2 sont des liens symboliques vers f6 .

Le fichier nommé f7 et ./ t2 / f8 sont des liens fixes du f6 .

Pour trouver un lien souple ou matériel, nous pouvons utiliser:

$ find -L . -samefile f6 

> ./f1
> ./f6
> ./f7
> ./t2/f2
> ./t2/f8

Pour trouver uniquement un lien physique, nous pouvons utiliser:

$ find . -xdev -samefile f6

> ./f6
> ./f7
> ./t2/f8

Etant donné que les liens physiques peuvent être créés sur le même système de fichiers, nous pouvons rechercher tous les liens physiques sans utiliser l'option -L (avec l'option -xdev ) dans le même fichier - système / point de montage. Il enregistre la recherche inutile dans différents points de montage.

La recherche du lien physique est donc un peu plus rapide que celle du lien symbolique (veuillez rectifier si je me trompe ou si je ne suis pas clair).

Les liens symboliques donnent un autre nom au fichier, de la même manière que les liens physiques. Mais un fichier peut être supprimé même s'il reste des liens symboliques.

Je viens de trouver un moyen facile de comprendre les liens physiques dans un scénario courant, l’installation de logiciel.

Un jour, j'ai téléchargé un logiciel dans le dossier Téléchargements pour installation. Après avoir créé sudo make install , certains exécutables ont été cp dans le dossier bin local. Ici, cp crée un lien physique . J'étais satisfait du logiciel mais je me suis vite rendu compte que Téléchargements n'était pas un bon endroit à long terme. J'ai donc mv édité le dossier du logiciel dans le répertoire source . Eh bien, je peux toujours exécuter le logiciel comme avant sans me soucier de tout lien de cible, comme dans Windows. Cela signifie que le lien physique recherche directement l'inode et les autres fichiers.

DANS cette réponse quand je dis un fichier, je veux dire l'emplacement dans la mémoire

Toutes les données enregistrées sont stockées en mémoire à l'aide d'une structure de données appelée inodes. Chaque inode a un inodenumber.Le numéro d'inode est utilisé pour accéder à l'inode.Tous les liens physiques vers un fichier peuvent avoir des noms différents mais partager le même Numéro d'inode. Tous les liens physiques ayant le même numéro d'identification (qui accède au même inode), ils pointent tous vers la même mémoire physique.

Un lien symbolique est un type de fichier spécial. Puisqu'il s'agit également d'un fichier, il porte un nom de fichier et un numéro d'inode. Comme indiqué ci-dessus, le numéro d'inode correspond à un inode qui pointe sur des données. Maintenant, qu'est-ce qui crée un lien symbolique? La particularité est que les inodenumbers dans les liens symboliques accèdent aux inodes qui pointent vers "un chemin". Plus précisément, le numéro d’inode dans le lien symbolique concerne les inodes qui pointent vers un autre lien physique.

lorsque nous déplaçons, copions, supprimons un fichier dans l'interface graphique, nous jouons avec les liens physiques du fichier, pas la mémoire physique. Lorsque nous supprimons un fichier, nous supprimons le lien physique du fichier. nous n'effacerons pas la mémoire physique.Si tous les liens durs vers le fichier sont supprimés, il ne sera pas possible d'accéder aux données stockées bien qu'elles puissent toujours être présentes dans la mémoire

Mes deux sous sur l'utilisation:

Les

liens souples peuvent être utilisés pour raccourcir les noms de chemin d'accès longs, c'est-à-dire:

.
ln -s /long/folder/name/on/long/path/file.txt /short/file.txt

Les modifications apportées à /short/file.txt seront appliquées au fichier d'origine.

Les

liens durs peuvent être utilisés pour déplacer de gros fichiers:

$ ls -lh /myapp/dev/
total 10G
-rw-r--r-- 2 root root 10G May 22 12:09 application.bin

ln /myapp/dev/application.bin /myapp/prd/application.bin

La copie instantanée dans un autre dossier et le fichier d'origine (sur / myapp / dev ) peuvent être déplacés ou supprimés sans toucher au fichier sous / myapp / prd

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top