Intencionalmente reduz a velocidade do ddrescue

1

(pôster da primeira vez) Eu quero diminuir a velocidade com que o ddrescue copia os dados. Estou visualizando um disco rígido do meu laptop linux para a área de trabalho do Windows. O ddrescue é capaz de rodar mais rápido do que o meu computador pode baixar o que ele dá, então está sufocando a internet do meu computador. Eu imagino coisas assim ocasionalmente, e quero saber se há uma maneira de sufocar o ddrescue um pouco, seja na área de trabalho do Windows ou no laptop linux. (Windows 10, Parted Magic)

Obrigado pela sua ajuda?

    
por McKittrick Swindle 28.05.2015 / 03:43

1 resposta

0

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 e conv=notrunc para fazer o que ddrescue 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, executar ddrescue para reler apenas fragmentos problemáticos da origem; consulte info 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.

    
por 14.04.2016 / 10:53