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.
769
Réponses:
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.
la source
Une belle intuition qui pourrait aider, en utilisant n'importe quelle console Linux (ish).
Créez deux fichiers:
Saisissez-y des données:
(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:
Créons des liens durs et doux:
Voyons ce qui vient de se passer:
Changer le nom de foo n'a pas d'importance:
foo-hard pointe vers l'inode, le contenu, du fichier - qui n'a pas été modifié.
Le contenu du fichier est introuvable car le lien logiciel pointe vers le nom modifié et non vers le contenu.
De même, si
foo
est supprimé,foo-hard
contient toujours le contenu; sibar
est supprimé,bar-soft
n'est qu'un lien vers un fichier inexistant.la source
touch blah1; touch blah2
peut être raccourci entouch blah1 blah2
Comme dit le proverbe, une image vaut mille mots. Voici comment je le visualise:
Voici comment nous arrivons à cette image:
Créez un nom
myfile.txt
dans le système de fichiers qui pointe vers un nouvel inode (qui contient les métadonnées du fichier et pointe vers les blocs de données qui contiennent son contenu, c'est-à-dire le texte "Hello, World!":Créez un lien dur
my-hard-link
vers le fichiermyfile.txt
, ce qui signifie "créez un fichier qui doit pointer vers le même inode quimyfile.txt
pointe vers":Créez un lien logiciel
my-soft-link
vers le fichiermyfile.txt
, ce qui signifie "créer un fichier qui doit pointer vers le fichiermyfile.txt
":Regardez ce qui se passera maintenant si
myfile.txt
est supprimé (ou déplacé):my-hard-link
pointe toujours vers le même contenu, et n'est donc pas affecté, alors qu'ilmy-soft-link
pointe maintenant vers rien. D'autres réponses discutent des avantages / inconvénients de chacun.la source
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 versmyfile.txt
(par exemple/home/Documents/myfile.txt
)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.
la source
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 lals -l link
sortie, vous verrez la première lettre enlrwxrwxrwx
tant 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:
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
les liens matériels ne peuvent pas pointer vers des répertoires.
Les liens durs ont deux limitations:
la source
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":
La sortie de "a", "b" et "c" sera:
Supprimons maintenant le fichier "a" et voyons ce qui arrive à la sortie de "a", "b" et "c":
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.
la source
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.
la source
Je vous renvoie à Wikipedia:
Quelques points:
la source
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:
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é.
la source
Lien dur vs lien souple peut être facilement expliqué par cette image.
la source
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é.
la source
Depuis MSDN ,
Lien symbolique
Un exemple de lien symbolique absolu
Un exemple de liens symboliques relatifs
Lien dur
Pour créer un lien dur dans Windows, accédez à l'endroit où le lien doit être créé et entrez cette commande:
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
Jonction
NTFS prend en charge un autre type de lien appelé jonction. MSDN le définit comme suit:
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:
la source
Aussi:
la source
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.
la source
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é.
la source
Une entrée de répertoire est un lien vers une structure:
l'ino est le nombre d'inode, le nom est le nom du fichier, la structure de l'inode peut être comme :
par exemple, vous créez un fichier / 1, l'entrée du répertoire peut ressembler à:
la structure inode peut-être comme:
puis vous créez un lien dur (peut être / 100), l'entrée de répertoire peut ressembler à:
la structure inode peut-être comme:
puis vous créez un lien symbolique (peut être / 200) vers le fichier 1, l'entrée du répertoire peut être comme:
la structure inode peut-être comme:
la source
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
f6
dans mon répertoire actuel, ainsi qu'un répertoire nommét2
.Fichier nommé
f1
et./t2/f2
sont des liens symboliques versf6
.Nom du fichier
f7
et./t2/f8
liens durs def6
.Pour trouver un lien souple ou dur, nous pouvons utiliser:
Pour trouver uniquement un lien dur, nous pouvons utiliser:
É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
-L
option utilisée (avec-xdev
option) 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).
la source
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.
la source
Mes deux cents sur l'utilisation:
Des liens logiciels peuvent être utilisés pour raccourcir les noms de chemin longs, c'est-à-dire:
Les modifications apportées à
/short/file.txt
seront appliquées au fichier d'origine.Des liens physiques peuvent être utilisés pour se déplacer dans de gros fichiers:
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
la source
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
Downloads
pour l'installation. Après celasudo make install
, certains exécutables ont étécp
édités dans le dossier bin local. Ici,cp
crée un lien dur . J'étais satisfait du logiciel mais j'ai vite compris que ceDownloads
n'était pas un bon endroit à long terme. J'ai doncmv
édité le dossier du logiciel dans lesource
ré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.la source
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
la source