Löschen Sie nicht verwendeten Speicherplatz mit Nullen (ext3, ext4)

73

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)

Grzegorz Wierzowiecki
quelle
4
Überprüfen Sie dies heraus: superuser.com/questions/19326/…
Mat
1
Zwei verschiedene Arten von Antworten sind möglich. Was versuchst du zu erreichen? Entweder 1) Sicherheit, von jemandem zu verbieten , diese Daten zu lesen, oder 2) Optimierung der Kompression der gesamten Partition oder [SSD - Leistung] ( en.wikipedia.org/wiki/Trim_(computing) ?
Totor

Antworten:

77

Ein solcher Nutzen ist zerofree.

Aus seiner Beschreibung:

Zerofree findet die nicht zugeordneten, nicht auf Null gestellten Blöcke in einem ext2- oder ext3-Dateisystem und füllt sie mit Nullen. Dies ist nützlich, wenn das Gerät, auf dem sich dieses Dateisystem befindet, ein Festplatten-Image ist. In diesem Fall kann ein sekundäres Dienstprogramm je nach Art des Festplattenabbilds möglicherweise die Größe des Festplattenabbilds reduzieren, nachdem keine Aktualisierung durchgeführt wurde. Für Zerofree muss das Dateisystem nicht gemountet oder schreibgeschützt gemountet sein.

Der übliche Weg, um dasselbe Ergebnis zu erzielen (die nicht verwendeten Blöcke auf Null zu setzen), besteht darin, "dd" auszuführen, eine Datei mit Nullen zu erstellen, die den gesamten freien Speicherplatz auf dem Laufwerk belegt, und diese Datei dann zu löschen. Dies hat viele Nachteile, die nullfrei abhelfen:

  • es ist langsam
  • es lässt das Disk-Image (vorübergehend) maximal wachsen
  • Es belegt (vorübergehend) den gesamten freien Speicherplatz auf der Festplatte, sodass andere gleichzeitige Schreibaktionen möglicherweise fehlschlagen.

Zerofree wurde geschrieben, um von GNU / Linux-Systemen ausgeführt zu werden, die als Gastbetriebssysteme in einer virtuellen Maschine installiert sind. Wenn dies nicht der Fall ist, benötigen Sie dieses Paket mit ziemlicher Sicherheit nicht.

UPDATE # 1

Die Beschreibung des .deb-Pakets enthält jetzt den folgenden Absatz, was bedeuten würde, dass dies auch mit ext4 gut funktioniert.

Beschreibung: Null freie Blöcke aus ext2-, ext3- und ext4-Dateisystemen Zerofree findet die nicht zugeordneten Blöcke mit einem Wert ungleich Null in einem ext2-, ext3- oder ext4-Dateisystem und füllt sie mit Nullen ...

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.

Enzotib
quelle
1
Ist es eine offizielle Seite des Tools intgat.tigress.co.uk/rmy/uml/index.html ? Glauben Sie, dass die Verwendung mit ext4 sicher ist?
Grzegorz Wierzowiecki
2
@GrzegorzWierzowiecki: ja, das ist die seite, aber für debian und freunde ist sie bereits in den repos. Ich habe eine ext4-Partition auf einer virtuellen Festplatte verwendet, um das Image der Festplattendatei nacheinander zu verkleinern, und hatte kein Problem.
Enzotib
1
Dies entspricht nicht der Rohmethode ddin der ursprünglichen Frage, da es auf bereitgestellten Dateisystemen nicht funktioniert.
jlh
Auf der zerofree-Seite wird über einen Patch gesprochen, mit dem Sie Folgendes ausführen können: "Das Dateisystem wird mit der Option zerofree gemountet", sodass gelöschte Dateien immer auf Null gesetzt werden. Muss der Kernel dann neu kompiliert werden? Gibt es einen einfacheren Weg, um dasselbe zu erreichen?
Endolith
2
Seien Sie vorsichtig - Ich habe das ext4-Dateisystem verloren, das zerofreeauf Astralinux (Debian-basiert) verwendet…
Hubbitus
33

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

  • Wenn die "Festplatte", auf der sich Ihr Dateisystem befindet, mit Thin Provisioning ausgestattet ist (z. B. eine moderne SSD, die TRIM unterstützt, eine VM-Datei, deren Format die Sparsamkeit unterstützt usw.) und der Kernel e2fsck -E discard src_fsangibt, dass das Block-Gerät dies versteht, können Sie nicht genutzten Speicherplatz verwerfen (erfordert e2fsprogs) 1.42.2 oder höher).
  • Verwenden Sie zerofree (zB zerofree src_fs), um explizit Nullen über nicht verwendete Blöcke zu schreiben.
  • Verwenden, e2image -rap src_fs dest_fsum 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

  • Wenn die "Festplatte", auf der sich Ihr Dateisystem befindet, mit Thin Provisioning ausgestattet ist (z. B. eine moderne SSD, die TRIM unterstützt, eine VM-Datei, deren Format die Sparsamkeit unterstützt usw.), sagt Ihr Kernel, dass das Blockgerät dies versteht und dass der ext-Dateisystemtreiber dies unterstützt fstrim /mnt/fs/um das Dateisystem aufzufordern, nicht genutzten Speicherplatz zu verwerfen.
  • Using cat /dev/zero > /mnt/fs/zeros; sync; rm /mnt/fs/zeros( sfillvon 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ünftige fscks 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 zerofreenach 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

Anon
quelle
15

sfillfrom secure-delete kann dies und einige andere verwandte Jobs ausführen.

z.B

sfill -l -l -z /mnt/X

UPDATE # 1

Es gibt einen Quellbaum, der vom ArchLinux-Projekt auf github verwendet zu werden scheint und der die Quelle enthält, für sfilldie ein Tool im Paket Secure-Delete enthalten ist.

Auch eine Kopie der sfillManpage von ist hier:

cas
quelle
Diese URL ist veraltet. Keine Ahnung, wo sich die Homepage jetzt befindet (oder auch wenn sie noch eine hat), aber sie ist für Debian und Ubuntu gepackt. wahrscheinlich auch andere Distributionen. Wenn Sie Quellcode benötigen, finden Sie diesen in den Debian-Archiven, wenn Sie ihn nirgendwo anders finden.
cas
Die veraltete Manpage-URL wurde behoben. Sieht aus wie "Digipedia" ist keine Sache mehr.
Mwfearnley
8

Wenn Sie über e2fsprogs 1.42.9 verfügen, können Sie e2imagedas Partitionsimage zunächst ohne den freien Speicherplatz erstellen, sodass Sie den Schritt des Nullstellens überspringen können.

Psusi
quelle
Ich konnte (leicht) keine Informationen online über diese Parameter finden, aber sie sind in der Tat in den Versionshinweisen zu 1.42.9
angegeben
1
Das ist ein wertvolles Werkzeug! Ihre Antwort wäre jedoch besser, wenn Sie auch erklären würden, wie Sie sie verwenden. Es ist e2image -ar /dev/foo1 | gzip > fs.img.gzoder eine Variation davon. Include -f, um es auf einem gemounteten fs zu verwenden.
März
0

Sie können verwenden sfill. Es ist eine bessere Lösung für dünne Volumina.

user64219
quelle
Wenn Sie Kommentare zu cas answer abgeben möchten, warten Sie, bis Sie den entsprechenden Ruf haben.
Anthon
1
Ich denke, die Antwort bezieht sich auf manpages.ubuntu.com/manpages/lucid/man1/sfill.1.html ... was zumindest ein Versuch zu beantworten ist. ("online" bedeutet in diesem Fall "mit dem eingebundenen Dateisystem", nicht "im Internet").
Derobert
0

Wenn Sie nicht auf zusätzliche Tools zurückgreifen möchten, sollte diese Methode schneller sein als cat /dev/zero > /mnt/fs/zeros:

dd if=/dev/zero of="/mnt/fs/filler" bs=10485760
dd if=/dev/zero of="/mnt/fs/filler1" bs=1
rm /mnt/fs/filler
rm /mnt/fs/filler1
eadmaster
quelle
Warum wäre das schneller als cat? (Nein, das Blockgrößenargument von ddhilft nicht)
Marcelm
2
Ja, aber das macht nicht ddschneller. In der Tat macht es wahrscheinlich catschneller. 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.
Marcelm