Comment les répertoires sont-ils implémentés dans les systèmes de fichiers Unix?

19

Ma question est de savoir comment les répertoires sont mis en œuvre? Je peux croire une structure de données comme une variable, par exemple une table, un tableau ou similaire. Puisque UNIX est Open Source, je peux regarder dans la source ce que fait le programme lorsqu'il a créé un nouveau répertoire. Pouvez-vous me dire où chercher ou développer le sujet? Qu'un répertoire "est" un fichier que je pourrais comprendre et un répertoire est-il vraiment un fichier? Je ne suis pas sûr qu'il soit vrai que les fichiers sont stockés "dans" des fichiers alors que vous pouvez toujours dire le mot fichier à peu près n'importe quoi et je ne suis pas sûr de ce qui n'est absolument pas un fichier puisque vous pouvez appeler même une variable a fichier. Par exemple, un lien n'est certainement pas un fichier et un lien est comme un répertoire, mais cela viole le fait qu'un répertoire est un fichier?

Niklas
la source
1
Êtes-vous intéressé par un ou plusieurs systèmes de fichiers particuliers?
Ignacio Vazquez-Abrams
3
Sous UNIX, tout est un fichier (sagesse historique). Mais tous les UNIX ne sont pas Open Source. Gnu n'est pas Unix, tu sais? Open Solaris est un Open Source Unix, tandis que Linux n'est qu'un OS unixoïde. :) Et oui - systèmes de fichiers - Reiserfs? Ext2-3-4? XFS? NFS?
utilisateur inconnu
2
Un lien est également un fichier.
mattdm
5
Un lien symbolique est un fichier. Un lien dur est un bord dans le graphique du système de fichiers.
dmckee
3
Annonce: vous pourriez être intéressé par la proposition de site de développement de systèmes d'exploitation .
Gilles 'SO- arrête d'être méchant'

Réponses:

22

La structure interne des répertoires dépend du système de fichiers utilisé. Si vous voulez savoir précisément ce qui se passe, jetez un œil aux implémentations du système de fichiers.

Fondamentalement, dans la plupart des systèmes de fichiers, un répertoire est un tableau associatif entre les noms de fichiers (clés) et les numéros d'inodes (valeurs). Quelque chose comme ça¹:

1167010 .
1158721 ..
1167626 subdir
 132651 barfile
 132650 bazfile

Cette liste est codée de manière plus ou moins efficace à l'intérieur d'une chaîne de blocs (généralement) 4Ko. Notez que le contenu des fichiers normaux est stocké de manière similaire. Dans le cas des répertoires, il est inutile de savoir quelle taille est réellement utilisée à l'intérieur de ces blocs. C'est pourquoi les tailles d'annuaires rapportées par dusont des multiples de 4 Ko.

Les inodes sont là pour lier des blocs ensemble, formant une seule entité, à savoir un «fichier» au sens général. Ils sont identifiés par un numéro qui est une sorte d'adresse et chacun est généralement stocké comme un bloc spécial unique.

La gestion de tout cela se fait en mode noyau. Le logiciel demande simplement la création d'un répertoire avec une fonction nommée int mkdir(const char *pathname, mode_t mode);conduisant à un appel système, et tout le reste est effectué en arrière-plan.

À propos de la structure des liens:

Un lien dur n'est pas un fichier, c'est juste une nouvelle entrée de répertoire (c'est-à-dire une association nom - numéro d'inode ) faisant référence à une entité inode préexistante². Cela signifie que le même inode est accessible à partir de différents chemins d'accès. En particulier, puisque les métadonnées (autorisations, propriété, horodatages…) sont stockées dans l'inode, elles sont uniques et indépendantes du chemin d'accès choisi pour accéder au fichier.

Un lien symbolique est un fichier et il est distinct de sa cible. Cela signifie qu'il a son propre inode. Auparavant, il était géré comme un fichier ordinaire: le chemin cible était stocké dans un bloc de données. Mais maintenant, pour des raisons d'efficacité dans les systèmes de fichiers ext récents , les chemins de moins de 60 octets de long sont stockés dans l'inode lui-même (en utilisant les champs qui seraient normalement utilisés pour stocker les pointeurs dans les blocs de données).

-
1. cela a été obtenu en utilisant ls -ai1 testdir.
2. dont le type doit être différent de «répertoire» de nos jours.

Stéphane Gimenez
la source
Merci pour l'élaboration afin que je puisse comprendre la différence entre les répertoires et les fichiers au niveau programmatique.
Niklas
12

Pour développer le message de Stéphane Gimenez, la création d'un nouveau répertoire est le processus de création d'un nouvel inode avec la valeur st_mode de S_IFDIR (avec le mode autorisations), créant deux entrées dans le premier bloc de données du nouvel inode avec le lien ( 2) appel système: '.' qui pointe vers ce nouvel inode et '..' qui pointe vers le répertoire parent, puis en créant une entrée dans le répertoire parent avec l'inode et le nom du nouveau répertoire - la première et la dernière partie sont effectuées par l'appel système mknod ( 2). De plus, seul root peut utiliser mknod (2) de nos jours pour les tâches dont nous parlons.

Par exemple, mkdir("/home/larry.user/xyzzy", 0666)est essentiellement le suivant (c'était le code C des jours SysV [1]):

int mode = 0666;
char newdir[] = "/home/larry.user/xyzzy";
char path1[NAMESZ+4, path2[NAMESZ+4], *p;
mknod(newdir, S_IFDIR|mode);
strcpy(path1, newdir);
strcat(path1, "/."); /* "." link */
link(newdir, path1);
strcat(path1, ".");  /* ".." link */
strcpy(path2, newdir);
if ((p = strrchr(path2, '/') == (char *)0) /* root directory */
    link(".", path1);
else {
    *p = '\0';
    link(path2, path1);
}
  1. Haviland & Salama, "UNIX System Programming", 1987, pp69-71.

C'était trop sujet aux erreurs (et l'une des principales raisons de fsck), donc un appel système mkdir (2) a été créé pour pouvoir le faire pour vous.

Notez qu'un objet système de fichiers amy pourrait être créé avec mknod (2): fichier normal, répertoire, fichier de périphérique, lien symbolique, etc. Donc, pour répondre à l'une des questions de l'OP, oui, un répertoire est un fichier, ce qui signifie dire " est un objet, représenté par un inode, résidant dans un système de fichiers qui se comporte avec une interface d'E / S ".

Arcege
la source
Merci pour la réponse très intéressante. Je comprends et je pense que je peux également rechercher dans la source le programme touchqui crée un fichier vide et voir ce qu'il fait.
Niklas
2

si vous souhaitez avoir plus d'informations sur les systèmes de fichiers Unix / Linux, je vous recommande 2 livres Comprendre le noyau Linux et le développement du noyau Linux . Ce sont les meilleurs livres pour comprendre le noyau Linux.

Dans les systèmes Unix "Common File Model", chaque répertoire est considéré comme un fichier, qui contient une liste de fichiers et de répertoires.

Dans les VFS (Virtual File Systems), les répertoires sont représentés dans une structure appelée dentry. Il dentry s'agit d'une structure C avec un nom de chaîne ( d_name ), un pointeur sur un inode ( d_inode ) et un pointeur sur la dentisterie parent ( d_parent ). Un inode est une structure pour gérer les informations sur un fichier dans le système de fichiers. Par exemple, si vous avez le répertoire /tmp/test/foo, le VFS créera un objet dentry pour chaque composant du nom de chemin. Ainsi, il créera un objet dentry pour /, un deuxième objet dentry pour l' testentrée du répertoire racine et un troisième objet dentry pour l' fooentrée du répertoire test.

Dimitri
la source
Merci Dimitri. Je veux comprendre pourquoi certains projets ont choisi une structure de données particulière comme un arbre B, un arbre binaire, un trie ou un tableau associatif. Je pense qu'il est important de choisir un modèle de structure / données approprié. L'apprentissage des différentes implémentations donne les détails que je recherche.
Niklas
1

Vous pouvez commencer par lire http://www.freebsd.org/doc/en/books/design-44bsd/book.html#OVERVIEW-FILESYSTEM . Pour plus de détails, obtenez l'excellent livre classique "La conception et la mise en œuvre du système d'exploitation 4.4 BSD".

casser
la source
Merci pour le lien. Je comprends que les deux fichiers sont des répertoires sont essentiellement des tableaux qui sont interprétés comme des fichiers ou des répertoires. Veuillez me corriger si je me trompe ..
Niklas
1
Les répertoires ne sont traditionnellement que des fichiers spécialement formatés, mais ce n'est plus le cas: en.wikipedia.org/wiki/ReiserFS#Design Dans ReiserFS et quelques autres, les répertoires sont des entrées dans une base de données. Les répertoires peuvent agir comme des tableaux, mais ce n'est que l'abstraction de programmation.
Bruce Ediger
Merci beaucoup d'avoir signalé les détails. Maintenant , je pense que je comprends mieux comment les systèmes de fichiers fonctionnent encore à se demander comment et pourquoi le programme locatefait ses travaux et comment cela lié à la mise à jour du programme locate en exécutant updatedb(spec - je utiliser le démarrage PC-BSD, DragonflyBSD et Ubuntu Natty de Live CD et analyse comparative différentes installations et interfaces)
Niklas