Monotones Wachstum der Linux-Verzeichnisgröße / Blockanzahl

8

Unter Linux (möglicherweise in Abhängigkeit von der Blockgröße des Dateisystems) wird beim Erstellen eines Verzeichnisses stateine 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.
Loopforever
quelle
Ich bin mir nicht sicher, warum dies abgelehnt wird. Dies sind legitime, klar formulierte Fragen mit Befehlen zur Replikation des Szenarios. Die Antworten auf diese Fragen würden das Wissen der Community befriedigen und wären nützlich, wenn sie irgendwo dokumentiert worden wären.
Loopforever

Antworten:

9

Hier sind die Antworten, die für ext2 / ext3 / ext4 gelten. Ob sie für andere Dateisysteme zutreffen, hängt von ihrer Implementierung ab.

  1. user48838 hat diese Frage richtig beantwortet. Mehr Dateien verbrauchen mehr Metadaten. Sie werden in 4k-Blöcken oder in einer anderen Größe zugewiesen, die zum Zeitpunkt der Erstellung des Dateisystems definiert wurde
  2. Ja, es ist eine Funktion / ein Problem des realen Dateisystems
  3. In einem ext3-Dateisystem ist dies nicht möglich. Nur durch Neuerstellung des (leeren) Verzeichnisses
  4. Der Quellcode befindet sich hier und in verwandten Dateien

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.

mailq
quelle
1
Eines: "e2fsck -fD" sollte jedes Verzeichnis in einem ext2 / 3-Dateisystem komprimieren. Dies kann tun, was das OP wünscht, obwohl ich vermute, dass es langsam ist und das Dateisystem offline sein muss. Dies dauert wahrscheinlich länger als das Verknüpfen jeder Datei in einem neuen Verzeichnis und das Löschen der alten.
Akramer
4

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.

user48838
quelle
1

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).

MikeyB
quelle