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


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

En outre, il serait bien que quelqu'un puisse fournir un paramètre où le lien dur pourrait être préférable à un lien symbolique.


447
2018-02-29 09:03


origine


une des différences ... vous avez un fichier, par exemple un test de fichier. Si vous testez ln hardlink, faites ln -s testez le lien symbolique, puis déplacez le test du fichier vers un autre répertoire (ou renommez), le lien symbolique ne fonctionnera pas. Hardlink travaillera. Maintenant, essayez de supprimer le test de fichier. Hardlink fonctionnera toujours, en fait vous serez toujours en mesure d'accéder au fichier jusqu'à ce que le nombre de liens durs vers le fichier ne soit pas 0. C'est à cause des inodes, il est écrit en manuel ... - Denwerko
Je l'ai rouvert parce qu'il mérite une bonne réponse générique sur ce problème (contrairement à la question précédente qui était un exemple C obscur). - Oli♦
Meilleure réponse: youtube.com/watch?v=aO0OkNxDJ3c - Abhishek Bhatia
Aussi une réponse complète: stackoverflow.com/questions/185899/… - Elzo Valugi
@ AbhishekBhatia la vidéo n'est pas disponible - Ooker


Réponses:


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


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

  1. Liens Mous (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 l'original.

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

  2. Liens Dur

    Les liens durs 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 réal la copie est supprimée le le lien fonctionnera, car il accède aux données sous-jacentes auxquelles la copie réelle accédait.


Question: Comment puis-je créer un lien logiciel?

Répondre: Un lien doux peut être fait avec ln -s; Vous devez d'abord définir la source, puis définir la destination. (Gardez à l'esprit 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 )

enter image description here

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


Question: Comment faire un lien dur?

Répondre: Un lien dur peut être fait avec ln; Vous devez d'abord définir la source, puis définir la destination. (Gardez à l'esprit 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 /script répertoire nommé firefox.

 ls -i # Shows you the inode
 5898242 firefox

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

enter image description here

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

enter image description here

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


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

Répondre : En fonction de la disposition de la partition de disque, Liens Dur avoir la limitation qu'ils doivent être sur la même partition (-1 point) et ne peut que lier des fichiers (-1 point) ), mais +1 point Si l'original est supprimé, le lien fonctionnera et il agira comme l'original.

D'un autre côté, un lien logiciel peut pointer vers 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.


31
2018-05-09 00:42





Un lien dur n'est pas un pointeur vers un fichier, c'est une entrée de répertoire (un fichier) pointant vers le même inode. Même si vous modifiez le nom de l'autre fichier, un lien physique pointe toujours sur le fichier. Si vous remplacez l'autre fichier par une nouvelle version (en le copiant), un lien physique ne pointera pas vers 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 de concept des fichiers et des liens originaux, tous sont égaux (pensez-y comme une référence à un objet). C'est un concept de très bas niveau.

En revanche, un lien symbolique pointe vers 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 pointe vers le nouveau fichier. Les liens symboliques peuvent couvrir des systèmes de fichiers. Avec les liens symboliques, vous avez une distinction très nette entre le fichier réel et le lien symbolique, qui ne stocke aucune information à côté du chemin d'accès au fichier vers lequel il pointe.


314
2018-05-18 09:51



Une chose qui (par ses propres mots) "pointe vers le fichier"  peut être appelé un aiguille (c'est trivialement presque tautologiquement vrai). Si nous détournons les yeux (en général), la notion de liens durs peut exister même si un système de fichiers n’utilise pas d’inodes. - jfs


"Une image vaut mieux que mille mots." Pictorial representation


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

Créez deux fichiers:

$ touch blah1   
$ touch blah2

Entrez des données en 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 vers l'inode, le contenu du fichier - cela 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 est introuvable car le lien logiciel pointe vers le nom, qui a été modifié et non vers le contenu.
De même, si blah1 est supprimé, blah1-hard contient toujours le contenu; Si blah2 est supprimé, blah2-soft n'est qu'un lien vers un fichier non existant.


source: copie flagrante de StackOverflow!


293
2017-07-21 07:33



Pour être juste avec vous - vous avez ajouté la belle image en haut ... ah vous avez copié cela aussi! Combiner les deux réponses est en fait très utile :) - icc97
mieux expliqué, nulle part! - dennisbot
J'ai continué à regarder l'image pendant 20 secondes et puis, tout à coup, j'ai compris. C'est en fait génial. - Mohammed Joraid
btw: Utiliser des liens durs avec git  est une mauvaise idée, juste au cas où quelqu'un (frustré par les liens logiciels) s'interroge ... pourrait également s'appliquer à d'autres systèmes de gestion des versions. - Frank Nocke
Est-ce qu'un inode à ses liens durs, semblable à un fichier stocké dans le cloud sur n'importe quel périphérique, y accède? - Ooker


Les deux sont des pointeurs vers des fichiers; la différence est la gentil de pointeur. Un lien symbolique pointe vers un autre fichier de 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 maintenant vers le nouveau fichier. Vous pouvez facilement identifier un lien symbolique et voir le nom du fichier vers lequel il pointe.

Un lien physique pointe vers le fichier par numéro d'inode. En tant que tels, les liens matériels ne sont pas différents du prénom d'un fichier. Il n'y a pas de "vrai" nom vs nom de lien dur; Tous les liens physiques sont des noms valides pour le fichier. De ce fait, le fichier auquel vous accédez doit réellement exister et se trouver dans le même système de fichiers que celui dans lequel vous essayez de créer le lien. Si vous supprimez le nom d'origine, le lien physique pointe toujours vers le même fichier. Étant donné que tous les liens physiques sont des noms valides pour le fichier, vous ne pouvez pas en rechercher un et voir les autres noms du fichier; pour trouver ceci, vous devez regarder chaque fichier et comparer leur numéro d'inode pour trouver les autres noms qui ont le même numéro d'inode.

Vous pouvez dire combien de noms un fichier a de la sortie de ls -l. Le premier nombre après le mode fichier est le nombre de liens. Un fichier avec plus de 1 lien a un autre nom (s) quelque part, et inversement, un fichier avec un nombre de liens de seulement 1 n'a aucun (autre) lien dur.


87
2018-05-18 15:23



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 si je remplace le fichier où j'ai un lien symbolique, alors les liens contenant le nom reste intacte. Mais cela ne ferait que pointer vers le fichier remplacé lorsque son nom de fichier (c'est-à-dire le nouveau fichier qui remplaçait l'ancien) est identique à celui remplacé (c'est-à-dire l'ancien fichier remplacé par le nouveau), n'est-ce pas? - Mike
@Mike, oui: le lien symbolique pointe vers le nom du fichier d'origine, ce qui signifie que le lien pointe maintenant vers le nouveau fichier. - psusi
Mais seulement si le même nom est correct? Si le lien symbolique pointe vers la banane et que je remplace le fichier par orange, alors le lien sy ne peut plus trouver le fichier banane, c’est-à-dire qu’il ne fonctionnera pas - Mike
@Mike, le monde remplacer signifie qu'il a le même nom, sinon vous supprimez simplement un fichier et en ajoutez un autre;) - psusi


Un lien physique ne peut fonctionner que sur le même système de fichiers, c'est simplement un nom différent pour le même inode (les fichiers sont référencés en interne par les inodes). Un fichier ne sera supprimé du disque que lorsque le dernier lien vers son inode aura disparu (vous rmd ou unlinkd le dernier lien). Les liens durs ne fonctionnent généralement que pour les fichiers, pas pour les répertoires.

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


57
2018-02-29 09:20



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


Une des réponses de l'autre fil (maintenant liée depuis le haut de votre post) mentionne cette page ce que je pense 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 renvoie à 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 séparés) qui stockent un chemin de système de fichiers vers un fichier.

Le noyau et les systèmes de fichiers impliqués traduisent tout en toute transparence.

Donc basé sur ça:

  • Les liens physiques autorisent uniquement la liaison au même système de fichiers. Les liens symboliques peuvent pointer vers n'importe quel chemin.
  • Les liens durs (essentiellement) pointent vers des données absolues. Les liens symboliques peuvent pointer vers des chemins relatifs (par ex. ../parent.file)
  • Par extension, si vous déplacez le pointeur cible d'un lien matériel (ce qui, rappelez-vous, est essentiellement un simple lien vers un inode), le lien actif 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 incommensurable. Cette partie insignifiante de la vitesse se fait au prix d'un système de fichiers inflexible.

Je me suis peut-être un peu troublé mais en lisant diverses choses, j'ai du mal à trouver la différence entre un fichier standard et un lien physique. La façon dont je le lis, c'est que chaque fichier est constitué d'un lien physique (stockant le nom du fichier), lié à 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 le système de fichiers. Est-ce correct?


20
2018-05-18 15:10



Je pense que vous avez raison, chaque fichier est un chemin d'accès pour un inode, et un lien dur est un chemin d'accès supplémentaire pour le même inode. Un lien dur 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 séparés et données) qui stocke un chemin de système de fichiers vers un fichier. "Un lien symbolique a-t-il vraiment des données séparées? Alors, c'est comme une copie du répertoire auquel il est lié, non? ... et chaque fois que quelque chose est écrit être écrit deux fois sur le disque? - MiniGod
@MiniGod Non, un lien symbolique est un inode vers un bloc de données qui stocke un chemin vers un autre inode (nom de fichier). Ouais, c'est confus comme Matrix, mais une fois que vous l'aurez compris, vous n'oublierez jamais :) - Oli♦
@Oli Je peux être confus, mais quand vous dites: "y compris des inodes séparés et données ", vous voulez dire que le lien symbolique a des données séparées !? - MiniGod
@MiniGod Ouais. Le lien symbolique est un inode pointant vers des données (comme un fichier normal) et ces données sont un chemin. C'est un peu plus intelligent que cela - pour permettre une utilisation transparente via des liens symboliques - mais c'est essentiellement tout ce qu'ils sont. - Oli♦


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 / liens logiciels.

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

Quand utiliser le lien dur:

Espace de stockage: les liens durs prennent une quantité d'espace négligeable, car il n'y a pas de nouveaux inodes créés lors de la création de liens matériels. Dans les liens logiciels, nous créons un fichier qui consomme de l'espace (généralement 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. Emplacement du fichier en mouvement: Si vous déplacez le fichier source vers un autre emplacement sur le même système de fichiers, le lien physique fonctionnera toujours, mais le lien logiciel échouera.

Redondance: Si vous voulez vous assurer de la sécurité de vos données, vous devez utiliser un lien physique, comme dans le cas d'un lien physique, les données sont sécurisées jusqu'à ce que tous les liens vers les fichiers soient supprimés. les données si l'instance maître du fichier est supprimée.


15
2017-09-06 23:48



Notez qu'il existe également un lien symbolique rapide pour la taille du chemin d'accès jusqu'à 64 octets. Il prend toujours un inode, mais ne consomme pas l'espace de bloc de 4 kb. - syockit


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

Chaque fichier que vous créez est constitué de données sur le disque et d'un lien dur - 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 cela, vous pouvez voir que les données réelles ne sont jamais supprimées, seuls les liens physiques sont. 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é peuvent être récupérées, mais il est difficile de les trouver sans le lien physique.

Les liens symboliques, comme expliqué précédemment, vous disent simplement "il y a un fichier nommé <targetname> dans un dossier nommé <targetfolder>". Ils pointent vers le lien dur. Ils ne savent pas où sont les données. Le lien dur le sait.


7
2018-03-01 11:28