Nicht verwendeten Speicherplatz mit Nullen (btrfs) löschen

10

Wie lösche ich ungenutzten Speicherplatz mit Nullen? (Ich frage nach einem Tool für das btrfs- Dateisystem)

Ich suche etwas schlauer als

cat /dev/zero > /mnt/X/big_zero ; sync; rm /mnt/X/big_zero

Wie FSArchiver sucht nach "gebrauchtem Speicherplatz" und ignoriert ungenutzten, aber gegenüberliegenden Standort.

Zweck: Ich möchte Partitionsimages komprimieren, daher wird dringend empfohlen, nicht verwendeten Speicherplatz mit Nullen zu füllen.

Übrigens. Für ext3, ext4: Nicht verwendeten Speicherplatz mit Nullen löschen (ext3, ext4) . Hier bitte ich um btrfs

Klarstellung des "intelligenteren Algorithmus": Da ich sehe, dass der "intelligentere Algorithmus" zu Verwirrung führt, habe ich mich schließlich entschlossen, eine Zeile darüber hinzuzufügen. Sehr geehrter Leser, bitte denken Sie an das Dateisystem als Datenstruktur. Stellen wir uns zur Vereinfachung eine selbstausgleichende rot-schwarze Baumhaltekarte vor, die als Zuordnungsschlüssel-> Wertearray verwendet wird, wobei Werte Ganzzahlen sind. Ziel ist es, alle negativen Werte mit Nullen zu löschen. Der "nicht intelligente" Algorithmus iteriert darüber und fügt der neuen Karte Schlüssel-Wert-Paare hinzu (wobei sich das Negativ schließlich auf Null ändert). Der intelligente Algorithmus erkennt nur Orte, an denen negative Werte gespeichert sind, und löscht sie an Ort und Stelle .

Grzegorz Wierzowiecki
quelle
2
Hast du den sfillVorschlag ausprobiert ? Es sieht so aus, als würde extX nicht benötigt.
Kevin
1. Ich weiß, dass Sie vorhandene Dateien mit Nullen mit Shred füllen können, aber das ist es wahrscheinlich nicht, oder? 2.Wie machst du diese Bilder? Vielleicht können Sie dort die Kürzung vornehmen?
Zlatko
@kevin: deshalb habe ich die sfill-antwort in der ursprünglichen frage gepostet. Ich benutze selbst selten ext2,3,4-Dateisysteme, daher finde ich Dienstprogramme, die nur mit ext * funktionieren, ärgerlich nutzlos.
Cas
Ich brauche etwas "Kluges". Etwas, das nur den leeren Raum mit Nullen füllt, ohne andere Stellen zu berühren - ich meine, ohne interne Datenstrukturen wie B-Bäume zu beeinflussen (Wenn Sie neugierig sind, habe ich in Frage "Komprimierung" geschrieben, aber ich brauche es auch für andere Zwecke, wie fs Bilder
Deduplizierung
benutze einfach truncateund / oderfallocate
mikeserv

Antworten:

4

Hier ist ein modifizierter und viel erweiterter Repost meiner Antwort auf Ihre vorherige Frage:

sfillaus dem secure-deletePaket kann machen, was Sie wollen.

Im Gegensatz zu zerofree (das nur mit ext2-, ext3- und ext4-Dateisystemen funktioniert) funktioniert sfill mit jedem Dateisystem.

z.B

sfill -l -l -z /mnt/X

Die Homepage sfill / secure-delete scheint nun verschwunden zu sein, ist jedoch für Debian und Ubuntu verpackt. wahrscheinlich auch andere Distributionen. Wenn Sie Quellcode benötigen, finden Sie diesen in den Debian-Archiven, wenn Sie ihn nirgendwo anders finden.

HINWEIS: sfill funktioniert nur auf einem gemounteten Dateisystem. Wenn Sie die Image-Dateien nicht vom Host-System aus, sondern vom Host-System aus füllen, müssen Sie das fs-Image auf dem Host bereitstellen. Die genaue Methode hängt von der Art der Bilddatei ab (z. B. qcow2 oder raw).

Das Mounten von "Rohbildern" ist einfach und unkompliziert. Verwenden Sie einfach kpartxdie Image-Datei, um ein Loopback-Gerät zu erstellen, und / dev / mapper / entry für jede Partition kann dann einzeln gemountet werden.

Hier ist ein Teilskript, das von einem Fragment des Skripts geändert wurde, das ich zum Mounten von netzstartfähigen Freedos-Festplattenabbildern verwende (wird für BIOS-Updates auf Computern verwendet, auf denen Flashrom nicht funktioniert):

image="myrawimagefile.img"

# use kpartx to build /dev/mapper device nodes
KP=$(kpartx -a -v "$image")

# now mount each partition under ./hd/
for p in $(echo "$KP" | awk '/^add map/ {print $3}') ; do
  dm="/dev/mapper/$p"
  fp=$(echo "$p" | sed -r -e 's/^loop[0-9]+//')
  mkdir -p "./hd/$fp"
  mount "$dm" "./hd/$fp"
  sfill -l -l -v "./hd/$fp"
  umount "$dm"
done

# now remove the loopback device and /dev/mapper entries
kpartx -d "$image"

HINWEIS: Es wird davon ausgegangen, dass jede Partition im Image bereitgestellt werden kann. true in meinem Anwendungsfall (ein freedos hd-Image mit einer Partition). Nicht wahr, wenn eine der Partitionen beispielsweise Swap Space ist. Das Erkennen solcher Partitionen und die Verwendung von dd zum Nullstellen der Swap-Partition bleibt dem Leser als Übung :)

Diese Methode oder eine Variante davon sollte auch für LVM-Volumes funktionieren.

Wenn Ihre Bilder qcow sind, können Sie das qemu-nbdTool aus dem qemu-utilsPaket verwenden, das die Bilddatei und ihre Partitionen als Netzwerkblockgeräte darstellt - z. B. / dev / nbd0 / dev / ndb0p1 -, die auf ähnliche Weise wie das / verwendet werden können Dev / Mapper-Geräte oben.

Es ist möglicherweise einfacher und weniger mühsam (aber zeitaufwändiger) qemu-img, von qcow nach raw zu konvertieren, die oben beschriebene Methode für raw zu verwenden und dann das modifizierte Rohbild wieder in komprimiertes qcow2 zu konvertieren. Dies führt wahrscheinlich zu etwas kleineren Bildern als bei Verwendung von qemu-nbd, da Sie das neue qcow2-Bild beim Erstellen komprimieren.

cas
quelle
1
Was ich meine ist, dass es nicht als "intelligente" Art angesehen wird, ungenutzten Raum mit Nullen zu füllen. Es ist die offensichtlichste, typischste Art, dies zu tun. Ich frage nicht nach solchen Dingen.
Grzegorz Wierzowiecki
1
Bitte beschreiben Sie einen "intelligenten" Algorithmus, der nicht spezifisch für eine bestimmte Dateisystemfamilie ist (wie Zerofill für ext2 / 3/4). Sie wollten ein Programm, das die Arbeit erledigen kann. Du hast nicht gesagt, dass es auch magisch sein muss.
Cas
1
und wirklich, wenn das Dateisystem nicht verwendet wird (weil es beispielsweise zum Null-Füllen auf dem Host bereitgestellt ist), was macht es dann aus, wie intelligent der Algorithmus ist? Das Durchsuchen der fs-Metadaten nach leeren Sektoren wird nicht schneller oder besser sein, als nur eine riesige Füllung voller NULs zu schreiben ... das Dateisystem selbst ist bereits intelligent genug, um herauszufinden, wo sich leerer Speicherplatz befindet.
Cas
2
Einerseits reicht es für Ihre Bedürfnisse aus - meine Frage enthält also bereits Codefragmente mit dieser Lösung -, sodass Ihre Antwort nichts Neues liefert. Andererseits erfordern meine Anforderungen, was ich spezifiziere, weil ich ungenutzten Speicherplatz mit Nullen löschen möchte, ohne interne Strukturen zu ändern (z. B. "Dancing B-Trees" oder andere Arten von Datenstrukturen neu ausgleichen (z. B. für Analysen und Deduplizierung) Zwecke)
Grzegorz Wierzowiecki
2
@cas - Ich denke, Sie vermissen die Tatsache, dass das Null-Füllen ein wesentlicher Schritt ist, bevor virtuelle Festplatten in VMs komprimiert werden. Wenn Sie eine 500-GB-Erweiterungsfestplatte mit 10 GB Dateien und 10 GB "leerem" Speicherplatz (dh gelöschten Dateien) haben, dauert das Ausführen des naiven Ansatzes "Riesen-Null-Datei" bei weitem länger und erfordert, dass die VHD aufbläht die vollen 500 GB. Ich wette, das OP geht davon aus, dass das Dienstprogramm auch FS-spezifisch sein muss.
Gefälschter Name
3

Der richtige und "intelligente" Weg, um den freien Speicherplatz freizugeben, ist:

fstrim /mountpoint

Verwenden Sie dies auf einem gemounteten Dateisystem.

Es ist wichtig zu beachten, dass dies keinen Sicherheitsvorteil bietet. Wenn Sie Ihre Festplatte aus Sicherheitsgründen löschen möchten, sichern Sie Ihre Dateien, setzen Sie die gesamte Festplatte mit einem Befehl wie "Shred" auf Null und stellen Sie dann Ihre Dateien wieder her.

Die Lösung funktioniert jedoch einwandfrei, wenn es sich bei Ihrer Festplatte um eine Thin Provision in einem spärlichen Dateisystem handelt und Sie den nicht verwendeten Speicherplatz wiederherstellen möchten.

DustWolf
quelle