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
dd
bs
,skip
,seek
econv=notrunc
para fazer o queddrescue
faz 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
ddrescue
e, em seguida, executarddrescue
para reler apenas fragmentos problemáticos da origem; consulteinfo ddrescue
na 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.