Por que o 'dd conv = sparse' não salvou espaço como eu esperava?

4

Eu ia fazer uma imagem da minha antiga unidade USB. Eu tinha boas razões para esperar que houvesse alguns blocos cheios de zeros no dispositivo, então, para economizar espaço, usei conv=sparse option:

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

No entanto, isso não me salvou:

$ 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 dd conv=sparse não economizou espaço?

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

    
por Kamil Maciorowski 18.10.2016 / 23:11

1 resposta

9

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

sparse try to seek rather than write the output for NUL input blocks

Você usou bs=32M , então você precisou de todos os 32 MiB de zeros no deslocamento correto para a opção conv=sparse para fazer seu trabalho apenas uma vez.

A opção bs define ibs (tamanho do bloco de entrada) e obs (tamanho do bloco de saída). Embora o manual mencione blocos de entrada , na verdade é o obs que importa.

Aqui estão os resultados de alguns testes. (Como eu sou o OP, fiz os testes com o mesmo dispositivo). Cada arquivo é nomeado de acordo com o padrão <obs_used>.img . 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 a grande opção obs with conv=sparse . O tamanho do setor comum é de 512 bytes, portanto, bs=512 parece correto. Seu comando deveria ter sido:

dd if=/dev/sdb of=myusb.img conv=sparse bs=512
    
por 18.10.2016 / 23:11