Disco de clonagem sem perda de informações sobre erros de E / S

2

Eu quero testar um software de criação de partições como parted .

Encontrei um pendrive antigo que trava o programa sempre que tento lê-lo. Para preservar este caso de teste, eu preciso copiar o dispositivo USB da forma mais exata possível, preservando os erros de E / S .

Eu sei que é provavelmente impossível fazer o meu HDD lançar erro de IO ao ler alguns bytes desse arquivo, mas talvez ele possa ser emulado por algum tipo de programa que tenha todo o conteúdo do stick USB codificado e se lembre de quando enviar um erro de IO?

Estou usando o Arch Linux e prefiro uma solução que possa ser adaptada a ele (possivelmente por meio de algum tipo de VM ou emulador de máquina).

    
por styrofoam fly 18.02.2017 / 19:48

2 respostas

4

Para copiar, use ddrescue , safecopy ou dd_rescue . Todos eles mantêm um registro de áreas com falha, bem como tentam automaticamente até que possam obter os dados.

O uso geral é:

  • ddrescue: (não confunda com o dd_rescue antigo)

    ddrescue /dev/sdc3 sdc3.img sdc3.map
    

    Se desejado, repita com --retrim ou '--try-again:

    ddrescue --try-again /dev/sdc3 sdc3.img sdc3.map
    

    Não se esqueça de especificar o arquivo de mapa para registrar áreas ruins.

  • safecopy:

    safecopy --stage1 /dev/sdc3 sdc3.img
    safecopy --stage2 /dev/sdc3 sdc3.img
    safecopy --stage3 /dev/sdc3 sdc3.img
    

    Após o estágio 3, você terá um arquivo stage3.badblocks listando os setores defeituosos individuais.

    Se você quiser tentar novamente, use:

    mv stage3.badblocks stage2.badblocks
    safecopy --stage3 /dev/sdc3 sdc3.img
    
  • dd_rescue: (não deve ser confundido com o ddrescue com maior capacidade)

    dd_rescue -o sdc3.badblocks /dev/sd3 sdc3.img
    

    (Não tenho idéia se essa ferramenta suporta retomar / tentar novamente com uma segunda chamada, mas pelo menos ela gera um log de badblocks.)

Esses programas enfatizam o máximo possível de dados rápidos e a recuperação lenta para mais tarde. Portanto, não fique surpreso se o "estágio 1" pular megabytes inteiros apenas por causa de um único bloco defeituoso - ele retornará ao estágio 2.

Para emular um disco danificado, pegue o log de badblocks que você acabou de adquirir e aplique-o a esta postagem:

Use dmsetup to create a device backed by the "error" target. It will show up in /dev/mapper/<name>.

Page 7 of the Device mapper presentation (PDF) has exactly what you're looking for:

dmsetup create bad_disk << EOF
  0 8       linear /dev/sdb1 0
  8 1       error
  9 204791 linear /dev/sdb1 9
EOF

Or leave out the sdb1 parts to and put the "error" target as the device for blocks 0 - 8 (instead of sdb1) to make a pure error disk.

See also The Device Mapper appendix from "RHEL 5 Logical Volume Manager Administration".

— Peter Cordes, https://stackoverflow.com/questions/1870696/simulate-a-faulty-block-device-with-read-errors

(A conversão de um log de badblocks ou um arquivo de mapeamento ddrescue para a sintaxe da tabela dmsetup é deixada como um exercício para o leitor ...)

    
por 18.02.2017 / 21:28
1

dd pode ser avisado para continuar ao encontrar erros, isso apenas irá escrever zeros nos espaços que ele não pode ler do disco original ...

dd bs=<blocksize here> conv=sync,noerror if=/dev/sdc123 of=/home/me/testFile

Você também pode tentar usar o ddrescue para tentar recuperar os dados, mas não tenho certeza de como funcionaria em um disco USB (baseado em flash).

AVISO - Se você estragar o tamanho do bloco, estragar todos os dados após o primeiro bloco sem leitura - você deseja definir o tamanho do bloco para o tamanho do dispositivo que está copiando de .

    
por 18.02.2017 / 20:51