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

4654
Kamil Maciorowski

Ich wollte ein Image von meinem alten USB-Laufwerk erstellen. Ich hatte gute Gründe zu erwarten, dass es einige Blöcke mit Nullen auf dem Gerät gab. Um Platz zu sparen, habe ich die conv=sparseOption verwendet:

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

Es hat mir aber nichts gerettet:

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

Ich bin sicher, dass auf dem Gerät nullgefüllte Blöcke vorhanden sind. Warum nicht Platz dd conv=sparsesparen?


Beachten Sie, dass ich die Antwort bereits kenne (denke ich). Ich poste es unten. Die Frage ist für die Zukunft gedacht.

4

1 Antwort auf die Frage

9
Kamil Maciorowski

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

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

Sie haben verwendet bs=32M, also brauchten Sie die gesamten 32MiB von Nullen am richtigen Offset, damit die conv=sparseOption nur einmal ausgeführt werden konnte.

Die Option bssetzt ibs(Eingangsblockgröße) und obs(Ausgangsblockgröße). Während das Handbuch Eingabeblöcke erwähnt, ist es eigentlich das obs, was zählt.

Hier sind die Ergebnisse einiger Tests. (Da ich das OP bin, habe ich die Tests mit demselben Gerät durchgeführt.) Jede Datei wird nach <obs_used>.imgMuster benannt. Beachten Sie 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 ist: Sie sollten nicht groß obsmit conv=sparseOption verwenden. Die übliche Sektorgröße beträgt 512 Bytes, bs=512scheint also gerade richtig zu sein. Ihr Befehl hätte sein sollen:

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