Warum hat `dd conv=sparse` nicht wie erwartet Speicherplatz gespart?

Warum hat `dd conv=sparse` nicht wie erwartet Speicherplatz gespart?

Ich wollte ein Image meines alten USB-Laufwerks erstellen. Ich hatte gute Gründe anzunehmen, dass auf dem Gerät einige Blöcke mit Nullen gefüllt waren. Um etwas Platz zu sparen, habe ich die folgende conv=sparseOption verwendet:

dd if=/dev/sdb of=myusb.img conv=sparse bs=32M

Es hat mir jedoch nichts gerettet:

$ ls -hls myusb.img
250M -rw-r--r-- 1 root root 250M Oct 18 21:31 myusb.img

Ich bin sicher, dass sich auf dem Gerät mit Nullen gefüllte Blöcke befinden.Warum wurde kein dd conv=sparsePlatz gespart?


Beachten Sie, dass ich die Antwort bereits kenne (glaube ich). Ich poste sie unten. Die Frage dient zur späteren Bezugnahme.

Antwort1

Wenn Sie absolut sicher sind, dass es mit Nullen gefüllte Blöcke gab, dann war der Grund, warum Sie keinen Platz gespart haben, der große Puffer, den Sie verwendet haben. Von man dd:

sparseVersuchen Sie, die Ausgabe für NUL-Eingabeblöcke zu suchen, anstatt sie zu schreiben

Sie haben verwendet bs=32M, sodass Sie einen ganzen 32-MiB-Block mit Nullen am richtigen Offset benötigten, damit die conv=sparseOption ihre Aufgabe erfüllen konnte, wenn auch nur einmal.

Die Option bslegt ibs(Eingabeblockgröße) und obs(Ausgabeblockgröße) fest. Während das Handbuch erwähntEingabeblöcke, es ist tatsächlich das, obswas zählt.

Hier sind die Ergebnisse einiger Tests. (Da ich der OP bin, habe ich die Tests mit demselben Gerät durchgeführt.) Jede Datei ist nach einem <obs_used>.imgMuster benannt. Achten Sie auf die erste Spalte:

$ ls -hlst *.img
250M -rw-r--r-- 1 root root 250M Oct 18 22:02 4M.img
250M -rw-r--r-- 1 root root 250M Oct 18 22:02 2M.img
249M -rw-r--r-- 1 root root 250M Oct 18 22:02 1M.img
248M -rw-r--r-- 1 root root 250M Oct 18 22:01 512K.img
248M -rw-r--r-- 1 root root 250M Oct 18 22:01 256K.img
247M -rw-r--r-- 1 root root 250M Oct 18 22:00 128K.img
247M -rw-r--r-- 1 root root 250M Oct 18 21:57 64K.img
247M -rw-r--r-- 1 root root 250M Oct 18 21:56 32K.img
246M -rw-r--r-- 1 root root 250M Oct 18 21:55 16K.img
246M -rw-r--r-- 1 root root 250M Oct 18 21:54 8K.img
246M -rw-r--r-- 1 root root 250M Oct 18 21:53 4K.img
246M -rw-r--r-- 1 root root 250M Oct 18 21:52 2K.img
246M -rw-r--r-- 1 root root 250M Oct 18 21:51 1K.img
246M -rw-r--r-- 1 root root 250M Oct 18 21:44 512.img

Die Schlussfolgerung lautet: Sie sollten „large“ nicht obsmit conv=sparseder Option verwenden. Die übliche Sektorgröße beträgt 512 Bytes, bs=512scheint also genau richtig. Ihr Befehl hätte lauten sollen:

dd if=/dev/sdb of=myusb.img conv=sparse bs=512

verwandte Informationen