Unter Linux (möglicherweise in Abhängigkeit von der Blockgröße des Dateisystems) wird beim Erstellen eines Verzeichnisses stat
eine Größe von 4096 zurückgegeben. Ich kann Dateien in diesem Verzeichnis bis zu einem gewissen Punkt erstellen, ohne die wahrgenommene Größe des zu erhöhen Verzeichnis (wie von gemeldet stat
).
Irgendwann, wenn sich das Verzeichnis mit vielen Dateien füllt, steigt die Verzeichnisgröße an (ich spreche nicht über den Inhalt des Verzeichnisses, sondern über die Blöcke, die zur Darstellung des Verzeichnisses selbst verwendet werden). Wenn Dateien gelöscht werden, bleibt die Verzeichnisgröße gleich.
Hier ist ein kurzes Beispiel:
[root@uxlabtest:/]$ mkdir test
[root@uxlabtest:/]$ stat test
File: `test'
Size: 4096 Blocks: 8 IO Block: 4096 directory
Device: fd00h/64768d Inode: 1396685 Links: 2
Access: (0755/drwxr-xr-x) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2011-07-26 14:06:04.000000000 -0400
Modify: 2011-07-26 14:06:04.000000000 -0400
Change: 2011-07-26 14:06:04.000000000 -0400
Berühren Sie dann eine Reihe von Dateien:
[root@uxlabtest:/]$ for i in `seq 1 10000`; do touch /test/$i; done
[root@uxlabtest:/]$ stat test
File: `test'
Size: 155648 Blocks: 312 IO Block: 4096 directory
Device: fd00h/64768d Inode: 1396685 Links: 2
Access: (0755/drwxr-xr-x) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2011-07-26 14:06:04.000000000 -0400
Modify: 2011-07-26 14:06:56.000000000 -0400
Change: 2011-07-26 14:06:56.000000000 -0400
Dann löschen Sie die Dateien:
[root@uxlabtest:/]$ rm -rf /test/*
[root@uxlabtest:/]$ stat test
File: `test'
Size: 155648 Blocks: 312 IO Block: 4096 directory
Device: fd00h/64768d Inode: 1396685 Links: 2
Access: (0755/drwxr-xr-x) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2011-07-26 14:07:11.000000000 -0400
Modify: 2011-07-26 14:07:12.000000000 -0400
Change: 2011-07-26 14:07:12.000000000 -0400
Meine Fragen sind:
- Warum nimmt die Größe / Blockanzahl eines Verzeichnisses monoton zu?
- Ist dies eine Funktion des zugrunde liegenden Dateisystems oder des Linux VFS?
- Kann die Verzeichnisgröße jemals reduziert werden, ohne das Verzeichnis zu löschen und neu zu erstellen?
- Bonuspunkte: Zeigen Sie mir auf den Kernel-Quellcode, in dem dieses Verhalten implementiert ist.