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.
Antworten:
Hier sind die Antworten, die für ext2 / ext3 / ext4 gelten. Ob sie für andere Dateisysteme zutreffen, hängt von ihrer Implementierung ab.
Aber du hast Glück. Wenn Sie dieselbe Anzahl von Dateien löschen, die Sie bereits gelöscht haben, bleibt die Verzeichnisgröße gleich. Nur wenn Sie weitere Dateien hinzufügen, wird diese erhöht.
quelle
Die angezeigten Blockinkremente hängen davon ab, wie das Dateisystem die Speicherung von Dateien und zugehörigen Dateiverwaltungsinformationen verwaltet. In Ihrer beschriebenen Situation scheint dies in Schritten von 4 KB zu erfolgen, sodass jeder "neue" / "eindeutige" Eintrag im Dateisystem 4 KB reserviert, unabhängig davon, ob die tatsächliche Datengröße die gesamten 4 KB ausfüllt. Wenn die zugehörigen Daten die gesamten 4K belegen, wird ein weiterer 4K-Block reserviert und nach Bedarf gefüllt, um den gesamten zugehörigen Datenstrom / die gesamte zugehörige Datensequenz zu speichern.
Abhängig von "harten" und "weichen" Löschvorgängen, die vom Dateisystem verwaltet werden, werden beim Löschen die reservierten Blöcke möglicherweise nicht sofort freigegeben (normalerweise nicht für "Wiederherstellen" -Funktionen). Einige Dateisysteme unterscheiden möglicherweise verschiedene Arten von "Löschvorgängen" und bieten entsprechende Funktionen zur Verwaltung von Speicherblöcken.
Die Vorgehensweise und Implementierung der Speicherverwaltung unterscheidet sich je nach Dateisystem. In Betriebssystemen, die mehrere / modulare Dateisysteme unterstützen, bietet das Betriebssystem normalerweise nur "Hooks" für die Integration des Dateisystems.
quelle
Hinzufügen eines ausführlichen Kommentars zur guten Antwort von user48838:
Alles ist eine Datei, einschließlich Verzeichnisse. Um all diese Dateiinformationen zu speichern, benötigen Sie Speicherplatz.
Es wäre auch gültig, beispielsweise "64B verwendet" für ein kleines Verzeichnis anzuzeigen und tatsächlich den verwendeten Speicherplatz anzuzeigen, aber wir würden sowieso mehrere 4K auf der Festplatte verwenden, daher war es eine Entwurfsentscheidung, nur das anzuzeigen Menge des genutzten Platzes.
Warum sollten Sie sich aus Sicht des FS-Designs die Mühe machen, zu berechnen, was verwendet wurde? Nicht nötig. Und dann müssten Sie Einträge verschieben, um keine Löcher zu hinterlassen… ick.
Wenn Löschungen passieren und dir Größe fällt , so dass Sie könnte einen Block freizugeben, würde alles , was Management passieren müssen , bevor könnten Sie eigentlich tun. Warum ein paar KB sparen? Wahrscheinlich müssen Sie es später trotzdem erweitern.
Links als Übung für den Leser: Überlegen Sie, warum Ihr Verzeichnis / lost + found leer erstellt wird, aber 16 KB belegt (mindestens in ext3).
quelle