Salut,
J'ai un truc bizarre : soit tout le monde se gourre, soit moi :
j'hésite beaucoup :)
ext4 est construit autour d'un arbre d'extension (extent tree) pour
construire les blocs. En récupérant l'ancien volume de ext2 (puis 3),
soit 60 octets (autrefois destiné à de pures listes chaînées), il est
possible de construire un arbre avec un en-tête et 4 feuilles de 12
octets chacun. Les feuilles sont définies pour avoir 32536=2^15 blocs
possibles d'affilée, ce qui fait des feuilles à 128 Mo max pour un
bloc de 4 ko.
Jusque là, ça va.
Si vous voulez construire un fichier plus gros, il faut construire un
arbre, donc ajouter des nœuds (au sens de l'arbre, pas des i-nœuds).
L'idée est de substituer une feuille par un index (de la même taille,
du coup on gâche même 16 bits, mais c'est pour la bonne cause) qui va
pointer sur un nouveau bloc de 60 octets... défini par un en-tête et 4
feuilles... ou autant d'index. L'index pointe en réalité sur la
feuille suivante de façon à ce que le fichier soit construit
linéairement (sur le principe de la liste chaînée).
Jusque là, ça va encore.
Le noyau - enfin ext4 - limite la profondeur de l'arbre à 6 (0 est le
premier cas - 4 feuilles et puis c'est tout - et 5 le nombre maximal
possible, défini dans l'en-tête). Techniquement, si vous déployez un
arbre complet pour avoir le nombre max de feuilles, vous avez 4
feuilles par index à la dernière profondeur, c'est-à-dire 4^6, soit
4096 feuilles.
Si je prends la taille max (en 32 bits) à 4 ko le bloc, cela fait 4096
x 128 Mo, soit 512 Go.
Là, ça bloque, car il est écrit partout (y compris dans les
transparents de Ted Tso himself) que la taille max d'un fichier de
ext4 vaut 16 To. Il me manque donc un facteur 32, ce qui n'est pas
rien. Même en passant à des blocs de 64 ko en 64 bits, il me manque
toujours un facteur 2.
J'aurai tendance à croire que les concepteurs de ext4 ont raison et moi tort :)
Où ai-je fait une erreur ?
Merci de vos lumières,
PK
--
|\ _,,,---,,_ Patrice KARATCHENTZEFF
ZZZzz /,`.-'`' -. ;-;;,_ mailto:patrice.karatchentzeff@gmail.com
|,4- ) )-,_. ,\ ( `'-'
'---''(_/--' `-'\_)