Por que `dd conv=sparse` não economizou espaço como eu esperava?

Por que `dd conv=sparse` não economizou espaço como eu esperava?

Eu ia fazer uma imagem do meu antigo drive USB. Eu tinha bons motivos para esperar que houvesse alguns blocos preenchidos com zeros no dispositivo, então, para economizar espaço, usei conv=sparsea opção:

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

No entanto, não me salvou nada:

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

Tenho certeza de que existem blocos preenchidos com zero no dispositivo.Por que não dd conv=sparseeconomizou espaço?


Observe que já sei a resposta (eu acho). Estou postando abaixo. A questão é para referência futura.

Responder1

Se você tem certeza absoluta de que havia blocos preenchidos com zero, o motivo pelo qual você não economizou espaço foi o grande buffer usado. De man dd:

sparsetente buscar em vez de escrever a saída para blocos de entrada NUL

Você usou bs=32M, então precisava de um bloco inteiro de zeros de 32 MiB em um deslocamento à direita para que a conv=sparseopção fizesse seu trabalho, mesmo que apenas uma vez.

Os bsconjuntos de opções ibs(tamanho do bloco de entrada) e obs(tamanho do bloco de saída). Embora o manual mencioneblocos de entrada, na verdade é o obsque importa.

Aqui estão os resultados de alguns testes. (Como sou o OP, fiz os testes com o mesmo dispositivo.) Cada arquivo é nomeado de acordo com o <obs_used>.imgpadrão. Preste atenção na primeira coluna:

$ 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

A conclusão é: você não deve usar obsopção grande conv=sparse. O tamanho comum do setor é 512 bytes, então bs=512parece correto. Seu comando deveria ter sido:

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

informação relacionada