Não tenho uma solução simples para ddrescue .
EDIT: Não tenho uma solução tão simples agora.
Preparando o arquivo de destino
Você precisará saber o tamanho do disco rígido de origem na unidade de 512 bytes. Armazene em uma variável.
SIZE=$(sudo blockdev --getsz /dev/sdX)
O arquivo de destino deve ter o tamanho apropriado de antemão.
fallocate -l $((512*$SIZE)) /mnt/samba/share/target.dd
Preparando o dispositivo atrasado
Primeiro, você precisa de um dispositivo de loop.
sudo losetup -f /mnt/samba/share/target.dd
sudo losetup -a
O segundo comando informa qual dispositivo de loop está associado a target.dd . Aqui eu suponho que é /dev/loop0 .
Em seguida, você cria um dispositivo com o mapeador de dispositivos.
echo "0 $SIZE delay /dev/loop0 0 0 /dev/loop0 0 500" | sudo dmsetup create delayed_target
O número 500 neste exemplo indica que toda operação de gravação em /dev/mapper/delayed_target será atrasada em 500 ms. (Veja man dmsetup e este documento para detalhes.)
Leitura real
sudo ddrescue --force -D -c 2048 /dev/sdX /dev/mapper/delayed_target logfile.log
O comutador -c 2048 informa ddrescue para processar 2048 * 512 bytes de cada vez, ou seja, um megabyte. Por causa do programa -D omite o armazenamento em cache, etc., o qual reuniria muitas operações de gravação em uma única. Com -D , cada megabyte forma uma operação de gravação separada que atinge um atraso de 500 ms.
Ajustes
Um ajuste é alterar -c 2048 em ddrescue invocação. Outro - para alterar o atraso em dmsetup (consulte a seção Limpeza ).
Você sempre pode parar ddrescue com Ctrl + C , ajustar o atraso se necessário, executar novamente o ddrescue com o mesmo arquivo de log e talvez outro parâmetro -c - e ele continuará. Experimente encontrar valores que se ajustem às suas necessidades.
Limpeza
sudo dmsetup remove delayed_target
(Para ajustar o atraso, volte para dmsetup create agora.)
sudo losetup -d /dev/loop0
Nota
Em vez de atrasar gravações no arquivo de destino, você pode atrasar as leituras do dispositivo de origem. Parece ser uma maneira melhor, já que não há necessidade de um dispositivo de loop. No entanto, meus testes indicaram que há leituras imediatas do dispositivo de mapeamento recém-criado. Essas leituras atingem o atraso muitas vezes e bloqueiam dmsetup em si. Minha interpretação pode estar toda errada, ainda existe um atraso significativo após dmsetup create . Isso torna os ajustes (se não todos os procedimentos) praticamente impossíveis.
Minha resposta original:
Da minha experiência, ddrescue é significativamente melhor do que dd apenas se houver um erro de leitura. Se os seus discos estão geralmente em boa forma e você espera que os erros de leitura sejam raros, você pode usar dd com pv .
Exemplo:
dd if=/dev/sdb conv=sync,noerror bs=32M 2>dd.log | pv -L 4M > /mnt/samba/desktop/my-image.dd
O parâmetro noerror para dd faz com que continue após a ocorrência do erro de leitura, se houver; sync faz com que dd produza zeros nesse caso, então os dados bons depois são colocados com o deslocamento adequado dentro do arquivo de imagem. Eu prefiro bs grande para o desempenho do disco rígido. Note que com um erro tão grande de bs one read pode causar até 32MiB de zeros errados na imagem, então você pode precisar:
- jogue manualmente com a calculadora de bolso e as opções
ddbs,skip,seekeconv=notruncpara fazer o queddrescuefaz automaticamente: leia e salve o máximo possível, esperamos reduzir zeros errados para 512B ou 4096B por erro de leitura (esses números são tamanhos de setores comuns para discos). - ou jogar manualmente com a calculadora de bolso e criar um arquivo de log para
ddrescuee, em seguida, executarddrescuepara reler apenas fragmentos problemáticos da origem; consulteinfo ddrescuena estrutura do arquivo de log.
Em ambos os casos, um stderr salvo de dd será útil para localizar setores com problemas, portanto 2>dd.log de redirecionamento.
Coisa boa com pv é sua capacidade de alterar o limite de velocidade em tempo real (substituir o PID pelo pid do original pv usado com dd ):
pv -L 6M -R PID
Dessa forma, você pode ajustar o limite sem começar de novo.