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=sparse
a 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=sparse
economizou 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
:
sparse
tente 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=sparse
opção fizesse seu trabalho, mesmo que apenas uma vez.
Os bs
conjuntos 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 obs
que 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>.img
padrã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 obs
opção grande conv=sparse
. O tamanho comum do setor é 512 bytes, então bs=512
parece correto. Seu comando deveria ter sido:
dd if=/dev/sdb of=myusb.img conv=sparse bs=512