¿Por qué `dd conv=sparse` no ahorró espacio como esperaba?

¿Por qué `dd conv=sparse` no ahorró espacio como esperaba?

Iba a hacer una imagen de mi antigua unidad USB. Tenía buenas razones para esperar que hubiera algunos bloques llenos de ceros en el dispositivo, así que para ahorrar espacio utilicé conv=sparsela opción:

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

Sin embargo no me salvó nada:

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

Estoy seguro de que hay bloques con ceros en el dispositivo.¿Por qué no dd conv=sparseahorró espacio?


Tenga en cuenta que ya sé la respuesta (creo). Lo estoy publicando a continuación. La pregunta es para referencia futura.

Respuesta1

Si está absolutamente seguro de que había bloques llenos de ceros, entonces la razón por la que no guardó espacio fue el gran búfer que utilizó. De man dd:

sparseintente buscar en lugar de escribir la salida para los bloques de entrada NUL

Usaste bs=32M, por lo que necesitabas un bloque completo de ceros de 32 MiB en un desplazamiento hacia la derecha para que la conv=sparseopción hiciera su trabajo aunque solo fuera una vez.

La opción bsestablece ibs(tamaño del bloque de entrada) y obs(tamaño del bloque de salida). Si bien el manual mencionabloques de entrada, en realidad es lo obsque importa.

Aquí están los resultados de algunas pruebas. (Como soy el OP, hice las pruebas con el mismo dispositivo). Cada archivo tiene un nombre según un <obs_used>.imgpatrón. Presta atención a la primera columna:

$ 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

La conclusión es: no deberías usar la opción grande obscon conv=sparse. El tamaño del sector común es de 512 bytes, por lo que bs=512parece correcto. Tu comando debería haber sido:

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

información relacionada