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

769

Récemment, cela m'a été demandé lors d'un entretien d'embauche. J'ai été honnête et j'ai dit que je savais comment un lien symbolique se comportait et comment en créer un, mais je ne comprenais pas l'utilisation d'un lien dur et en quoi il diffère d'un lien symbolique.

Nick Stinemates
la source
2
à propos de 'ne pas comprendre l'utilisation d'un lien dur', il peut être utilisé dans les systèmes de construction qui font beaucoup de copie de binaires. La création d'un lien dur au lieu d'une copie réelle accélère les choses. MSBuild 4.0 prend en charge cela.
Ankush
13
Je trouve ce lien très utile pour le comprendre. askubuntu.com/questions/108771/...
KTA
2
unix.stackexchange a une bonne liste de puces ... très utile car il énonce toutes les contraintes de manière très concise et est facile à parcourir. (beaucoup de ces puces couvrent des cas de bord / mises en garde qui ne sont mentionnés que dans les commentaires de cette question ... ou ne sont pas du tout mentionnés)
Trevor Boyd Smith

Réponses:

781

Sous le système de fichiers, les fichiers sont représentés par des inodes. (Ou s'agit-il de plusieurs inodes? Pas sûr.)

Un fichier dans le système de fichiers est essentiellement un lien vers un inode.
Un lien dur 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 / écrasable) que 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é établi, le lien est vers l'inode. La suppression, le changement de nom ou le déplacement du fichier d'origine n'affectera pas le lien dur 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 matériels ne sont valables 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.

Martin York
la source
2
Je suis sûr que les i-nœuds dépendent de la variante particulière de l'OS; cependant, je pense qu'il s'agit généralement d'un seul nœud i. L'i-node contient des informations sur le fichier et des informations sur l'emplacement de stockage des données sur le disque. Les fichiers volumineux auront des pointeurs indirects vers des tables supplémentaires.
terson
76
Vous voudrez peut-être ajouter la fonctionnalité utile que les liens symboliques peuvent traverser les systèmes de fichiers, les liens durs ne peuvent pas (ils doivent faire référence à un fichier sur le même système de fichiers).
paxdiablo
53
Il y a une bonne explication visuelle dans un article sur Linux Gazette
Rodrigue
1
J'ai également écrit un blog à ce sujet après quelques lectures et expériences csharpbsharp.tumblr.com
Adnan Bhatti
1
@zen: vous pouvez démonter / remonter un système de fichiers chaque fois qu'il n'est pas utilisé. Pour la partition racine, c'est un peu délicat mais cela peut être fait (non recommandé). Pour le faire pour la racine, il est généralement préférable de démarrer à partir d'un CD rescuse, modifiez d'abord les montages et redémarrez. Mais vous devriez poser ce genre de question sur le super utilisateur.
Martin York
464

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

Créez deux fichiers:

$ touch foo; touch bar

Saisissez-y des données:

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

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

Et comme prévu:

$cat foo; cat bar
Cat
Dog

Créons des liens durs et doux:

$ 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 vers 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 est introuvable car le lien logiciel pointe vers le nom modifié et non vers le contenu.

De même, si fooest supprimé, foo-hardcontient toujours le contenu; si barest supprimé, bar-softn'est qu'un lien vers un fichier inexistant.

Adam Matan
la source
12
cela signifie-t-il qu'un "fichier" et un "lien dur" sont identiques, tous deux pointant vers un inode? lors de la suppression d'un fichier ou d'un lien dur, le contenu existe toujours tant que l'on pointe toujours vers l'inode, n'est-ce pas?
Daniel W.
1
@DanFromGermany Correct. Le contenu est accessible tant qu’au moins un lien dur (c’est-à-dire un fichier) le pointe.
Adam Matan
6
touch blah1; touch blah2peut être raccourci entouch blah1 blah2
Dmitri Zaitsev
11
@DmitriZaitsev Vrai, mais il sera moins lisible pour les débutants OMI.
Adam Matan
8
Je pense que c'est la réponse la plus compréhensible par rapport aux nombreuses réponses que j'ai lues. Un échantillon est meilleur qu'un tas de texte d'explication.
Scott Chu
435

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

entrez la description de l'image ici

Voici comment nous arrivons à cette image:

  1. Créez un nom myfile.txtdans 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 qui contiennent son contenu, c'est-à-dire le texte "Hello, World!":

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

    $ ln myfile.txt my-hard-link
    
  3. Créez un lien logiciel my-soft-linkvers le 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 se passera maintenant si myfile.txtest supprimé (ou déplacé): my-hard-linkpointe toujours vers le même contenu, et n'est donc pas affecté, alors qu'il my-soft-linkpointe maintenant vers rien. D'autres réponses discutent des avantages / inconvénients de chacun.

akivajgordon
la source
3
@ThunderWiring Par "point", je veux dire quelles que soient les références des liens. Dans le cas d'un lien dur, il fait directement référence à un inode (c'est-à-dire le même inode référencé par myfile.txt). Pour le lien logiciel, sa référence n'est pas l'inode (qui contient les données), mais plutôt sa référence est le chemin du système de fichiers vers myfile.txt(par exemple /home/Documents/myfile.txt)
akivajgordon
4
J'aime vraiment votre réponse visuelle @akivajgordon - m'a vraiment aidé à mieux comprendre les différences!
wmock
7
Dix mille mots!
SaganRitual
13
Peut-être que je suis lent, mais votre photo a éclairci 20 ans de mystère en environ 2 secondes.
jdk1.0
3
La réponse la plus utile, je suis fou, c'est si profondément enfoui dans ce post. Je vous donnerais une centaine de points Internet mais malheureusement je ne peux vous en donner qu'un.
Dagrooms
71

Les liens physiques sont utiles lorsque le fichier d'origine 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 rompu par cela, mais un lien dur, étant un lien directement vers l'inode du fichier, ne s'en soucierait pas.

Les liens matériels peuvent prendre moins d'espace disque car ils n'occupent 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 qui se trouvent dans des répertoires de liens symboliques. Et certains d'entre eux peuvent se trouver sur NFS ou sur d'autres systèmes de fichiers à latence élevée, ce qui peut entraîner la résolution du trafic réseau. Les liens matériels, étant 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 (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 pour 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 également que des choses comme mmap (2) et même open (2) utilisent les mêmes fonctionnalités que les liens physiques pour garder l'inode d'un fichier actif de sorte que même si le fichier est dissocié (2), l'inode reste pour permettre au processus de continuer à accéder, 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 de manière atomique, ce qui peut être une API POSIX dont je ne me souviens pas, vous avez vraiment un fichier temporaire sûr) 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, la récupération d'un fichier ouvert dans le processus A, mais non lié sur le 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 s'en va.

Tanktalus
la source
35

Lien logiciel :

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

Syntaxe du lien logiciel :ln -s Pathof_Target_file link

Production : link -> ./Target_file

Preuve: readlink link également dans la ls -l linksortie, vous verrez la première lettre en lrwxrwxrwxtant que l qui indique que le fichier est un lien logiciel.

Suppression du lien: unlink link

Remarque: Si vous le souhaitez, votre lien logiciel peut fonctionner même après l'avoir déplacé ailleurs dans le répertoire actuel. Assurez-vous d'indiquer un chemin absolu et non relatif lors de la création d'un lien logiciel. ie (à 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. Faites quelque chose pour file1 et il apparaît dans le fichier 2. La suppression de l'un maintient toujours l'autre ok.

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

Une fois qu'un lien matériel a été créé, le lien a l'inode du fichier d'origine. La suppression du changement de nom ou le déplacement du fichier d'origine n'affectera pas le lien dur 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 matériel :ln Target_file link

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

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

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

Remarque : Les 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 matériels ne sont valables que dans le même système de fichiers.

Les liens symboliques ont certaines fonctionnalités, les liens durs sont manquants:

  • Le lien dur pointe vers le contenu du fichier. tandis que le lien logiciel pointe vers le nom du fichier.
  • tandis que la taille du lien matériel est la taille du contenu tandis que le lien logiciel a la taille du nom de fichier.
  • Les liens matériels partagent le même inode. Les liens logiciels ne le font pas.
  • Les liens matériels ne peuvent pas traverser les systèmes de fichiers. Les liens souples le font.
  • vous savez immédiatement où un lien symbolique pointe alors qu'avec des liens durs, vous devez explorer l'ensemble du système de fichiers pour trouver des fichiers partageant le même inode.

    # find / -inum 517333

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

Les liens durs ont deux limitations:

  • Les répertoires ne peuvent pas être liés en dur. Linux ne permet pas de maintenir la structure arborescente acyclique des répertoires.
  • Un lien dur ne peut pas être créé entre les systèmes de fichiers. Les deux fichiers doivent se trouver sur les mêmes systèmes de fichiers, car différents systèmes de fichiers ont des tables d'inodes indépendantes différentes (deux fichiers sur des systèmes de fichiers différents, mais avec le même numéro d'inode seront différents).
Prabhat Kumar Singh
la source
3
"tandis que la taille du lien dur est la taille du contenu tandis que le lien logiciel a la taille du nom de fichier." Juste pour clarifier, faire un autre lien dur n'affecte que l'espace libre de quelques octets.
Ingo
34

Un moyen simple de voir la différence entre un lien physique et un lien symbolique consiste à utiliser un exemple simple. Un lien dur vers un fichier pointera vers l'emplacement où le fichier est stocké, ou l'inode de ce fichier. Un lien symbolique pointera vers le fichier lui-même.

Donc, si nous avons un fichier appelé "a" et créons un lien dur "b" et un lien symbolique "c" qui font tous référence 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 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é?

Parce que le fichier "c" pointe vers le fichier "a" lui-même, si le fichier "a" est supprimé, alors le fichier "c" n'aura rien vers quoi pointer, 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 "a" est supprimé, il ne pointera plus vers l'inode, mais parce que le fichier "b" le fait, l'inode continuera à stocker tout le contenu appartenant à "a" jusqu'à ce que plus aucun lien dur ne pointe vers lui.

buydadip
la source
Il peut être utile de souligner que, un fichier est un objet très abstrait et a avec toutes les choses abstraites, l'intention réelle des implémentations de haut niveau peut ne pas être expliquée correctement sans risquer de faire exploser les abstractions.
Cholthi Paul Ttiopic
28

Les liens symboliques pointent vers un nom de chemin. Cela peut se trouver n'importe où dans l'arborescence de fichiers 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 matériels 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 ne peuvent pas être distingués du nom "d'origine" utilisé pour référencer un fichier.

personne
la source
De plus, lorsque vous supprimez le fichier vers lequel vous créez un lien, un lien symbolique est rompu, un lien dur reste valide, car il "conserve" le fichier dans le système de fichiers.
njsf
21

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 matériels pointent vers un fichier et vous permettent de vous référer au même fichier avec plusieurs noms.
  • Tant qu'il y a au moins un lien, les données sont toujours disponibles.
Jauder Ho
la source
1
En théorie (et dans certains cas, même dans la pratique), les liens matériels peuvent également pointer vers des répertoires (en fait, "." Est un lien physique vers le répertoire courant et ".." est un lien physique vers le répertoire parent). Mais ils peuvent être dangereux, donc la plupart des UNIX ne les autorisent pas (ou vous obligent à prendre des mesures spéciales pour le faire). Apple les utilise pour leur implémentation de Time Machine par exemple: earthlingsoft.net/ssp/blog/2008/03/x5_time_machine
Joachim Sauer
3
Vous pointez un lien vers un article ... cela fait-il de vous un lien symbolique?
Ian Campbell
@JoachimSauer Pensez-vous que le nouveau système de fichiers Apple éliminera le besoin pour Time Machine d'utiliser des liens durs vers des répertoires?
cjm
J'ai trouvé l'explication de wikipedia significativement plus courte et plus concrète que les explications dans les réponses les mieux notées.
Lakesare
9

Les liens matériels sont très utiles lors des sauvegardes incrémentielles. Voir rsnapshot , par exemple. L'idée est de faire de la copie en utilisant des liens durs:

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

La nouvelle sauvegarde ne prendra 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 qui n'ont pas changé.

JesperE
la source
6

Lien dur vs lien souple

Lien dur vs lien souple peut être facilement expliqué par cette image.

PGOEL
la source
5
Je suppose que votre photo de lien logiciel n'est pas correcte. Point: l'inode du lien logiciel ne doit pas pointer vers l'inode du fichier d'origine. Parce que si vous renommez le fichier d'origine, le lien
logiciel associé
@ percy507 oui vous avez raison - mais je trouve quand même une explication très agréable et intuitive. Imaginez juste que la flèche entre les inodes n'est pas là ...
Michael Litvin
5

J'ajoute à la question de Nick: quand les liens durs sont-ils utiles ou nécessaires? La seule application qui me vient à l'esprit, dans laquelle les liens symboliques ne feraient pas l'affaire, fournit une copie d'un fichier système dans un environnement chrooté.

Federico A. Ramponi
la source
Système distribué avec des points de montage à différents endroits sur différents systèmes. Bien sûr, cela pourrait être conçu en dehors du système en étant cohérent.
terson
Je pense que @Tanktalus a fourni un excellent exemple.
Nick Stinemates
4

Depuis MSDN ,

Lien symbolique

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

Les liens symboliques sont transparents pour les utilisateurs; les liens apparaissent comme des fichiers ou des répertoires normaux et peuvent être utilisés par l'utilisateur ou l'application exactement de la même manière.

Les liens symboliques sont conçus pour faciliter la migration et la compatibilité des applications avec les systèmes d'exploitation UNIX. Microsoft a implémenté ses liens symboliques pour fonctionner exactement comme les liens UNIX.

Les liens symboliques peuvent être des liens absolus ou relatifs. Les liens absolus sont des liens qui spécifient chaque partie du nom de chemin; les liens relatifs sont déterminés par rapport à l'emplacement des spécificateurs de liens relatifs dans un chemin spécifié

Un 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 dur

Un lien dur est la représentation du système de fichiers d'un fichier par laquelle plus d'un chemin fait référence à un seul fichier dans le même volume .

Pour créer un lien dur dans Windows, accédez à l'endroit où le lien doit être créé et entrez cette commande:

mklink /H Link_name target_path

Notez que vous pouvez supprimer des liens physiques dans n'importe quel ordre, quel que soit l'ordre dans lequel ils ont été créés. De plus, 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 sur 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 liaison logicielle) diffère d'une liaison matérielle en ce que les objets de stockage auxquels elle fait 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 matérielles.

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

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

mklink /J link_name target_path
Sнаđошƒаӽ
la source
3

Aussi:

  1. Les performances de lecture des liens durs sont meilleures que les liens symboliques (micro-performances)
  2. Les liens symboliques peuvent être copiés, contrôlés par version, ..etc. En d'autres termes, il s'agit d'un véritable fichier. À l'autre extrémité, un lien dur est quelque chose d'un niveau légèrement inférieur et vous constaterez que par rapport aux liens symboliques, il y a moins d'outils qui fournissent des moyens de travailler avec les liens durs en tant que liens durs et non en tant que fichiers normaux
Amr Mostafa
la source
3

Simplement, lien dur: il suffit d'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, personne n'est préféré, le lien dur n'est pas destiné à copier tout le contenu de fichier et faire un nouveau fichier n'est pas ça, il suffit de créer un autre nom à connaître.

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

Yassine Abdul-Rahman
la source
3

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 dur pour un fichier, vous créez en fait 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. Vous n'avez donc pas vraiment "un fichier plus un lien dur", vous avez "des données de fichier avec deux entrées de répertoire". Ce que vous considérez comme la suppression d'un fichier supprime en fait une entrée de répertoire et 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 qui n'ont qu'une seule entrée de répertoire, la suppression de l'entrée de répertoire supprimera les données comme toujours. (Lorsqu'un fichier est ouvert, le système d'exploitation crée un lien temporaire vers le fichier,

Par exemple, créez un fichier A.txt, un lien dur B.txt et supprimez A.txt. Lorsque vous avez créé A.txt, certaines données ont été créées et une entrée de répertoire A.txt. Lorsque vous avez créé le lien dur, une autre entrée de répertoire B.txt a été créée, pointant vers les mêmes données exactes. Lorsque vous supprimez A.txt, vous avez toujours toutes les données et une seule entrée de répertoire B.txt, exactement comme si vous aviez créé un fichier B.txt en premier lieu.

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

gnasher729
la source
2

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

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

l'ino est le nombre d'inode, le nom est le nom du fichier, la structure de l'inode peut être comme :

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 inode peut-être comme:

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

puis 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 inode peut-être comme:

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

puis vous créez un lien symbolique (peut être / 200) vers le fichier 1, l'entrée du répertoire peut être comme:

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

la structure 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 */
mc.robin
la source
2

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

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

Fichier nommé f1et ./t2/f2sont des liens symboliques vers f6.

Nom du fichier f7et ./t2/f8liens durs de f6.

Pour trouver un lien souple ou dur, nous pouvons utiliser:

$ find -L . -samefile f6 

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

Pour trouver uniquement un lien dur, nous pouvons utiliser:

$ find . -xdev -samefile f6

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

Étant 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 -Loption utilisée (avec -xdevoption) dans le même système de fichiers / point de montage. Il enregistre la recherche inutile dans différents points de montage.

Ainsi, la recherche sur le lien dur est un peu plus rapide que la recherche sur les liens logiciels (veuillez rectifier si je me trompe ou si je ne suis pas clair).

ChandanK
la source
1

Les liens symboliques donnent un autre nom à un fichier, d'une manière similaire aux liens physiques. Mais un fichier peut être supprimé même s'il reste des liens symboliques.

lmmorris1
la source
Non. Le lien symbolique n'est pas "un autre nom pour le même fichier", c'est un fichier à part entière, lié au fichier cible.
Kusalananda
1

Mes deux cents sur l'utilisation:

Des liens logiciels peuvent être utilisés pour raccourcir les noms de chemin longs, c'est-à-dire:

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

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

Des liens physiques peuvent être utilisés pour se déplacer dans 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 dossier différent et le fichier d'origine (activé /myapp/dev) peuvent être déplacés ou supprimés, sans toucher le fichier/myapp/prd

Matheus Santoro
la source
0

Je viens de trouver un moyen facile de comprendre les liens matériels dans un scénario courant, l'installation de logiciels.

Un jour, j'ai téléchargé un logiciel dans un dossier Downloadspour l'installation. Après cela sudo make install, certains exécutables ont été cpédités dans le dossier bin local. Ici, cpcrée un lien dur . J'étais satisfait du logiciel mais j'ai vite compris que ce Downloadsn'était pas un bon endroit à long terme. J'ai donc mvédité le dossier du logiciel dans le sourcerépertoire. Eh bien, je peux toujours exécuter le logiciel comme avant sans me soucier de tout lien cible, comme dans Windows. Cela signifie que le lien dur trouve directement l'inode et d'autres fichiers autour.

le champ
la source
0

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

Toutes les données enregistrées sont stockées dans la mémoire à l'aide d'une structure de données appelée inodes Chaque inode a un numéro d'inoden. Le numéro d'inode est utilisé pour accéder à l'inode.Tous les liens durs vers un fichier peuvent avoir des noms différents mais partager le même numéro d'inode. Étant donné que tous les liens matériels ont le même numéro d'inod (qui à leur tour accèdent au même inode), ils pointent tous vers la même mémoire physique.

Un lien symbolique est un type spécial de fichier. Puisqu'il s'agit également d'un fichier, il aura un nom de fichier et un numéro d'inode. Comme indiqué ci-dessus, le numéro d'inode accède à un inode qui pointe vers des données. les inodenumbers dans les liens symboliques accèdent aux inodes qui pointent vers "un chemin" vers un autre fichier. Plus précisément le numéro d'inode dans le lien symbolique accède aux inodes qui pointent vers un autre lien dur.

lorsque nous déplaçons, copions, supprimons un fichier dans l'interface graphique, nous jouons avec les liens physiques du fichier et non la mémoire physique. Lorsque nous supprimons un fichier, nous supprimons le lien physique du fichier. nous n'effaçons 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 en mémoire

s. srinath
la source