GNU/Linux >> Tutoriels Linux >  >> Linux

Pourquoi les liens physiques vers les répertoires ne sont-ils pas autorisés sous Unix/linux ?

J'ai lu dans des manuels qu'Unix/Linux n'autorise pas les liens physiques vers les répertoires, mais autorise les liens symboliques. Est-ce parce que, lorsque nous avons des cycles et si nous créons des liens physiques, et après un certain temps, nous supprimons le fichier d'origine, il pointera vers une valeur inutile ?

Si les cycles étaient la seule raison de ne pas autoriser les liens physiques, alors pourquoi les liens souples vers les répertoires sont-ils autorisés ?

Réponse acceptée :

C'est juste une mauvaise idée, car il n'y a aucun moyen de faire la différence entre un lien physique et un nom d'origine.

Autoriser les liens physiques vers les répertoires briserait la structure graphique acyclique dirigée du système de fichiers, créant éventuellement des boucles de répertoires et des sous-arborescences de répertoires pendantes, ce qui rendrait fsck et tout autre promeneur d'arborescence de fichiers sujet aux erreurs.

Tout d'abord, pour comprendre cela, parlons des inodes. Les données du système de fichiers sont conservées dans des blocs sur le disque, et ces blocs sont rassemblés par un inode. Vous pouvez considérer l'inode comme LE fichier.
Cependant, les inodes manquent de noms de fichiers. C'est là que les liens entrent en jeu.

Un lien n'est qu'un pointeur vers un inode. Un répertoire est un inode qui contient des liens. Chaque nom de fichier dans un répertoire n'est qu'un lien vers un inode. L'ouverture d'un fichier sous Unix crée également un lien, mais il s'agit d'un type de lien différent (ce n'est pas un lien nommé).

Un lien physique est juste une entrée de répertoire supplémentaire pointant vers cet inode. Lorsque vous ls -l , le nombre après les autorisations correspond au nombre de liens nommés. La plupart des fichiers réguliers auront un lien. La création d'un nouveau lien physique vers un fichier fera pointer les deux noms de fichiers vers le même inode. Remarque :

% ls -l test
ls: test: No such file or directory
% touch test
% ls -l test
-rw-r--r--  1 danny  staff  0 Oct 13 17:58 test
% ln test test2
% ls -l test*
-rw-r--r--  2 danny  staff  0 Oct 13 17:58 test
-rw-r--r--  2 danny  staff  0 Oct 13 17:58 test2
% touch test3
% ls -l test*
-rw-r--r--  2 danny  staff  0 Oct 13 17:58 test
-rw-r--r--  2 danny  staff  0 Oct 13 17:58 test2
-rw-r--r--  1 danny  staff  0 Oct 13 17:59 test3
            ^
            ^ this is the link count

Maintenant, vous pouvez clairement voir qu'il n'existe pas de lien physique. Un lien physique est identique à un nom normal. Dans l'exemple ci-dessus, test ou test2 , quel est le fichier d'origine et quel est le lien physique ? À la fin, vous ne pouvez pas vraiment le dire (même par des horodatages) car les deux noms pointent vers le même contenu, le même inode :

% ls -li test*  
14445750 -rw-r--r--  2 danny  staff  0 Oct 13 17:58 test
14445750 -rw-r--r--  2 danny  staff  0 Oct 13 17:58 test2
14445892 -rw-r--r--  1 danny  staff  0 Oct 13 17:59 test3

Le -i indicateur à ls vous montre les numéros d'inode au début de la ligne. Notez comment test et test2 ont le même numéro d'inode,
mais test3 en a un autre.

En relation :Trouver des fichiers pour lesquels plusieurs variantes de ce nom de fichier existent ensemble dans le même répertoire ?

Maintenant, si vous étiez autorisé à le faire pour les répertoires, deux répertoires différents à différents points du système de fichiers pourraient pointer vers la même chose. En fait, un sous-répertoire pourrait pointer vers son grand-parent, créant une boucle.

Pourquoi cette boucle est-elle préoccupante ? Parce que lorsque vous traversez, il n'y a aucun moyen de détecter que vous faites une boucle (sans garder une trace des numéros d'inode pendant que vous traversez). Imaginez que vous écrivez le du commande, qui doit parcourir les sous-répertoires pour connaître l'utilisation du disque. Comment du savoir quand il a frappé une boucle? Il est sujet aux erreurs et à beaucoup de comptabilité que du aurait à faire, juste pour réussir cette tâche simple.

Les liens symboliques sont une toute autre bête, en ce sens qu'ils sont un type spécial de "fichier" que de nombreuses API de système de fichiers de fichiers ont tendance à suivre automatiquement. Notez qu'un lien symbolique peut pointer vers une destination inexistante, car il pointe par son nom et non directement vers un inode. Ce concept n'a pas de sens avec les liens physiques, car la simple existence d'un "lien physique" signifie que le fichier existe.

Alors pourquoi du gérer facilement les liens symboliques et non les liens physiques ? Nous avons pu voir ci-dessus que les liens physiques sont indiscernables des entrées de répertoire normales. Les liens symboliques, cependant, sont spéciaux, détectables et désactivables ! du remarque que le lien symbolique est un lien symbolique et l'ignore complètement !

% ls -l 
total 4
drwxr-xr-x  3 danny  staff  102 Oct 13 18:14 test1/
lrwxr-xr-x  1 danny  staff    5 Oct 13 18:13 [email protected] -> test1
% du -ah
242M    ./test1/bigfile
242M    ./test1
4.0K    ./test2
242M    .

Linux
  1. Comment créer des liens matériels et symboliques sous Linux

  2. Comment créer des liens souples et physiques sous Linux

  3. Pourquoi ne vois-je pas MSG_EOR pour SOCK_SEQPACKET sous Linux ?

  4. Pourquoi les Makefiles sous Linux sont-ils si utiles ?

  5. Noms de fichiers Linux/Windows/Unix/... :Quels caractères sont autorisés ? Quels sont les non échappés ?

Commande Ln :comment créer des liens symboliques sous Linux

Commande Ln sous Linux (Créer des liens symboliques)

Guide pour ajouter des liens symboliques Linux

La commande ln sous Linux :créer des liens logiciels et matériels

Soft Links sous Linux - La référence complète

Différence entre les liens symboliques et les liens physiques sous Linux