O dd faz algum tipo de verificação?

13

Estou usando dd para copiar dados de um disco rígido antigo para um novo. Quero ter certeza de que a integridade dos dados é segura.

Nesta resposta , Gilles diz

If [dd] terminated successfully, then the backup is correct, barring a hardware fault…

O que isso significa exatamente? O dd tem algum tipo de verificação?

Se eu fosse usar o rsync, eu executaria uma segunda passagem com --checksum , para verificar. Esse tipo de paranoia é justificado?

    
por Sparhawk 20.05.2017 / 13:51

5 respostas

18

dd ou qualquer outra aplicação não tem “algum tipo de verificação embutida” no sentido em que você provavelmente está pensando: ela não lê os dados do meio de armazenamento para comparar com o que foi escrito. Esse é o trabalho do sistema operacional.

Não é realmente possível fazer uma verificação de leitura para o hardware de um aplicativo. Funcionaria em alguns cenários, mas na maioria dos casos não conseguiria nada. O aplicativo pode ler de volta o que acabou de escrever se estiver gravando diretamente em um meio de armazenamento , mas isso normalmente seria lido em um cache na memória, o que não daria nenhuma garantia útil. Em o exemplo que você cita , dd está escrevendo para um pipe e, nesse caso, não tem controle sobre o que acontece aos dados mais abaixo na linha. No seu exemplo de rsync, uma segunda passagem de rsync --checksum é inútil: em teoria, pode pegar um erro, mas na prática, se ocorrer um erro, a segunda passagem provavelmente não relataria nada de errado, então você está desperdiçando esforço em algo que realmente não dá uma garantia útil.

No entanto, os aplicativos fazem verificar o que acontece com os dados, no sentido de que eles verificam se o sistema operacional aceitou a responsabilidade pelos dados. Todas as chamadas do sistema retornam um status de erro. Se uma chamada do sistema retornar um status de erro, o aplicativo deve propagar esse erro para o usuário, geralmente exibindo uma mensagem de erro e retornando um status de saída diferente de zero.

Tenha em atenção que dd é uma excepção: dependendo dos parâmetros da linha de comandos, dd pode ignorar alguns erros . Isso é extremamente incomum: dd é o único comando comum com essa propriedade. Use cat em vez de dd , assim você não corre o risco de corrupção e pode muito bem ser mais rápido .

Em uma cadeia de cópia de dados, dois tipos de erros podem surgir.

  • Corrupção: um bit é invertido durante a transferência. Não há como verificar isso no nível do aplicativo, porque se isso acontecer, é devido a um bug de programação ou a um erro de hardware que provavelmente causará a mesma corrupção durante a leitura. A única maneira útil de verificar se tal corrupção não ocorreu é desconectar fisicamente a mídia e tentar novamente, de preferência em um computador diferente, caso o problema esteja na RAM.
  • Truncamento: todos os dados que foram copiados foram copiados corretamente, mas alguns dos dados não foram copiados. Este vale a pena ser verificado algumas vezes, dependendo da complexidade do comando. Você não precisa ler os dados para fazer isso: basta verificar o tamanho.
por 20.05.2017 / 15:19
4

Não, dd não faz uma verificação explícita. Se você quiser / precisar de uma cópia forense do seu disco ou de qualquer parte dele, use dcfldd , que é uma versão aprimorada do dd desenvolvido pelo Laboratório Forense de Computação do Departamento de Defesa dos EUA.

    
por 20.05.2017 / 14:33
4

A única maneira de ter "certeza" é fazer um passo adicional de leitura e comparação (depois de colocar os caches).

Além disso, dd detecta erros de leitura e gravação da mesma forma que todos os outros programas ... funciona se as unidades (e outros componentes envolvidos) relatarem erros; para unidades que aceitam dados silenciosamente sem realmente escrevê-los, você está sem sorte.

Is that kind of paranoia justified?

Se você não pode confiar em seu hardware para ser confiável, as coisas ficam complicadas ...

    
por 20.05.2017 / 14:34
1

De man dd :

When finished, dd displays the number of complete and partial input and output blocks, truncated input records and odd-length byte-swapping blocks to the standard error output.

A partial input block is one where less than the input block size was read. A partial output block is one where less than the output block size was written. Partial output blocks to tape devices are considered fatal errors. Otherwise, the rest of the block will be written. Partial output blocks to character devices will produce a warning message.

dd verifica se os tamanhos dos blocos de entrada / saída correspondem sempre que copia um bloco. Se não, ele manipula o erro com um aviso ou erro fatal (substituído por noerror ). É por isso que dd funciona praticamente o tempo todo.

Ainda assim, não substitui manualmente a verificação da integridade do seu disco. Se a informação é valiosa para você, então sim, sua paranóia é justificada. Execute uma verificação manual assim que dd terminar.

    
por 20.05.2017 / 14:51
1

Sim, hardware defeituoso pode inserir bits de erro aleatórios nos dados em alguma taxa como um bit por número de megabytes, isso é possível e acontece na prática às vezes.

Normalmente, uso o hash md5 ou sha1 para verificar se os dados estão intactos, relendo a origem e o destino, por exemplo:

dd if=/dev/sdb of=~/hd_backup
dd if=/dev/sdb | md5sum
dd if=~/hd_backup | md5sum

Isso pressupõe que os dados são muito maiores do que o cache do sistema de arquivos, caso contrário, talvez seja necessário reiniciar o sistema para verificar os dados reais no meio e não o conteúdo do cache ou usar outro sistema para ele.

    
por 21.05.2017 / 03:55