Eu mesmo resolvi uma solução:
Resposta rápida
Supondo que sua unidade seja /dev/sdX
:
- Execute
dd if=/dev/zero | cmp - /dev/sdX
para identificar o primeiro byte diferente de zero do dispositivo: no meu caso, foi byte742300476649
- Calcule para qual bloco o primeiro byte diferente de zero pertence:
<device_first_non_zero_block>=floor(<device_first_non_zero_byte>/<device_block_size>)+1
: você pode verificar seu<device_block_size>
em execuçãofdisk -l /dev/sdX
em um terminal: no meu caso, foi bloco1449805619
- Inicie o
dd
novamente a partir daí:dd if=/dev/zero bs=<device_block_size> skip=<device_first_non_zero_block>-1
: no meu caso, o comando foidd if=/dev/zero of=/dev/sda bs=512 skip=1449805618
Resposta longa
Conceder cmp
-
como FILE1
forçará a leitura de FILE1
de stdin
, portanto, um fluxo constante de zeros fará com que cmp
compare cada byte de FILE2
com zero até EOF
, reportando (se houver) o primeiro byte diferente de zero: assumindo que a unidade é /dev/sdX
:
dd if=/dev/zero | cmp - /dev/sdX
O primeiro bloco diferente de zero do dispositivo é o bloco contendo o primeiro byte diferente de zero, ou seja:
<device_first_non_zero_block>=floor(<device_first_non_zero_byte>/<device_block_size>)+1
Então, para começar dd
novamente, pule o primeiro <device_first_non_zero_block>-1
blocks:
dd if=/dev/zero of=/dev/sdX bs=<device_block_size> skip=<device_first_non_zero_block>-1
Teste
Criando um arquivo de 512 KB contendo apenas zeros para simular um disco rígido:
$ dd if=/dev/zero of=hdd1 bs=512 count=1000
Criando um arquivo de 512KB contendo apenas bytes aleatórios para simular um disco rígido contendo dados:
$ dd if=/dev/urandom of=hdd2 bs=512 count=1000
Mesclando os dois arquivos para simular um disco rígido parcialmente limpo:
$ cat hdd1 hdd2 > hdd3
Saída do comando nos test drives:
$ dd if=/dev/zero | cmp - hdd1
cmp: EOF on hdd1
# cmp reached EOF on hdd1, hdd1 contains only zeros
$ dd if=/dev/zero | cmp - hdd2
- hdd2 differ: byte 1, line 1
# cmp reported byte 1 to be not zero, hdd2 doesn't contain any leading zero
$ dd if=/dev/zero | cmp - hdd3
- hdd3 differ: byte 512001, line 1
# cmp reported byte 512001 to be not zero, hdd3 contains leading zeros up to byte 512000
Neste caso:
<device_first_non_zero_block>=floor(512001/512)+1=floor(1000,001953125)+1=1000+1=1001
Então, para começar dd
novamente a partir daqui:
observe que, neste caso, sendo o test drive um arquivo,
count
é necessário e foi definido como<device_total_number_of_blocks>-(<device_first_non_zero_block>-1)
para não exceder o tamanho do test drive, mas isso não se aplica a unidades comuns
dd if=/dev/zero of=hdd3 bs=512 seek=1000 count=1000
Saída do comando em hdd3
:
$ dd if=/dev/zero of=test2 bs=512 seek=1000 count=1000
1000+0 records in
1000+0 records out
512000 bytes (512 kB) copied, 0,00190399 s, 269 MB/s
Verificando se o procedimento foi bem sucedido:
$ dd if=/dev/zero | cmp - hdd3
cmp: EOF on hdd3
Bingo!