Ceci est juste une mauvaise idée, car il n'y a aucun moyen de faire la différence entre un lien dur et un nom original.
Autoriser des liens physiques vers des répertoires briserait la structure de graphes 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
toute autre arborescence de fichiers sujette aux erreurs.
Tout d’abord, pour comprendre cela, parlons d’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 étant LE fichier. Les inodes manquent cependant de noms de fichiers. C'est là que les liens entrent en jeu.
Un lien est juste un pointeur sur un inode. Un répertoire est un inode qui contient des liens. Chaque nom de fichier dans un répertoire est simplement un lien vers un inode. Ouvrir 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 simplement une entrée de répertoire supplémentaire pointant vers cet inode. Lorsque vous ls -l
, le nombre après les autorisations est le nombre de liens nommés. La plupart des fichiers normaux auront un lien. Créer un nouveau lien physique vers un fichier fera que les deux noms de fichiers pointent sur 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 voir clairement qu’il n’existe pas de lien dur. Un lien dur est identique à un nom ordinaire. 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 dire (même par horodatage) car les deux noms désignent 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
drapeau à ls
vous montre les numéros d’inode au début de la ligne. Notez comment test
et test2
avoir le même numéro d’inode, mais test3
un numéro différent.
Maintenant, si vous étiez autorisé à le faire pour les répertoires, deux répertoires différents situés à des endroits différents 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 ainsi une boucle.
Pourquoi cette boucle est-elle une préoccupation? Parce que lorsque vous traversez, il n’ya aucun moyen de détecter que vous êtes en boucle (sans garder trace des numéros d’inodes pendant que vous traversez). Imaginez que vous écrivez la du
commande, qui doit être recurse à travers des sous-répertoires pour en savoir plus sur l'utilisation du disque. Comment pourrait du
savoir quand il a frappé une boucle? Il y a beaucoup d'erreurs dans la comptabilité et beaucoup de comptabilité du
à faire, rien que pour réussir cette tâche simple.
Les liens symboliques sont une toute autre bête, en ce qu'ils constituent un type de "fichier" spécial que de nombreuses API de système de fichiers ont tendance à suivre automatiquement. Notez qu'un lien symbolique peut pointer vers une destination inexistante, car ils pointent par nom et non directement sur un inode. Ce concept n'a pas de sens avec les liens durs, car la simple existence d'un "lien dur" signifie que le fichier existe.
Alors, pourquoi peut du
traiter avec des liens symboliques facilement et non des liens durs? Nous avons pu voir ci-dessus que les liens physiques sont impossibles à distinguer des entrées de répertoire normales. Les liens symboliques, cependant, sont spéciaux, détectables et sautables!
du
remarque que le lien symbolique est un lien symbolique et le saute 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 test2@ -> test1
% du -ah
242M ./test1/bigfile
242M ./test1
4.0K ./test2
242M .
..
pointer? Surtout après avoir supprimé le lien physique vers ce répertoire, dans le répertoire désigné par..
? Il doit pointer quelque part.