Scheinbare Größe von Sparse-Dateien

Scheinbare Größe von Sparse-Dateien

Ich habe eine Sparse-Datei von 8 GB erstellt mit

dd if=/dev/zero of=/sparse-file bs=1 count=0 seek=8G

Dann habe ich

echo "test" >> /sparse-file

Ich sehe, dass es du -sh sparse-file16 K ergibt und du -sh --apparent-size sparse-file8,1 G anzeigt.

Ich dachte, wenn ich Daten in die Datei schreibe, werden die Nullen in der Sparse-Datei überschrieben, aber sie wächst tatsächlich. Warum ist das so? Wenn ich anfange, 8 GB mit echten Daten zu füllen, wird die scheinbare Größe dann 16 GB betragen?

Was genau macht "zählen" hier?

Antwort1

„Sparse“-Dateien sind Dateien mit leeren Lücken, von denen angenommen wird, dass sie mit Nullen gefüllt sind, für die diese Annahme jedoch ausreicht. Das heißt, wenn Sie die Datei lesen, erhalten Sie Nullen, aber da wir wissen, dass es Nullen sind, müssen wir nicht tatsächlich 8 GB an Nullen ausgeben. Es reicht zu sagen: „Lassen Sie uns einfach davon ausgehen, dass hier eine große Datei vorliegt, ohne tatsächlich Speicherplatz dafür zuzuweisen.“

Wenn Sie den leeren Inhalt der Datei überschreiben, werden auf der Festplatte Blöcke zugewiesen, um Platz für das zu speichern, was Sie speichern (da Sie nicht mehr davon ausgehen können, dass es sich nur um Nullen handelt). Aber wenn SieAnhängenan die Datei anhängen, überschreiben Sie nichts. Sie fügen nur mehr am Ende hinzu. Durch das Anhängen reservieren Sie also Blöcke auf der Festplatte, aber diese Blöckenimm den PlatzIhrer vorhandenen „imaginären“ Blöcke; stattdessen werden die von Ihnen erstellten Blöcke am Ende nach den imaginären Blöcken hinzugefügt.

Sie können sogar hinzufügenmehrimaginäre Blöcke mit einer ähnlichen dd -skipOperation wie bei der Erstellung der Datei. Die "imaginären" Blöcke müssen nicht alle zusammen sein. Und tatsächlich, wenn Sie vorhandene Blöcke in der Datei überschreiben,nur die Blöcke, die Sie überschreiben, werden zugewiesen, unabhängig davon, wo sie in der Datei erscheinen. Das heißt, wenn ein Block an Position 101 geschrieben wird, werden die Blöcke 1 bis 99 nicht automatisch zugewiesen und mit Nullen aufgefüllt.

Antwort2

Erstens count=0haben Sie mit nur null Blöcke von kopiert /dev/zero. Also nichts. seek=8G8 GB an Blöcken übersprungen. Ich würde das lieber mit machen count=1, aber ich schätze, Sie können es ganz weglassen.

Für den Rest einfach lesenman du. Die apparent-sizeOption gibt die scheinbare Größe und nicht die tatsächliche Festplattennutzung aus. Während der erste Befehl also meldete, dass Ihre Datei 16 KB auf der Festplatte benötigt, beträgt die scheinbare Größe 8,1 GB.

Eine Datei mit weniger als 16 KB Inhalt kann immer noch 16 KB auf der Festplatte benötigen, abhängig vom verwendeten Dateisystem. Weitere Informationen finden Sie imGNU Coreutils-Beschreibung:

Beispielsweise hätte eine Datei, die das Wort „zoo“ ohne Zeilenumbruch enthält, natürlich eine scheinbare Größe von 3. Eine so kleine Datei kann zwischen 0 und 16 KiB oder mehr Speicherplatz benötigen, je nach Typ und Konfiguration des Dateisystems, auf dem die Datei gespeichert ist. Eine Sparse-Datei, die mit diesem Befehl erstellt wurde:

dd bs=1 seek=2GiB if=/dev/null of=big

hat eine scheinbare Größe von 2 GiB, benötigt auf den meisten modernen Systemen jedoch tatsächlich fast keinen Speicherplatz.

verwandte Informationen