web-dev-qa-db-fra.com

Pourquoi un nouveau répertoire a-t-il un nombre de liens durs de 2 avant d'y ajouter quoi que ce soit?

Disons que je viens de créer le répertoire newDirectory, puis je lance la commande ls -ld. Je vois que le nombre de liens durs est 2. Qu'est-ce qui fait exactement le lien dur 2 dès le départ? Le nombre de sous-répertoires du répertoire actuel est-il également égal au nombre de liens durs - 2?

40
John

Historiquement , le premier système de fichiers Unix a créé deux entrées dans chaque répertoire: . pointant vers le répertoire lui-même, et .. pointant vers son parent. Cela a fourni un moyen facile de parcourir le système de fichiers, à la fois pour les applications et pour le système d'exploitation lui-même.

Ainsi, chaque répertoire a un nombre de liens de 2 + n où n est le nombre de sous-répertoires. Les liens sont l'entrée de ce répertoire dans son parent, le propre . entrée et .. entrée dans chaque sous-répertoire. Par exemple, supposons que ce soit le contenu du sous-arbre enraciné à /parent, tous les répertoires:

/parent
/parent/dir
/parent/dir/sub1
/parent/dir/sub2
/parent/dir/sub3

dir a alors un nombre de liens de 5: l'entrée dir dans /parent, le . entrée dans /parent/dir, et les trois .. entrées dans chacun des /parent/dir/sub1, /parent/dir/sub2 et /parent/dir/sub3. Depuis /parent/dir/sub1 n'a pas de sous-répertoire, son nombre de liens est 2 (le sub1 entrée dans /parent/dir et le . entrée dans /parent/dir/sub1).

Pour minimiser la quantité de casse spéciale pour le répertoire racine, qui n'a pas de parent "approprié", le répertoire racine contient un .. entrée pointant vers elle-même. De cette façon, il a également un nombre de liens de 2 plus le nombre de sous-répertoires, les 2 étant /. et /...

Les systèmes de fichiers ultérieurs ont eu tendance à garder une trace des répertoires parents en mémoire et n'ont généralement pas besoin de . et .. pour exister en tant qu'entrées réelles; les systèmes Unix modernes typiques traitent . et .. en tant que valeurs spéciales dans le cadre du code du système de fichiers indépendant du type de système de fichiers. Certains systèmes de fichiers incluent toujours . et .. entrées, ou faire semblant même si rien n'apparaît sur le disque.

La plupart des systèmes de fichiers signalent toujours un nombre de liens de 2 + n pour les répertoires, que . et .. des entrées existent, mais il y a des exceptions, par exemple btrfs ne le fait pas.

Il y en a un pour le répertoire lui-même et un pour . à l'intérieur.

Le nombre de sous-répertoires du répertoire actuel est-il également égal au nombre de liens durs - 2?

Cela a du sens, car chaque sous-répertoire crée un .. hardlink, et au-delà, vous ne pouvez pas créer de hardlinks vers des répertoires.1 Cependant, je ne ferais pas confiance à cela pour quoi que ce soit de grave, surtout. car il est facile de compter les sous-répertoires et d'obtenir le vrai nombre.

Si vous regardez simplement la sortie de ls pour avoir une idée du nombre de sous-marins, il vous donne une idée décente.

1 Ou du moins, vous ne pouvez pas avec ln. Je n'ai pas essayé de programmer, et man 2 link est ambigu - il n'y a pas d'erreur évidente pour la liaison à un répertoire, bien qu'il y en ait quelques-uns qui pourraient s'appliquer (EMLINK, EPERM). Donc, sauf s'il existe un standard quelque part qui dit que les seuls liens physiques possibles vers un répertoire sont . et .., encore une fois, je ne considérerais que le nombre de liens durs comme un indice occasionnel.

13
goldilocks