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

37

Un lien physique est défini comme un pointeur sur un inode. Un lien symbolique , également appelé lien symbolique , est défini comme un fichier indépendant pointant vers un autre lien sans les restrictions des liens physiques.

Quelle est la différence entre un fichier et un lien physique? Un lien physique pointe vers un inode, alors qu'est-ce qu'un fichier? L'entrée d'inode elle-même? Ou un inode avec un lien dur?

Disons que je crée un fichier tactile. Ensuite, une entrée inode est créée dans la table inode . Et je crée un lien dur, qui a le même numéro d'inode que le fichier. Alors, ai-je créé un nouveau fichier? Ou le fichier vient-il d'être défini comme un inode?

Levent Divilioglu
la source
Ceci est presque certainement un double de unix.stackexchange.com/questions/9575/...
infixé
7
@infixed Pas exactement, je demande la différence entre un fichier et un lien physique.
Levent Divilioglu
J'ai donc effacé ma réponse initiale qui, je crois, était également couverte dans les réponses à cette question liée. Alors, est-ce toujours «pas exactement»?
infixée le
7
La différence entre un fichier et un lien dur est la même que la différence entre vous et la ligne portant votre nom dans le répertoire.
Jörg W Mittag
2
Ceci est une copie de unix.stackexchange.com/questions/234402/…
seumasmac

Réponses:

61

La réponse très courte est:

  • un fichier est un blob anonyme de données
  • un lien dur est un nom pour un fichier
  • un lien symbolique est un fichier spécial dont le contenu est un chemin

Les fichiers et répertoires Unix fonctionnent exactement comme des fichiers et des répertoires dans le monde réel (et non comme des dossiers dans le monde réel); Les systèmes de fichiers Unix sont structurés (conceptuellement) comme suit:

  • un fichier est un blob anonyme de données; il n'a pas de nom, seulement un nombre (inode)
  • un répertoire est un type spécial de fichier qui contient un mappage de noms de fichiers (plus précisément d'inodes); puisqu'un répertoire est juste un fichier, les répertoires peuvent avoir des entrées pour les répertoires, c'est ainsi que la récursivité est implémentée (notez que lorsque les systèmes de fichiers Unix ont été introduits, cela n'était pas du tout évident, beaucoup de systèmes d'exploitation n'autorisaient pas les répertoires à contenir des répertoires puis)
  • ces entrées de répertoire sont appelées liens durs
  • un lien symbolique est un autre type de fichier spécial dont le contenu est un chemin; ce chemin est interprété comme le nom d'un autre fichier
  • les autres types de fichiers spéciaux sont: sockets, fifos, périphériques bloc, périphériques de caractère

Garder cette métaphore à l'esprit et garder à l'esprit que les répertoires Unix fonctionnent comme des répertoires du monde réel et non comme des dossiers du monde réel explique nombre des «bizarreries» que rencontrent souvent les nouveaux arrivants, telles que: pourquoi puis-je supprimer un fichier que je ne possède pas? t avoir un accès en écriture à? Tout d'abord, vous ne supprimez pas le fichier, vous supprimez l'un des nombreux noms possibles pour le fichier et, pour ce faire, vous avez uniquement besoin d'un accès en écriture au répertoire, pas au fichier. Juste comme dans le monde réel.

Ou, pourquoi puis-je avoir des liens symboliques? Eh bien, le lien symbolique contient simplement un chemin d'accès. Rien n'indique qu'il doit exister un fichier portant ce nom.

Ma question est simplement quelle est la différence entre un fichier et un lien physique?

La différence entre un fichier et un lien physique est identique à la différence entre vous et la ligne portant votre nom dans le répertoire.

Le lien physique pointe vers un inode, alors qu'est-ce qu'un fichier? L'entrée d'inode elle-même? Ou un Inode avec un lien dur?

Un fichier est une donnée anonyme. C'est ça. Un fichier n'est pas un inode, un fichier a un inode, tout comme vous n'êtes pas un numéro de sécurité sociale, vous avez un SSN.

Un lien physique est un nom pour un fichier. Un fichier peut avoir plusieurs noms.

Supposons que je crée un fichier tactile, puis une entrée Inode est créée dans la table Inode .

Oui.

Et je crée un lien dur, qui a le même numéro Inode avec le fichier.

Non, un lien physique n'a pas de numéro d'inode, puisqu'il ne s'agit pas d'un fichier. Seuls les fichiers ont des numéros d'inode.

Le lien physique associe un nom à un numéro d'inode.

Alors, ai-je créé un nouveau fichier?

Oui.

Ou le fichier est juste défini comme un Inode?

Non, le fichier a un inode, ce n'est pas un inode.

Jörg W Mittag
la source
15
Je n'avais jamais vraiment compris (ou correctement réfléchi) quelle métaphore était derrière le mot "répertoire". L'annuaire téléphonique est un bon exemple. peut-être devriez-vous le présenter plus tôt (lorsque vous mentionnez pour la première fois le monde réel). De même, la plupart des gens traitent rarement de "fichiers" en dehors d'un ordinateur, il serait donc peut-être plus clair de dire "comme des fichiers papier et un répertoire comme un annuaire téléphonique".
IMSoP
2
@IMSoP C'est un fossé générationnel. Avant les ordinateurs, un annuaire téléphonique faisait partie des répertoires. Le dictionnaire Cambridge dit: " répertoire: un livre qui donne une liste de noms, adresses ou autres faits [... exemple] Recherchez leur numéro dans l'annuaire téléphonique. "
kubanczyk 22/02/2017
2
@kubanczyk En effet - pour les personnes qui travaillaient dans des bureaux pré-numériques, je suppose que les métaphores semblent si évidentes qu'il est presque condescendant de les expliquer. Mais pour ceux de ma génération et des générations inférieures, il est aussi obscur que de comprendre pourquoi la zone de stockage à l'arrière d'une voiture s'appelle un «coffre» ou un «coffre». Vous devez donc le préciser.
IMSoP
Le mot "ont" dans la phrase "Un lien physique n'a pas de numéro d'inode" est peut-être trompeur, car vous dites alors que "Le lien physique associe un nom à un numéro d'inode". La structure de données de l'entrée de répertoire "hardlink" contient en fait l'inode # - c'est ainsi que le lien est "associé" à l'inode #. Par "n'a pas", je pense que vous voulez dire que le lien physique n'a pas d'inode # qui indique où le lien est stocké sur le disque.
Kelvin
2
Dire qu'un fichier a un inode est un peu en arrière. L'inode est la structure qui contient les informations sur l'emplacement du "blob de données". S'il n'y a pas d'inode, il n'y a pas de fichier.
Barmar
18

Un lien physique est une entrée de répertoire. Un fichier peut avoir plusieurs entrées de répertoire, s'il est présent sous des noms différents ou dans des répertoires différents. Une entrée de répertoire est appelée «lien physique» lorsqu'elle est mise en relation avec d'autres entrées de répertoire pour le même fichier.

L'inode contient les métadonnées du fichier autres que son nom et son contenu (emplacement du contenu, autorisations, horodatages, etc.). Il y a un inode par fichier. (Tous les systèmes de fichiers ne placent pas les métadonnées dans un espace clairement identifiable sur le disque que l'on pourrait appeler «inode», mais il s'agit d'une architecture commune.) Une entrée de répertoire associe un nom à un inode. Il est possible que plusieurs entrées de répertoire soient liées au même inode, d'où le terme «lien». Un tel lien est appelé «lien dur» par opposition aux «liens symboliques» ou «liens symboliques» qui ne disent pas «pour ce nom, utilisez cet inode» mais «pour ce nom, recherchez cet autre nom».

Considérez les fichiers comme des pièces et les entrées de répertoire comme des portes. "Ouvrir le fichier /foo/bar" signifie "aller dans le couloir /fooet aller dans la chambre bar". «Go to room bar» signifie en réalité «ouvrez la porte baret entrez», mais «go to room bar» est une façon banale de dire la même chose plus rapidement. Il est possible d'avoir plusieurs portes menant à la même pièce.

Lorsque vous créez un lien physique vers un fichier existant ( ln existing new), vous créez un deuxième lien vers le même fichier, c.-à-d. Que vous créez une nouvelle entrée de répertoire qui renvoie au fichier existant. Après la création, les deux entrées de répertoire ont le même statut: il n'y a pas une «primaire» et une «secondaire», ce sont juste les deux liens vers le même fichier.

Vous pouvez également supprimer tous les liens vers un fichier sans supprimer le fichier lui-même. Cela se produit si vous supprimez un fichier (c'est-à-dire que vous supprimez toutes les entrées de son répertoire) alors qu'un programme a toujours le fichier ouvert. Le fichier reste sur le système de fichiers, il n'est réellement supprimé que lorsque le dernier processus l'ouvrant a été fermé. Dans la métaphore chambres et portes, une pièce sans porte prend encore de la place.

Gilles, arrête de faire le mal
la source
Quand les liens physiques et physiques ont-ils été introduits pour la première fois?
n611x007
2
@ n611x007: Pourriez-vous s'il vous plaît ouvrir une nouvelle question si vous avez une nouvelle question ou une question de suivi? La section de commentaires ne convient pas aux nouvelles questions ou aux discussions prolongées. Merci.
David Foerster le
1
@ n611x007 Les liens durs sont plus anciens qu'Unix, ils étaient v1 . Les liens symboliques sous Unix sont un peu plus récents. Wikipedia a de l'histoire.
Gilles 'SO- arrête d'être méchant'
Les chambres et les portes est une excellente analogie! Les liens symboliques sont alors comme des signes aux portes.
curieuxdannii
1
@curiousdannii: Les liens symboliques ressemblent davantage à des chambres avec une personne assise qui dit "oi m8 bureau erroné va à # 234 à la place"
Courses de légèreté avec Monica
8

En plus de toutes les autres réponses, je tiens à souligner les propriétés importantes suivantes:

Un lien symbolique est une véritable référence, c’est-à-dire qu’il s’agit d’un petit fichier contenant un chemin. La résolution d'un lien symbolique se produit de manière transparente pour l'application: si un processus ouvre un fichier, par exemple /this/path/hereun lien symbolique pointant vers, /that/other/pathle traitement complet de l'ouverture /that/other/pathest effectué par le système d'exploitation. De plus, s’il /that/other/paths’agit d’un lien symbolique lui-même, le système d’exploitation le gère également. En fait, le système d’exploitation suit la chaîne de liens symboliques jusqu’à ce qu’il trouve autre chose (par exemple un fichier normal) ou jusqu’à atteindre SYMLOOP_MAX(voir sysconf(3)) de nombreuses entrées, auquel cas le système d’exploitation (plus précisément: l’appel système correspondant) renvoie une erreur et définit errnoà ELOOP. Ainsi, une référence circulaire comme xyz -> xyzne bloquera pas le processus. (Pour les systèmes Linux, voir path_resolution(7)les détails complets.)

Notez qu'un processus peut vérifier si un nom de chemin est un lien symbolique ou non via l'utilisation de lstat(2)et peut modifier ses attributs de fichier (stockés dans la table inode) via lchown(2)et d'autres (voir symlink(7)l'histoire complète).

Maintenant, en termes de permission, vous remarquerez que les liens symboliques ont toujours les permissions 777 ( rwxrwxrwxen notation symbolique). Ceci est dû au fait que toute autre autorisation peut être contournée en accédant au fichier réel, de toute façon. Inversement, 777 pour un lien symbolique ne rend pas le fichier lié symboliquement accessible s'il n'était pas accessible au départ. Par exemple, un lien symbolique avec des autorisations 777 pointant vers un fichier avec des autorisations 640 ne rend pas le fichier accessible à "autre" (le grand public). En d'autres termes, un fichier xyzest accessible via un lien symbolique si et seulement si il est directement accessible, c'est-à-dire sans indirection. Ainsi, les autorisations du lien symbolique n'ont aucun effet sur la sécurité.

L'une des principales différences visibles entre les liens durs et les liens symboliques (ou liens symboliques) est que les liens symboliques fonctionnent sur les systèmes de fichiers alors que les liens durs sont limités à un système de fichiers. C'est-à-dire qu'un fichier sur la partition A peut être lié de manière symétrique à partir de la partition B, mais il ne peut pas être lié durement à partir de là. Cela ressort clairement du fait qu’un lien dur est en réalité une entrée dans un répertoire, qui consiste en un nom de fichier et un numéro d’inode, et que les numéros d’inode ne sont uniques que par système de fichiers.

Le terme liaison physique est en réalité quelque peu trompeur. Alors que pour les liens symboliques, la source et la destination sont clairement distinguables (le lien symbolique a sa propre entrée dans la table inode), ce n'est pas le cas pour les liens durs. Si vous créez un lien dur pour un fichier, l'entrée d'origine et le lien dur ne peuvent pas être distingués en termes de ce qui était là en premier. (Puisqu'ils se réfèrent au même inode, ils partagent leurs attributs de fichier tels que propriétaire, autorisations, horodatage, etc.). Ceci conduit à l'affirmation que chaque entrée de répertoire est en fait un lien physique et que lier un fichier en dur signifie simplement en créer un deuxième ( ou troisième, ou quatrième ...) hardlink. En fait, chaque inode stocke un compteur pour le nombre de liens durs vers cet inode.

Enfin, notez que les utilisateurs ordinaires ne peuvent pas créer de liens physiques. En effet, cela doit être fait avec la plus grande prudence: un utilisateur imprudent peut introduire des cycles dans l’arborescence de fichiers par ailleurs strictement hiérarchique, ce à quoi tous les outils habituels (comme fsck) et le système d’exploitation lui-même ne sont pas préparés.

contre mode
la source
6

Une réponse simple:

  • Une entrée de fichier dans un répertoire est un lien physique vers ce fichier.

  • Certains fichiers ont plusieurs liens physiques, car plusieurs liens physiques menant au même fichier sont autorisés.

Andrew Henle
la source
3

Aux débuts d'Unix, les fichiers internes étaient des inodes sur un lecteur de disque particulier. Les noms de fichiers étaient un moyen plus convivial d’y accéder.

Un lien physique assignait plus d'un nom de fichier à un inode. Vous pouvez créer un fichier, lier fermement un deuxième nom à celui-ci et supprimer le premier nom. Il était impossible de distinguer le fait que le fichier avait déjà été créé avec le deuxième nom.

En effet, l'appel système qu'un programme doit utiliser pour supprimer un fichier est "unlink (2)". Les données ne disparaissent pas tant que le nom de famille n'est pas lié à l'inode. (et l'inode n'est pas ouvert par un processus quelque part)

C'est ce qui permet à Linux de mettre à niveau des choses plus facilement tout en exécutant des programmes. Si un processus exécute un fichier exécutable et qu'une mise à jour a lieu, le nom du programme est réutilisé, mais l'inode contenant l'ancienne version existe toujours, de sorte qu'il peut continuer à s'exécuter. Et lorsque le dernier processus exécutant cette ancienne version s’arrête, le stockage de cette ancienne version est libéré.

Les liens symboliques sont apparus car, lorsque vous disposiez d'une arborescence de fichiers unitaire comportant plusieurs points de montage, vous ne pouviez pas établir de lien physique entre un disque dur et un inode sur un autre. Donc, les liens souples ont été inventés.

infixé
la source
Je suppose que cela est un double de unix.stackexchange.com/questions/9575/...
infixé
2
early dayspourquoi est-ce différent maintenant? votre réponse ne semble de toute façon pas refléter ce point de vue?
n611x007
@ n611x007 Parce que de nos jours, des choses comme Linux peuvent monter des systèmes de fichiers de type non-Unix qui ne correspondent pas au modèle inode. Comme les dérivés FAT et ISO-9660 par exemple. Il s'agit d'une écologie de système de fichiers beaucoup plus variée au lieu d'une
solution
1

Un fichier correspond aux données écrites sur le disque. Ces données sont référencées par son inode, qui contient des métadonnées sur le fichier indiquant au système quels blocs sur le disque sont utilisés par ce fichier, entre autres. Un lien physique pointe vers le numéro d'inode de ce fichier.

Donc, techniquement, vous créez un nouveau fichier, mais tout ce que ce fichier contient est le numéro d’inode du fichier qu’il référence et son nom. Il vaut mieux y voir un pointeur sur l'inode ou un pointeur sur le fichier.

utilisateur151768
la source
1

Le fichier est un concept largement utilisé sur les entrées dans un système de fichiers.

Habituellement, il comprend l' annuaire , le fichier régulier (lien dur) et le lien symbolique ( lien symbolique ). Et peut même inclure un périphérique et une prise.

Ma question est simplement quelle est la différence entre un fichier et un lien physique? Le lien physique pointe vers un inode, alors qu'est-ce qu'un fichier? L'entrée d'inode elle-même? Ou un Inode avec un lien dur?

Supposons que je crée un fichier tactile, puis une entrée Inode est créée dans la table Inode. Et je crée un lien dur, qui a le même numéro Inode avec le fichier. Alors, ai-je créé un nouveau fichier? Ou le fichier est juste défini comme un Inode?

Etant donné que même un lien symbolique est généralement compté comme un fichier, un lien dur lui-même peut également être compté comme un fichier. Vous pouvez dire que c'est un fichier, que ce soit un lien physique ou physique.

Le concept est un peu ambigu, aussi pouvez-vous dire qu'une entrée inode est un fichier, bien que vous souhaitiez peut-être vous référer aux données.

Si vous êtes un programmeur C ++ ou Java, vous voudrez peut-être vous renseigner sur std :: filesystem :: file_type , java.io.File et java.nio.file.Files .

Des détails sur les différences entre les liens physiques et les liens symboliques sont disponibles dans le lien dans le commentaire de infixed.

cshu
la source
1

La différence entre un "fichier" avec un prénom et un "lien dur" est une histoire. Un fichier (normal) portant un nom donné est créé à l'aide d'un appel système creat, un lien physique est créé à l'aide d'un appel système link.

Cependant, bien que les humains parlent et se souviennent de l'historique des entrées de répertoire et les appellent en tant que fichiers et liens physiques, le système de fichiers ne le fait pas. Les entrées de répertoire de "fichier d'origine" et de "lien physique" sont d'une qualité absolument indiscernable: toutes deux établissent une référence entre un nom de fichier et l'inode d'un fichier, et une fois que la dernière référence a disparu (les références ne sont pas simplement des noms de fichiers pour un fichier mais également des descripteurs de fichier avec lesquels un fichier ouvert est accessible), le fichier pour l’inode non référencé est considéré comme supprimé et l’inode et l’espace fichier associé sont récupérés.

Ainsi, lorsque les humains opposent "fichiers" et "liens durs", le premier a été créé avec un "nombre de liens égal à 1" et tous les autres ont été créés avec un nombre de liens plus important. La différence est académique, et renommer un fichier à la fois consistait à créer un lien physique pour le nom de la cible, puis à supprimer le lien du nom de la source. De nos jours, on utilise généralement un seul appel système qui le fait de manière atomique.

utilisateur217420
la source