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

488

Comme le titre l'indique, j'aimerais connaître la différence entre un lien physique et un lien virtuel créé par la commande ln. La commande man lnfournit des informations, mais ne répond pas suffisamment à ma question.

En outre, il serait bien que quelqu'un puisse fournir un paramètre dans lequel un lien physique peut être préférable à un lien symbolique.

ste_kwr
la source
15
une des différences ... vous avez un fichier, par exemple test de fichier. Si vous faites ln test hardlink, faites ln -s test symlink puis déplacez le test de fichier dans un autre répertoire (ou renommé), lien symbolique ne fonctionnera pas. Hardlink fonctionnera. Maintenant, essayez de supprimer le test de fichier. Hardlink fonctionnera toujours. En fait, vous pourrez toujours accéder au fichier jusqu’à ce que le nombre de liens durs vers le fichier ne soit pas égal à 0. C’est à cause des inodes, il est écrit dans le manuel ...
Denwerko
5
J'ai rouvert ceci parce qu'il mérite une bonne réponse générique sur cette question (contrairement à la question précédente qui était un exemple C obscur).
Oli
4
Meilleure réponse: youtube.com/watch?v=aO0OkNxDJ3c
Abhishek Bhatia
1
Aussi une réponse tout à fait complète: stackoverflow.com/questions/185899/…
Elzo Valugi
@AbhishekBhatia la vidéo n'est pas disponible
Ooker

Réponses:

59

Sous Linux / Unix, les raccourcis sont appelés liens.


Les liens sont de deux types: les liens symboliques (liens symboliques) ou les liens physiques.

  1. Soft Links (liens symboliques)

    Vous pouvez créer des liens vers des fichiers et des répertoires et créer des liens (raccourcis) sur différentes partitions et avec un numéro d'inode différent de celui d'origine.

    Si la copie réelle est supprimée, le lien ne fonctionnera pas .

  2. Liens durs

    Les liens physiques ne concernent que les fichiers; vous ne pouvez pas créer de lien vers un fichier sur une partition différente avec un numéro d'inode différent.

    Si la copie réelle est supprimée, le lien fonctionnera , car il accédera aux données sous-jacentes auxquelles la copie réelle accédait.


Question: Comment créer un lien symbolique?

Réponse: Un lien symbolique peut être créé avec ln -s; Vous devez d’abord définir la source, puis la destination. (N'oubliez pas que vous devez définir les chemins complets de la source et de la destination, sinon cela ne fonctionnera pas.)

 sudo ln -s /usr/lib/i386-linux-gnu/mesa/libGL.so.1 /usr/lib32/libGL.so.1
             (----------Source-------)             ( Destination )

entrez la description de l'image ici

Comme vous pouvez le voir, il a un inode différent et peut être créé sur une partition différente.


Question: Comment créer un lien dur?

Réponse: Un lien dur peut être fait avec ln; Vous devez d’abord définir la source, puis la destination. (N'oubliez pas que vous devez définir le chemin complet de la source et de la destination, sinon cela ne fonctionnera pas.)

Disons que j'ai un script dans le /scriptrépertoire nommé firefox.

 ls -i # Shows you the inode
 5898242 firefox

 ln /scripts/firefox /scripts/on-fire
       ( Source )    ( Destination )

entrez la description de l'image ici

Comme vous pouvez le voir, il a même inode. Si je supprime l'original, le lien fonctionnera et il agira comme l'original.

entrez la description de l'image ici

Ci-dessus, je vérifie que le lien fonctionne, puis supprime le script Firefox d'origine.


Votre question: Ce serait bien si quelqu'un pouvait fournir un paramètre où un lien physique pourrait être préférable à un lien symbolique.

Réponse : En fonction de la disposition de la partition, les liens physiques ont la limitation d'être sur la même partition (-1 point) et ne peuvent être liés que par des fichiers (-1 point) ), mais +1 point si l'original est supprimé du lien. va travailler et il agit comme l'original.

D'autre part, un lien symbolique peut pointer sur des répertoires ou des fichiers (+1 point) et il n'y a pas de limitation de partition (+1 point), mais (-1 point) si la source est supprimée, le lien ne fonctionnera pas.

Qasim
la source
Puis-je créer un lien dur et fournir l'inode comme source?
TMOTTM
324

Un lien physique n'est pas un pointeur sur un fichier, c'est une entrée de répertoire (un fichier) pointant sur le même inode. Même si vous modifiez le nom de l'autre fichier, un lien dur pointe toujours vers le fichier. Si vous remplacez l'autre fichier par une nouvelle version (en le copiant), un lien matériel ne pointera pas sur le nouveau fichier. Vous ne pouvez avoir que des liens durs dans le même système de fichiers. Avec les liens durs, vous n'avez pas la notion des fichiers et des liens d'origine, ils sont tous égaux (pensez-y comme une référence à un objet). C'est un concept de très bas niveau.

D'autre part, un lien symbolique pointe en fait sur un autre chemin (un nom de fichier); il résout le nom du fichier chaque fois que vous y accédez via le lien symbolique. Si vous déplacez le fichier, le lien symbolique ne suivra pas. Si vous remplacez le fichier par un autre en conservant le nom, le lien symbolique désignera le nouveau fichier. Les liens symboliques peuvent s'étendre sur des systèmes de fichiers. Avec les liens symboliques, vous faites une distinction très claire entre le fichier réel et le lien symbolique, qui ne stocke aucune information à côté du chemin d'accès au fichier sur lequel il pointe.

vartec
la source
1
Une chose qui (par ses propres mots) "pointe vers le fichier" peut être appelée un pointeur (elle est trivialement presque tautologiquement vraie). Si nous sommes en train de chercher, alors (en général) la notion de liens physiques peut exister même si un système de fichiers n'utilise pas d'inodes.
jfs
320

"Une image vaut mieux que mille mots." Représentation picturale


Et, "Un exemple vaut cent paragraphes ..."

Créez deux fichiers:

$ touch blah1   
$ touch blah2

Entrez quelques données dans eux:

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

Et comme prévu:

$cat blah1; cat blah2
Cat
Dog

Créons des liens durs et souples:

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

Voyons 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-hard pointe sur l'inode, le contenu du fichier - cela n'a pas changé.

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

Impossible de trouver le contenu du fichier car le lien virtuel pointe vers le nom, qui a été modifié, et non vers le contenu.
De même, si blah1 est supprimé, blah1-hard en conserve le contenu; si blah2 est supprimé, blah2-soft est simplement un lien vers un fichier non existant.


source: copie flagrante de StackOverflow!

ABcDexter
la source
13
Pour être juste envers vous - vous avez ajouté la belle image en haut ... ah vous l'avez copiée aussi! Combiner les deux réponses est en fait très utile :)
icc97
2
mieux expliqué, nulle part!
dennisbot
3
J'ai continué à regarder l'image pendant 20 secondes, puis, tout à coup, je l'ai compris. C'est vraiment génial.
Mohammed Joraid
1
Au fait: utiliser des liens durs avec git est une mauvaise idée , juste au cas où quelqu'un (frustré par les liens souples) se demanderait ... pourrait également s'appliquer à d'autres systèmes de gestion de versions.
Frank Nocke
1
Un inode de ses liens physiques est-il similaire à un fichier stocké dans le cloud de tout appareil qui y accède?
Ooker
89

Les deux sont des pointeurs vers des fichiers; la différence est le genre de pointeur. Un lien symbolique pointe vers un autre fichier par son nom . Il a un bit de mode spécial qui l'identifie comme un lien symbolique et son contenu est le nom du fichier réel. Comme il ne contient qu'un nom, ce nom ne doit pas nécessairement exister, ou peut exister sur un système de fichiers différent. Si vous remplacez le fichier nommé (modifiez son contenu sans affecter son nom), le lien contient toujours le même nom et pointe donc maintenant vers le nouveau fichier. Vous pouvez facilement identifier un lien symbolique et voir le nom du fichier sur lequel il pointe.

Un lien physique pointe vers le fichier par numéro d'inode. En tant que tels, les liens physiques ne sont pas différents du prénom d'un fichier. Il n'y a pas de "vrai" nom par rapport au nom du lien physique; tous les liens physiques sont des noms également valides pour le fichier. Pour cette raison, le fichier auquel vous vous associez doit exister et se trouver dans le même système de fichiers que celui où vous essayez de créer le lien. Si vous supprimez le nom d'origine, le lien physique pointe toujours vers le même fichier. Tous les liens physiques étant des noms valables pour le fichier, vous ne pouvez pas en regarder un et voir les autres noms du fichier; pour le trouver, vous devez examiner chaque fichier et comparer son numéro d'inode afin de trouver le ou les autres noms qui portent le même numéro d'inode.

Vous pouvez déterminer le nombre de noms d’un fichier à partir de la sortie de ls -l. Le premier nombre après le mode fichier est le nombre de liens. Un fichier avec plus d'un lien a un autre nom quelque part, et inversement, un fichier avec un nombre de liens égal à 1 seulement n'a pas (d'autres) liens physiques.

psusi
la source
If you replace the named file, then the link still contains the same name, and so now it points to the new file- Je pense que ce n'est pas bien expliqué. Voulez-vous dire que si je remplace le fichier dans lequel j'ai un lien symbolique, les liens contenant le nom restent intacts. Mais il ne pointerait que sur le fichier remplacé lorsque son nom de fichier (c'est-à-dire un nouveau fichier remplaçant l'ancien) est identique à celui remplacé (c'est-à-dire l'ancien fichier qui a été remplacé par le nouveau), n'est-ce pas?
Mike
@ Mike, oui: le lien symbolique pointe vers le nom du fichier d'origine. Son remplacement signifie donc que le lien pointe maintenant vers le nouveau fichier.
psusi
Mais seulement si le nom est le même? Si le lien symbolique pointait vers banane et que je remplace le fichier par orange, le lien sy ne peut plus trouver le fichier banane, c.-à-d. Que cela ne fonctionnera pas
Mike
@Mike, remplacer le monde signifie qu'il porte le même nom, sinon vous supprimez simplement un fichier et en ajoutez un autre;)
psusi
58

Un lien physique ne peut fonctionner que sur le même système de fichiers, il s'agit simplement d'un nom différent pour le même inode (les fichiers sont référencés en interne par des inodes). Un fichier ne sera supprimé à partir du disque lorsque le dernier lien vers son inode est parti (vous rmd ou unlinkd la dernière liaison). Les liens physiques ne fonctionnent généralement que pour des fichiers, pas des répertoires.

Un lien symbolique (lien symbolique) est un fichier spécial contenant un chemin d'accès à un autre fichier. Ce chemin peut être absolu ou relatif. Les liens symboliques peuvent fonctionner sur plusieurs systèmes de fichiers et peuvent même pointer vers différents fichiers, par exemple si vous débranchez un disque dur externe et le remplacez par un autre, dont le fichier est différent du même chemin. Un lien symbolique peut désigner des fichiers ou des répertoires.

tricot
la source
Merci, cela me dit comment ils fonctionnent, mais que fait exactement le lien dur? Et pourquoi ça ne marche pas pour les annuaires?
ste_kwr
@knittl: vous êtes sûr? Il semble que sur certains systèmes de fichiers, les liens physiques sur des répertoires sont autorisés mais seul root peut les créer. Voir les -d, -F, --directoryinterrupteurs. Et oui, je l' ai vu la note de la ln(1)page :)
0xC0000022L
1
@kniwor: le moyen le plus simple de décrire des liens physiques est "juste un autre nom pour le même fichier (c'est-à-dire les données sur le disque)". Et - du moins sur mon (mes) système (s) - lnne peut pas être utilisé pour créer des liens en dur vers des répertoires. Il existe cependant des liens durs vers des répertoires, l'exemple le plus important étant .et ... Je ne voulais pas inclure cela dans ma réponse initiale, car cela ne ferait que compliquer les choses.
Knittl
2
@STATUS_ACCESS_DENIED: bien d'accord… mais ce n'est généralement pas une bonne idée. C'est pourquoi j'ai écrit «habituellement» dans ma réponse originale. Voir aussi mon commentaire précédent pour des exemples.
Knittl
Un lien physique peut donc pointer vers le même dossier / fichier avec des noms différents, c.-à-d. avoir des noms différents qui renvoient au même inode?
Charlie Parker
21

Une des réponses de l’autre fil (maintenant liée au début de votre message) mentionne cette page qui, à mon avis, est une assez bonne explication de niveau moyen. Si vous vous perdez dans l'art ascii, voici la version tl; dr:

  • Les fichiers standard sont un pointeur du système de fichiers vers un inode qui pointe à son tour vers des données physiques. Le composant de fichier stocke son lien vers le système de fichiers (essentiellement son chemin) et un lien vers l'inode.
  • Les liens durs sont comme des fichiers. Ils sont juste un pointeur supplémentaire directement sur un inode.
  • Les liens symboliques sont des fichiers séparés (y compris des inodes et des données distincts) qui stockent un chemin de système de fichiers vers un fichier.

Le noyau et les systèmes de fichiers impliqués traduisent tout de manière transparente.

Donc basé sur ça:

  • Les liens physiques n'autorisent que les liens entre systèmes de fichiers identiques. Les liens symboliques peuvent pointer sur n'importe quel chemin.
  • Les liens durs (essentiellement) pointent vers des données absolues. Les liens symboliques peuvent pointer vers des chemins relatifs (par exemple ../parent.file)
  • Par extension, si vous déplacez le pointeur cible d'un lien dur (qui, rappelez-vous, n'est en réalité qu'un lien dur pointant vers un inode), le lien dur fonctionne toujours. Déplacer la cible d'un lien symbolique romprait généralement le lien symbolique.
  • Résoudre un lien dur serait plus rapide mais énormément. Cette partie insignifiante de la vitesse est au détriment d'un système de fichiers inflexible.

Je me suis peut-être un peu confondu, mais en lisant diverses choses, j'ai du mal à faire la différence entre un fichier standard et un lien physique. La façon dont je le lis est que chaque fichier est constitué d'un lien dur (stockant le nom du fichier), qui relie à un inode qui pointe sur des données physiques.

L'ajout d'un lien physique fournit simplement un inode avec un pointeur supplémentaire basé sur un système de fichiers. Est-ce correct?

Oli
la source
5
Je pense que vous avez raison, chaque fichier est un chemin d'accès pour un inode, et un lien physique est un chemin d'accès supplémentaire pour le même inode. Un lien physique n’est donc pas différent d’un fichier normal.
enzotib
J'essaie de comprendre cela ... mais vous dites:> "Les liens symboliques sont des fichiers séparés (y compris des inodes et des données séparés ) qui stockent un chemin de système de fichiers vers un fichier." Un lien symbolique a-t-il vraiment des données séparées? Ensuite, c’est comme une copie du répertoire auquel elle renvoie, non? ... et chaque fois que quelque chose est écrit sur le lien symbolique, il doit être écrit deux fois sur le disque? Ça n'a aucun sens.
MiniGod
@MiniGod Non, un lien symbolique est un inode vers un bloc de données qui stocke le chemin d'accès à un autre inode (nom de fichier). Ouais, c'est matriciel déroutant, mais une fois que vous l'obtenez, vous n'oublierez jamais :)
Oli
@Oli Je suis peut-être dérouté, mais quand vous dites: "y compris l'inode et les données séparées ", vous voulez dire que le lien symbolique contient des données séparées!?
MiniGod
1
@MiniGod Ouais. Le lien symbolique est un inode pointant sur des données (comme un fichier normal) et ces données sont un chemin. C'est un peu plus astucieux que cela - de permettre une utilisation transparente à travers des liens symboliques - mais c'est essentiellement tout ce qu'ils sont.
Oli
15

Quand utiliser Soft Link:

Lien entre les systèmes de fichiers: Si vous souhaitez lier des fichiers entre les systèmes de fichiers, vous ne pouvez utiliser que des liens symboliques / souples.

Liens vers répertoire: Si vous souhaitez lier des répertoires, vous devez utiliser des liens souples, car vous ne pouvez pas créer de lien physique vers un répertoire.

Quand utiliser Hard Link:

Espace de stockage: les liens physiques occupent très peu d'espace, car aucun nouvel inode n'a été créé lors de la création de liens physiques. Dans les liens symboliques, nous créons un fichier qui consomme de l’espace (habituellement 4 Ko, selon le système de fichiers).

Performance: les performances seront légèrement meilleures lors de l'accès à un lien physique, car vous accédez directement au pointeur du disque au lieu de passer par un autre fichier. Déplacement de l'emplacement du fichier: si vous déplacez le fichier source vers un autre emplacement du même système de fichiers, le lien fixe fonctionnera toujours, mais le lien souple échouera.

Redondance: si vous voulez vous assurer de la sécurité de vos données, vous devez utiliser un lien physique, comme dans le lien physique, les données sont en sécurité, jusqu'à ce que tous les liens vers les fichiers soient supprimés, au lieu de cela dans le lien virtuel, vous perdrez les données si l'instance principale du fichier est supprimée.

Oussama
la source
Notez qu'il existe également un lien symbolique rapide pour une taille de chemin allant jusqu'à 64 octets. Il prend toujours un inode, mais ne consomme pas 4 Ko d'espace de bloc.
syockit
8

La confusion s'installe lorsque vous essayez de trouver la différence entre "le nom du fichier" et un lien physique, car il n'y en a pas.

Chaque fichier que vous créez se compose de données sur le disque et d'un lien physique - qui est un nom de fichier dans un répertoire et un pointeur sur les données du disque. Fin de l'histoire. Lorsque le dernier (ou le seul) lien physique est supprimé, le système d'exploitation sait que les données ne sont plus nécessaires.

À partir de là, vous pouvez voir que les données réelles ne sont jamais supprimées, mais uniquement les liens durs. Et quand il est suffisamment encombré sur le disque, les données peuvent être écrasées par les données d'un autre fichier. Jusque-là, les données du fichier supprimé pourraient être récupérées, mais il est un peu difficile à trouver sans lien dur.

Comme indiqué précédemment, les liens symboliques vous indiquent simplement "qu'il existe un fichier nommé <targetname>dans un dossier nommé <targetfolder>". Ils indiquent le lien dur. Ils ne savent pas où sont les données. Le lien dur le sait.

Gonesoft
la source
0

C'est très simple. Les fichiers (et les répertoires!) Sont stockés à des adresses sur le périphérique bloc (disque dur ou autre). Normalement, vous avez un seul nom mappé à une adresse, et c'est ainsi que vous obtenez votre fichier. Un lien physique est un deuxième, troisième, etc. nom mappé à la même adresse. Au lieu de cela, un lien symbolique fait référence au symbole - le nom - et ainsi à un deuxième nom mappé au prénom. En ce qui concerne le noyau, une fois qu'il a lu le lien symbolique cible, il s'arrête et revient au début avec la valeur cible comme nom de fichier (plus ou moins), de sorte que les liens symboliques relatifs sont possibles mais extrêmement inutiles. Le nom de la cible n'est pas utilisé au-dessus du niveau du système de fichiers, sauf s'il est explicitement interrogé dans le code de l'espace utilisateur.

Jim Driscoll
la source