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?
19
Réponses:
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¹:
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
du
sont 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.
la source
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]):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 ".
la source
touch
qui crée un fichier vide et voir ce qu'il fait.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
. Ildentry
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'test
entrée du répertoire racine et un troisième objet dentry pour l'foo
entrée du répertoire test.la source
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".
la source
locate
fait ses travaux et comment cela lié à la mise à jour du programme locate en exécutantupdatedb
(spec - je utiliser le démarrage PC-BSD, DragonflyBSD et Ubuntu Natty de Live CD et analyse comparative différentes installations et interfaces)