Interpretando o erro dd de entrada / saída

6

Eu tentei copiar /dev/Storage/Storage (um LV sob o LVM) para um arquivo de imagem usando um dd | pv | dd pipeline. dd relatou um erro e quero saber se dd terminou de copiar meu disco ou parou devido ao erro. Não tenho certeza, pois me deu duas saídas diferentes: um com um erro no topo e outro sem. Eu adivinharia e diria que não, porque entre os dois há apenas um extra de 0,1 segundo e nenhum dado extra, mas não tenho certeza se aconteceu ou não. /dev/Storage/Storage é um disco de 1 TB (terabyte = 10 12 = 1000 4 ) ou 931,51 GiB (gibibyte = 2 30 = 1024 3 ) ou 1953513472 setores. O sistema de arquivos no disco está bagunçado e não funciona corretamente.

$ sudo dd if=/dev/Storage/Storage | pv | dd of=Storage.img
dd: error reading ‘/dev/Storage/Storage’: Input/output error                   ]
1627672400+0 records ins] [   <=>                                              ]
1627672400+0 records out
833368268800 bytes (833 GB) copied, 75181 s, 11.1 MB/s
776GB 20:53:01 [10.6MB/s] [  <=>                                              ]
1627672400+0 records in
1627672400+0 records out
833368268800 bytes (833 GB) copied, 75181.1 s, 11.1 MB/s
    
por Scoopta 16.08.2015 / 02:08

3 respostas

4
  • Você está usando o tamanho padrão do bloco 512 bytes dd . Você melhoraria significativamente o desempenho usando um tamanho de bloco maior, digamos 128k ou mesmo 1m .

  • Existem duas saídas porque você está executando dois comandos dd , o primeiro é o leitor de dispositivos e mostra um erro de E / S.

  • Provavelmente você está usando o LVM com o nome do dispositivo que você usa: /dev/Storage/Storage . Tem certeza de que este é o disco inteiro e não um subconjunto? Use lvdisplay para descobrir o que está por trás desse nome de dispositivo.

por 16.08.2015 / 03:47
2

Procure nas mensagens de log do kernel ( dmesg ou /var/log/kern.log ) mensagens mais detalhadas dos drivers SATA, se houver um erro de hardware. Também é útil: smartctl -x /dev/sda . Se fosse apenas uma tentativa de ler após o final de uma partição ou algo assim, isso também poderia aparecer no log do kernel.

Para que o dd continue após um erro de E / S, para ler as partes legíveis que seguem o erro, use

dd if=... of=... conv=noerror bs=128k   # it doesn't get any faster beyond about 128k, because of L2 cache size

(Como mencionado nos comentários sobre o OP, ddrescue tem isso e mais. conv=noerror foi adicionado ao GNU dd depois que ddrescue existiu, IIRC.)

Se você quiser continuar de onde parou, use as opções seek e skip , com conv=notrunc .

Se você realmente quiser ver o quão longe o dd está, veja a posição do arquivo de seu stdin:

cat /proc/$(pidof dd)/fdinfo/0  # dd opens its infile as fd #0

(ou ls -lh do tamanho do arquivo de saída). Copiar um disco rígido inteiro de dados 2 vezes extras, passando-o por algo, parece bobo para mim, como se ele apenas tornasse seu computador um pouquinho mais lento do que o necessário para as horas que a cópia levaria.

Ou pelo menos:

dd if=... conv=noerror bs=128k | pv > Storage.img
    
por 16.08.2015 / 16:21
0

Eu estava tendo o mesmo problema e nenhum dos tutoriais ou postagens de SO referentes a dd especificamente estavam ajudando na minha forma específica desse problema. Depois de algumas escavações, eu encontrei esta questão . Esta solução realmente funcionou bem para mim.

Aqui está um exemplo para o seu caso de uso:

$ sudo apt-get install gddrescue

$ sudo ddrescue /dev/Storage/Storage Storage.img | pv

A forma geral é:

$ sudo ddrescue <in_file> <out_file>

e depois, é claro, | pv se você quiser enviar o stdout para a ferramenta de monitoramento de progresso.

    
por 27.09.2016 / 23:50

Tags