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.
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 fondamentalement un lien vers un inode.
Un lien physique crée alors simplement un autre fichier avec un lien vers le même inode sous-jacent.
Lorsque vous supprimez un fichier, un lien vers l'inode sous-jacent est supprimé. 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 solide 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 ils sont simplement le nom d'un autre fichier.
Quelques intuitions intéressantes qui pourraient aider, en utilisant n’importe quelle console Linux (ish).
Créez deux fichiers:
$ touch blah1; touch blah2
Entrez quelques données dans eux:
$ echo "Cat" > blah1
$ echo "Dog" > blah2
(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 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 logiciel 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.
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 contenant son contenu, c'est-à-dire le texte "Hello, World!":
$ echo 'Hello, World!' > myfile.txt
Créez un lien physique my-hard-link
vers le fichier myfile.txt
, ce qui signifie "créez un fichier devant pointer vers le même inode que celui indiqué par myfile.txt
":
$ ln myfile.txt my-hard-link
Créez un lien symbolique my-soft-link
vers le fichier myfile.txt
, ce qui signifie "créez un fichier devant pointer vers le fichier myfile.txt
":
$ ln -s myfile.txt my-soft-link
Regardez ce qui se passera maintenant si myfile.txt
est supprimé (ou déplacé): my-hard-link
pointe toujours sur le même contenu, et n'est donc pas affecté, alors que my-soft-link
ne pointe plus rien. D'autres réponses discutent des avantages/inconvénients de chacun.
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 directement 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 qu’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 des 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 réseau (s'il s'agit d'un lien physique sur un système de fichiers NFS, le serveur NFS se chargerait de la résolution, ce qui serait invisible 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 la même fonctionnalité que les liens durs pour maintenir l’inode d’un fichier actif de sorte que même si le fichier est délié (2), l’inode reste pour permettre au processus de continuer à accéder, 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 laquelle je ne me souviens pas, 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 à tout le monde la possibilité d’examiner vos descripteurs de fichiers, mais c’est une autre histoire.
En parlant de cela, 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.
Un exemple simple est un moyen simple 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 désignera 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
Les résultats de "a", "b" et "c" seront:
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 sur le fichier "a" lui-même, si le fichier "a" est supprimé, le fichier "c" n'aura rien à pointer, il est en fait également supprimé.
Cependant, le fichier "b" pointe vers le lieu de stockage ou l'inode du fichier "a". Ainsi, si le fichier "a" est supprimé, il ne pointera plus vers l'inode, mais parce que le fichier "b" le fera, l'inode continuera à stocker le contenu appartenant à "a" jusqu'à ce qu'aucun autre lien matériel ne le pointe plus.
Soft Link:
soft ou symbolic est plus un raccourci vers le fichier original .... 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 Pathof_Target_file link
Sortie: link -> ./Target_file
Preuve: readlink link
De plus, dans la sortie de ls -l link
, vous verrez la première lettre de lrwxrwxrwx
sous la forme l qui indique que le fichier est un lien symbolique.
Suppression du lien: unlink link
Remarque: Si vous le souhaitez, votre lien symbolique peut fonctionner même après l'avoir déplacé ailleurs que dans le 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 dans file1 et cela apparaît dans le fichier 2 . Supprimer l'un conserve toujours l'autre ok.
L'inode (ou le fichier) n'est supprimé que lorsque tous les liens (durs) ou tous les chemins d'accès à l'inode (le même fichier) ont été supprimés.
Une fois qu'un lien physique a été établi, 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 Hard Link : ln Target_file link
Sortie: Un fichier avec un lien de nom sera créé avec le même numéro d'inode que celui de Targetfile.
Preuve: ls -i link Target_file
(vérifiez leurs inodes)
Suppression du lien: rm -f link
(Supprime le lien comme un fichier normal)
Remarque : Les liens symboliques peuvent s'étendre sur les 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. Des liens durs sont manquants:
vous savez immédiatement où un lien symbolique pointe vers un lien dur , vous devez explorer l'ensemble du système de fichiers pour rechercher des fichiers partageant 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 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 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 "original" utilisé pour référencer un fichier.
Je vous indiquerais Wikipédia:
Quelques points:
Les liens physiques sont très utiles lors de sauvegardes incrémentielles. Voir rsnapshot , par exemple. L'idée est de faire une copie en utilisant des liens physiques:
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: quand les liens physiques sont-ils utiles ou nécessaires? La seule application qui me vienne à l’esprit, dans laquelle les liens symboliques ne feraient pas le travail, fournit une copie d’un fichier système dans un environnement chrooté.
Également:
Ce que vous considérez comme un "fichier" ordinaire est en réalité constitué de deux éléments distincts: 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 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 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é.
Un lien symbolique est un objet du système de fichiers qui pointe vers un autre objet du système de fichiers. L'objet désigné 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 peut en tirer parti 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 implémenté 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é
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"
Un lien dur est la représentation du système de fichiers d'un fichier par lequel plus d'un chemin référence 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 des liens physiques dans n’importe quel ordre, quel que soit leur ordre de création. De plus, les liens physiques ne peuvent pas être créés lorsque
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 montrent la différence fondamentale entre les deux.
Commande pour créer une jonction dans des fenêtres, accédez à l'emplacement où le lien doit être créé, puis entrez:
mklink /J link_name target_path
Une entrée de répertoire est link a structrue:
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 peut-être comme:
struct inode{
link_t nlink;
...
}
par exemple, vous créez un fichier/1, l'entrée de 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 */
...
}
puis vous créez un lien physique (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 */
...
}
ensuite, vous créez un lien symbolique (peut être/200) dans le fichier 1, l’entrée du 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 */
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é copier tout le contenu de 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 ultérieurement supprimé, le lien symbolique continue de pointer vers le même nom de fichier même si le nom ne nomme plus aucun fichier.
En ajoutant à toutes les réponses ci-dessus, la différence dans la recherche des fichiers de liens physiques et physiques peut être comprise comme suit:
J'ai un fichier f6
dans mon répertoire actuel, ainsi qu'un répertoire nommé t2
.
Les fichiers nommés f1
et ./t2/f2
sont des liens symboliques vers f6
.
Les fichiers nommés f7
et ./t2/f8
sont des liens physiques de 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
Comme 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 -L
utilisée (avec l'option -xdev
) dans le même système de fichiers/point de montage. Il enregistre la recherche inutile dans différents points de montage.
Donc, rechercher le lien dur est un peu plus rapide que de chercher les liens symboliques (veuillez rectifier si je me trompe ou si je ne comprends pas bien).
Les liens symboliques donnent à un fichier un autre nom, similaire aux liens physiques. Mais un fichier peut être supprimé même s'il reste des liens symboliques.
Mes deux centimes d'utilisation:
Les liens logiciels peuvent être utilisés pour raccourcir les noms de chemins longs, à savoir:
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.
Des liens 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
Une copie instantanée dans un dossier différent, et le fichier original (sur /myapp/dev
) peut être déplacé ou supprimé, sans toucher le fichier sur /myapp/prd
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. Puisque tous les liens durs ont le même numéro inoden (qui accède désormais 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 porte un nom de fichier et un numéro d'inode. Comme indiqué ci-dessus, le numéro d'inode est un inode qui pointe sur data.Maintenant, ce qui rend un lien symbolique spécial les numéros 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 est celui des 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, 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 en mémoire
Je viens de trouver un moyen facile de comprendre les liens physiques dans un scénario courant, l’installation de logiciels.
Un jour, j'ai téléchargé un logiciel dans le dossier Downloads
pour l'installation. Après que j'ai fait Sudo make install
, certains exécutables ont été cp
ed dans le dossier bin local. Ici, cp
créelien dur. J'étais satisfait du logiciel mais j'ai vite compris que Downloads
n'était pas un bon endroit à long terme. J'ai donc mv
ed le dossier du logiciel dans le répertoire source
. Eh bien, je peux toujours exécuter le logiciel comme avant sans me soucier de quelque chose de lien cible, comme dans Windows. Cela signifie quehard linktrouve directement l'inode et les autres fichiers.