Wie lösche ich ungenutzten Speicherplatz mit Nullen? (ext3, ext4)
Ich suche etwas schlaueres als
cat /dev/zero > /mnt/X/big_zero ; sync; rm /mnt/X/big_zero
Wie FSArchiver sucht "used space" und ignoriert unbenutzte, aber gegenüberliegende Seiten .
Zweck: Ich möchte Partitionsimages komprimieren, daher wird dringend empfohlen, nicht verwendeten Speicherplatz mit Nullen zu füllen.
Btw. Für BTRFS: Löschen Sie nicht verwendeten Speicherplatz mit Nullen (BTRFS)
filesystems
partition
backup
storage
compression
Grzegorz Wierzowiecki
quelle
quelle
Antworten:
Ein solcher Nutzen ist
zerofree
.Aus seiner Beschreibung:
UPDATE # 1
Die Beschreibung des .deb-Pakets enthält jetzt den folgenden Absatz, was bedeuten würde, dass dies auch mit ext4 gut funktioniert.
Andere Verwendungen
Eine weitere Anwendung dieses Dienstprogramms ist das Komprimieren von Datenträgerabbildern, bei denen es sich um eine Sicherung eines realen Datenträgers handelt. Ein typisches Beispiel hierfür ist der Speicherauszug der SD-Karte in einem BeagleBone oder einem Raspberry Pi. Sobald leere Stellen auf Null gesetzt wurden, können Backup-Images effizienter komprimiert werden.
quelle
dd
in der ursprünglichen Frage, da es auf bereitgestellten Dateisystemen nicht funktioniert.zerofree
auf Astralinux (Debian-basiert) verwendet…Zusammenfassung der Methoden (wie in dieser Frage und an anderer Stelle erwähnt) zum Löschen von nicht verwendetem Speicherplatz auf ext2 / ext3 / ext4:
Nicht genutzten Speicherplatz auf Null setzen
Dateisystem ist nicht gemountet
e2fsck -E discard src_fs
angibt, dass das Block-Gerät dies versteht, können Sie nicht genutzten Speicherplatz verwerfen (erfordert e2fsprogs) 1.42.2 oder höher).zerofree src_fs
), um explizit Nullen über nicht verwendete Blöcke zu schreiben.e2image -rap src_fs dest_fs
um nur verwendete Blöcke zu kopieren (neues Dateisystem sollte sich auf einer ansonsten auf Null gestellten "Festplatte" befinden, erfordert e2fsprogs 1.42.9 oder höher).Dateisystem ist gemountet
fstrim /mnt/fs/
um das Dateisystem aufzufordern, nicht genutzten Speicherplatz zu verwerfen.cat /dev/zero > /mnt/fs/zeros; sync; rm /mnt/fs/zeros
(sfill
von Secure-Delete verwendet diese Technik). Diese Methode ist ineffizient, wird von Ted Ts'o (Autor von ext4) nicht empfohlen, kann bestimmte Dinge nicht auf Null setzen und zukünftigefsck
s verlangsamen .Wenn Sie das Dateisystem nicht gemountet haben, erhalten Sie bessere Ergebnisse als wenn Sie es gemountet haben. Das Verwerfen ist in der Regel die schnellste Methode, wenn viel zuvor verwendeter Speicherplatz auf Null gesetzt werden muss. Die Verwendung
zerofree
nach dem Verwerfen kann jedoch manchmal zu einer zusätzlichen Null führen (abhängig davon, wie das Verwerfen auf der "Festplatte" implementiert ist).Die Bilddatei verkleinern
Das Image ist in einem dedizierten VM-Format
Sie müssen ein geeignetes Disk-Image-Tool (z. B.
qemu-img convert src_image dst_image
) verwenden, um den auf Null gestellten Speicherplatz freizugeben und um zu ermöglichen, dass die Datei, die das Image darstellt, kleiner wird.Bild ist eine Rohdatei
Eine der folgenden Techniken kann verwendet werden, um die Dateidichte zu verringern (sodass Nulldurchläufe keinen Speicherplatz mehr beanspruchen):
cp --sparse=always src_image dst_image
.fallocate -d src_image
(erfordert util-linux v2.25 oder höher).Heutzutage ist es möglicherweise einfacher, ein Tool wie virt-sparsify zu verwenden, um diese Schritte und mehr auf einmal auszuführen .
Quellen
zerofree
quelle
sfill
from secure-delete kann dies und einige andere verwandte Jobs ausführen.z.B
UPDATE # 1
Es gibt einen Quellbaum, der vom ArchLinux-Projekt auf github verwendet zu werden scheint und der die Quelle enthält, für
sfill
die ein Tool im Paket Secure-Delete enthalten ist.Auch eine Kopie der
sfill
Manpage von ist hier:quelle
Wenn Sie über e2fsprogs 1.42.9 verfügen, können Sie
e2image
das Partitionsimage zunächst ohne den freien Speicherplatz erstellen, sodass Sie den Schritt des Nullstellens überspringen können.quelle
e2image -ar /dev/foo1 | gzip > fs.img.gz
oder eine Variation davon. Include-f
, um es auf einem gemounteten fs zu verwenden.Sie können verwenden
sfill
. Es ist eine bessere Lösung für dünne Volumina.quelle
Wenn Sie nicht auf zusätzliche Tools zurückgreifen möchten, sollte diese Methode schneller sein als
cat /dev/zero > /mnt/fs/zeros
:quelle
cat
? (Nein, das Blockgrößenargument vondd
hilft nicht)dd
schneller. In der Tat macht es wahrscheinlichcat
schneller. Die Blockgröße ist nur wichtig, um den Overhead von Systemaufrufen zu minimieren und die CPU-Cache-Nutzung zu optimieren. Mit dem Syscall-Overhead betreten Sie den Bereich sinkender Renditen. Der Cache beginnt zu schmerzen, sagen wir 1MiB. Und wenn Sie mit echten Festplatten arbeiten, sind Sie ohnehin an die E / A gebunden und der Punkt ist meistens umstritten. Probieren Sie es selbst aus.