Warum ist die Größe eines Verzeichnisses in Unix immer 4096 Bytes?

26

Ich bin sicher, dass eine Verzeichnisdatei viel weniger Informationen als 4096 Bytes hat. Ich weiß, dass die Sektorgröße 4096 Bytes ist. Aber es gibt normale Dateien, die kleiner sind.

Warum reserviert Unix 4096 Bytes für jeden Ordner?

Laser
quelle

Antworten:

30

Dies ist die Anfangsgröße, die erforderlich ist, um die Metadaten zu den in diesem Verzeichnis enthaltenen Dateien (einschließlich Namen) zu speichern. Die anfängliche Zuordnung entspricht der Größe eines Sektors, kann jedoch bei Bedarf darüber hinausgehen. Einmal zugewiesen, wird Speicherplatz nicht freigegeben, wenn Dateien entfernt werden, um die Fragmentierung zu verringern.

Beispielsweise:

$ 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/

Quelle

Harrymc
quelle
3
Vielen Dank für den Teil "Speicherplatz wird nicht freigegeben, wenn Dateien entfernt werden". Ich habe ein Backup wiederhergestellt und war mir nicht sicher, warum zwei ansonsten identische Verzeichnisse unterschiedliche Größen hatten.
Tomasz Zieliński
11

Manchmal sind 4096 Byte die kleinste Zuordnungseinheit für einige Dateisysteme. Deshalb hat das Verzeichnis 4096.

Gleiches gilt für Dateien. Obwohl einige Dateien weniger als 4096 melden, beanspruchen sie tatsächlich mindestens 4096 Speicherplatz von der Festplatte.

Pablo Santa Cruz
quelle
4
Ja, wie Pablo sagte. Die Größe, die Sie mit der Datei betrachten, ist die Größe des Dateiinhalts, nicht die Größe der Dateien auf der Festplatte. Die Größe dieser kleinen Dateien auf der Festplatte beträgt tatsächlich 4096, genau wie im Verzeichnis, da nur in Blöcken dieser Größe Speicherplatz zugewiesen werden kann
Dan McGrath,
1
Das hat nichts mit der Frage zu tun.
Harrymc
Das ist falsch. Siehe die akzeptierte Antwort.
Duncan X Simpson
Falsch? Ist es nicht eine Kombination beider Antworten? 4096 ist die Größe einer Seite. Weitere Informationen finden Sie unter Speichersuchsysteme.
Harrichael
5

4096 ist reserviert, um die Fragmentierung zu reduzieren, da die tatsächliche Größe der enthaltenen Metadaten häufig abhängig vom Verzeichnisinhalt schwankt. Wenn es im Laufe der Zeit ständig wächst und schrumpft (z. B. wenn es Protokolldateien oder dynamische Inhalte enthält), kann dies die Leistung beeinträchtigen. Dies würde wahrscheinlich nicht mit einem Ordner passieren, aber im gesamten Dateisystem würde es sich schnell summieren.

MDMarra
quelle
3

Das hängt vom Dateisystem ab. Auf ext2 / 3/4 ist es "4096". Auf reiserfs kann es 9608 (my $HOME) 1032 ( /tmp) oder 48 (einige dir in /tmp) sein.

Standardmäßig hat der ext2 / 3/4-Block den Wert 4096 - und die Datei kann nicht weniger benötigen. Wenn die Datei kleiner ist, dauert es trotzdem einen ganzen Block. Da es sinnlos ist, nach der logischen Größe des Verzeichnisses zu fragen und diese Informationen wahrscheinlich sowieso nicht auf der Festplatte gespeichert sind und etwas melden müssen, das die Blockgröße multipliziert mit der Anzahl der belegten Blöcke, dh dem belegten physischen Speicherplatz, angibt.

Maciej Piechotka
quelle
Ich bin sicher, dass die Dateigröße auch nicht mit den Dateien gespeichert wird. Sie wird bei Bedarf berechnet. Bei Dateien wird jedoch die actualDateigröße angegeben.
Lazer
1
Dateigröße wird mit der Inode gespeichert. Sicher enthält ext2 inode die Größe in Bytes. Andernfalls wäre es unmöglich zu finden, wo die Datei endet, da dies \0in Binärdateien ein zulässiger Charakter ist. PS. Es ist möglich, FS zu erstellen, die es nicht speichern - aber nicht ext family (und wahrscheinlich keine andere beliebte).
Maciej Piechotka