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

38

Supposons que je crée simplement le répertoire newDirectory, puis 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ébut? Le nombre de sous-répertoires dans le répertoire actuel est-il égal au nombre de liens durs - 2?

John
la source

Réponses:

39

Historiquement , le premier système de fichiers Unix créait deux entrées dans chaque répertoire: .pointant sur le répertoire lui-même et ..sur son parent. Cela fournissait 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 correspondent à l'entrée de ce répertoire dans son parent, à la propre .entrée du répertoire et à l' ..entrée de chaque sous-répertoire. Par exemple, supposons qu'il s'agisse du contenu du sous-arbre /parentdont tous les répertoires sont enracinés :

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

Il y dira ensuite un nombre de liens de 5: l’ direntrée dans /parent, l’ .entrée dans /parent/diret les trois ..entrées dans chacune de /parent/dir/sub1, /parent/dir/sub2et /parent/dir/sub3. Étant donné qu’il /parent/dir/sub1n’ya pas de sous-répertoire, son nombre de liens est 2 (l’ sub1entrée /parent/diret l’ .entrée /parent/dir/sub1).

Pour minimiser le nombre de casse spéciale pour le répertoire racine, qui n'a pas de parent «approprié», le répertoire racine contient une ..entrée pointant sur elle-même. De cette façon, il a également un nombre de liens de 2 plus le nombre de sous-répertoires, le 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 d’exister .et ..doivent exister en tant qu’entrées réelles; Les systèmes Unix modernes typiques traitent .et ..comme des valeurs spéciales dans le code du système de fichiers indépendant du type de système de fichiers. Certains systèmes de fichiers sont encore .et ..entrées, ou font semblant de même si rien ne semble sur le disque.

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

Gilles, arrête de faire le mal
la source
4
..pointer vers le parent n'affecte pas le nombre de liens du répertoire en cours. Le nombre de 2 vient de .et le nom du répertoire (original) est répertorié. La façon dont vous le formulez est un peu ambiguë et donne l'impression .que ..les deux sont. ..devrait être utilisé uniquement pour expliquer comment le calcul fonctionne2+n
th3an0maly
@ th3an0maly Pointant sur le parent affecte le nombre de liens du parent. Je ne vois vraiment pas en quoi «l'entrée .. dans chaque sous-répertoire» est ambigu, et je ne comprends pas ce que vous entendez par «le nom du répertoire qui se répertorie».
Gilles, arrête de faire le mal '21
En fait, cette réponse: unix.stackexchange.com/a/101516/160264 est exactement ce à quoi je fais allusion. Lis-le après avoir lu ta réponse, puisque le tien était celui du haut.
Th3an0maly
@ th3an0maly Je n'ai toujours aucune idée de ce à quoi vous faites allusion. Pourriez-vous exprimer clairement, au lieu d'insinuer?
Gilles, arrête de faire le mal
La réponse de @ goldilocks est claire. Ce que je voulais dire, c'est que votre réponse pourrait ressembler davantage à la sienne. Mais alors je n'avais pas lu sa réponse quand je lisais votre réponse. La première ligne est exactement ce que mon commentaire original disait: "Il y en a un pour le répertoire lui-même et un pour l' .intérieur". Si ce n'est toujours pas clair pour vous, je suis désolé de ne pouvoir clarifier davantage. Tout ce que je pourrais faire de mieux, c'est de copier / coller sa réponse ici dans les commentaires.
mardi 3
13

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

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

Cela a du sens, étant donné que chaque sous-répertoire crée un ..lien physique, et au-delà, vous ne pouvez pas créer de liens physiques vers des répertoires. 1 Cependant, je ne ferais pas confiance à cela pour quoi que ce soit de grave, en particulier. puisqu'il est facile de compter les sous-répertoires et d'obtenir le nombre réel.

Si vous cherchez simplement à lsobtenir une idée du nombre de sous-marins à la sortie, cela vous donne une idée décente.

1 Ou du moins, vous ne pouvez pas avec ln. Je n'ai pas essayé de faire de la programmation, et man 2 linkc'est ambigu - il n'y a pas d'erreur évidente quand on se connecte à un répertoire, bien qu'un couple puisse s'appliquer ( EMLINK, EPERM). Donc, à moins qu'il y ait une norme quelque part qui indique que les seuls liens physiques possibles vers un répertoire sont .et .., encore une fois, je ne traiterais que ce nombre de liens physiques comme un indice occasionnel.

boucle d'or
la source
2
Que les liens vers les répertoires soient autorisés et que vous puissiez compter les sous-répertoires à partir du nombre de liens, dépendent du système de fichiers que vous utilisez - certains le permettent, d'autres non.
Alanc
Notez que Time Machine de macOS lie en réalité les répertoires aux sauvegardes précédentes; De cette façon, ils peuvent prétendre que chaque sauvegarde incrémentielle est une copie intégrale et supprimer n'importe laquelle des incrémentales sans affecter les autres. Il est également très fragile, je jouais avec des appels système réguliers et j’arrangeais mon système de fichiers à fond.
w00t