dd executando além do final do dispositivo de entrada
Estou tentando dd
clonar um disco rígido que consertei. Estou tentando fazer uma dd
cópia de dados da unidade em blocos de 10 GB, mas estou transferindo mais dados do que a unidade deve conter. A própria unidade funciona e a partição nela pode ser montada.
Usando df -h
, obtive o tamanho da unidade de 1000204886016 bytes (unidade de 1 TB).
Eu tentei inicialmente:
sudo dd if=/dev/sdb of=/dev/sdd status=progress
No entanto, isso ficou lento para um rastreamento após cerca de 300 GB e, eventualmente, falhou devido a um erro de leitura. Decidi tentar copiá-lo em pedaços de 10 GB. Calculei que a leitura de 10 GB com um tamanho de bloco de 128kByte requer a cópia de 78125 blocos.
Para fazer isso, estou usando:
sudo dd if=/dev/sdb of=/dev/sdd bs=128k count=78125 status=progress oflag=seek_bytes seek=n
dd
estava relatando que 1.0240000000 bytes foram transferidos a cada vez. Para calcular o valor de busca para cada iteração, agreguei os bytes transferidos e subtraí 1 GB para garantir que houvesse alguma sobreposição. A sequência resultante é:
seek=0
seek=9240000000
seek=18480000000
seek=27720000000
seek=36960000000
...
seek=1071840000000
Eu os escrevi em um script de shell com comandos dd discretos e o executei. Deixei a última iteração livre para copiar todos os dados necessários.
sudo dd if=/dev/sdb of=/dev/sdd bs=128k count=78125 status=progress oflag=seek_bytes seek=0
sudo dd if=/dev/sdb of=/dev/sdd bs=128k count=78125 status=progress oflag=seek_bytes seek=9240000000
sudo dd if=/dev/sdb of=/dev/sdd bs=128k count=78125 status=progress oflag=seek_bytes seek=18480000000
sudo dd if=/dev/sdb of=/dev/sdd bs=128k count=78125 status=progress oflag=seek_bytes seek=27720000000
sudo dd if=/dev/sdb of=/dev/sdd bs=128k count=78125 status=progress oflag=seek_bytes seek=36960000000
...
sudo dd if=/dev/sdb of=/dev/sdd bs=128k status=progress oflag=seek_bytes seek=1071840000000
Ele deveria ter passado muito além do final da unidade naquela última iteração, no entanto, ele simplesmente continuou. O clone é montado, mas está claramente corrompido e com dados ausentes.
- Há algo errado com minha matemática ou com os argumentos que usei
dd
? - Existe uma maneira melhor de escrever um comando 'dd' para obter os dados em blocos de 10 GB?
Respostas
O problema é que você está supondo que seek
leva um valor de byte, quando na realidade leva uma contagem de bloco. Você deve estar usando seek=0
, 78125
, 156250
, etc.
No entanto, você pode simplificá-lo muito eliminando dd
:
split -b 10G < /dev/sdd
Estou tentando usar o dd para clonar um disco rígido que consertei
Não.
Em ddrescuevez disso, use , que lida bem com blocos ilegíveis e outros erros de mídia.
Descobri que o motivo da falha de minha solução foi não entender o que o sinalizador de busca fazia. Ele estava apenas mudando o local de gravação na unidade de saída. Portanto, o script estava apenas copiando os primeiros 10 GB continuamente para a saída. Nunca chegaria ao fim do dispositivo.
Para mudar a entrada, o sinalizador de ignorar também precisava ser usado:
sudo dd if=/dev/sdb of=/dev/sdd bs=128k count=78125 status=progress skip=n seek=n
Definir oflag=seek_bytes
e iflag=skip_bytes
permitirá que a matemática seja feita em bytes em vez de blocos.
No entanto, as opções apresentadas por roaima (use ddrescue) e aquele outro cara ( split -b 10G < /dev/sdd
) são a melhor maneira de recuperar drives danificados e realizar transferências segmentadas respectivamente.