Pourquoi la taille d'un répertoire est-elle toujours de 4096 octets sous Unix?

26

Je suis sûr qu'un fichier de répertoire contient beaucoup moins d'informations que 4096 octets. Je sais que la taille du secteur est de 4096 octets. Mais des fichiers normaux plus petits que cela existent.

Pourquoi Unix réserve-t-il 4096 octets pour chaque dossier?

Lazer
la source

Réponses:

30

C'est la taille initiale nécessaire pour stocker les métadonnées sur les fichiers contenus dans ce répertoire (y compris les noms). L'allocation initiale est égale à la taille d'un secteur, mais peut dépasser celle-ci si nécessaire. Une fois alloué, l'espace n'est pas libéré si les fichiers sont supprimés, pour réduire la fragmentation.

Par exemple:

$ mkdir testdir
$ cd testdir
$ ls -ld .
drwxr-xr-x 2 matthew matthew 4096 2007-12-03 20:28 ./
$ for ((i=0; i<1000; i++)); do touch some_longish_file_name_$i; done
$ ls -ld .
drwxr-xr-x 2 matthew matthew 36864 2007-12-03 20:29 ./
$ rm some_longish_file_name_*
$ ls -ld .
drwxr-xr-x 2 matthew matthew 36864 2007-12-03 20:29 ./
$ cd ..
$ ls -ld testdir
drwxr-xr-x 2 matthew matthew 36864 2007-12-03 20:29 testdir/
$ rmdir testdir ; mkdir testdir
$ ls -ld testdir
drwxr-xr-x 2 matthew matthew 4096 2007-12-03 20:29 testdir/

la source

harrymc
la source
3
Merci pour la partie "l'espace n'est pas libéré si les fichiers sont supprimés". J'ai restauré une sauvegarde et je ne savais pas pourquoi deux répertoires par ailleurs identiques avaient des tailles différentes.
Tomasz Zieliński
11

Parfois, 4096 octets est la plus petite unité d'allocation pour certains systèmes de fichiers. C'est pourquoi le répertoire a 4096.

La même chose s'applique aux fichiers. Même si certains fichiers peuvent signaler moins de 4096, ils prennent en fait au moins 4096 de stockage sur le disque.

Pablo Santa Cruz
la source
4
Ouaip, comme l'a dit Pablo. La taille que vous regardez avec le fichier est la taille du contenu des fichiers, pas les fichiers sur la taille du disque. La taille sur disque de ces petits fichiers est en fait de 4096, tout comme le répertoire car il ne peut allouer de l'espace disque que dans des blocs de cette taille
Dan McGrath
1
Cela n'a rien à voir avec la question.
harrymc
Ceci est une erreur. Voir la réponse acceptée.
Duncan X Simpson,
Incorrect? N'est-ce pas une combinaison des deux réponses? 4096 est la taille de la page, voir les systèmes de pagination mémoire pour plus d'informations.
Harrichael
5

4096 est réservé pour réduire la fragmentation, car souvent la taille réelle des métadonnées contenues varie en fonction du contenu du répertoire. S'il augmente et diminue constamment (disons qu'il contenait des fichiers journaux ou du contenu dynamique) au fil du temps, cela pourrait nuire aux performances. Cela ne se produirait probablement pas avec un dossier, mais sur l'ensemble du système de fichiers, il s'additionnerait rapidement.

MDMarra
la source
3

Cela dépend du système de fichiers. Sur ext2 / 3/4, il est "4096". Sur reiserfs, il peut être 9608 (my $HOME) 1032 ( /tmp) ou 48 (certains dir in /tmp).

Par défaut, le bloc ext2 / 3/4 est 4096 - et le fichier ne peut pas en prendre moins. Si le fichier est plus petit, il prend tout de même un bloc entier. Comme il est inutile de se renseigner sur la taille logique du répertoire et cette information n'est probablement pas sur le disque de toute façon et il doit rapporter quelque chose qu'il rapporte une taille de bloc multipliée par le nombre de blocs pris, c'est-à-dire l'espace physique qui a été pris.

Maciej Piechotka
la source
Je suis sûr que la taille du fichier n'est pas non plus stockée avec les fichiers. Il est calculé au besoin. Mais pour les fichiers, il indique la actualtaille du fichier.
Lazer
1
La taille du fichier est stockée avec l'inode. Pour sûr, l'inode ext2 contient la taille en octets à l'intérieur. Sinon, il serait impossible de trouver où se termine le fichier, comme \0c'est le caractère légal dans les fichiers binaires. PS. Il est possible de créer des FS qui ne les stockent pas - mais tout simplement pas en famille (et probablement aucun autre populaire).
Maciej Piechotka