Como evito iniciar o dd novamente após o congelamento do sistema?

4

Alguns dias atrás, decidi limpar meu disco rígido de 750 GB para vendê-lo, então inicializei Ubuntu de um DVD ao vivo e iniciei o processo com sudo dd if=/dev/zero of=/dev/sda . Eu deixei dd correndo durante a noite. Quando voltei de manhã, descobri que em algum ponto do processo Ubuntu congelou. Eu não consigo determinar em qual ponto do processo o congelamento aconteceu, porque sempre que aconteceu aconteceu enquanto a proteção de tela estava ativada, então eu não consegui ver a saída de bash .

Pergunta: Como evito começar o dd novamente?

    
por kos 27.02.2015 / 17:19

1 resposta

2

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 byte 742300476649
  • 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ção fdisk -l /dev/sdX em um terminal: no meu caso, foi bloco 1449805619
  • 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 foi dd 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!

    
por kos 01.03.2015 / 06:30

Tags