Como posso diminuir o rsync?

35

Estou tentando copiar o conteúdo de um pen drive USB com falha. Se eu ler os dados muito rápido, o chip do controlador da unidade superaquecerá e a unidade desaparecerá do sistema. Quando isso acontece, preciso desconectar a unidade, aguardar mais ou menos um minuto para que ela esfrie, reconectá-la e reiniciar a cópia.

Eu tenho um backup antigo do conteúdo da unidade, então a maneira óbvia de obter o restante dos dados é usar rsyncpara atualizar o backup, mas isso ocorre em toda a leitura "muito rápido, a unidade desaparece e preciso começar de novo ". Existe uma maneira de dizer rsyncpara ler apenas X megabytes de dados por minuto? Como alternativa, é possível pedir para suspender as operações quando a unidade desaparecer e continuar quando for reconectada?

Marca
fonte
24
Você já pensou em resfriar a unidade?
AEonAX
3
Quão cheia está a unidade? Se a unidade estiver com mais de 50% de capacidade, é melhor espelhar a unidade com falha primeiro e depois começar a lidar com coisas mais complicadas no espelho.
kasperd
1
@AEonAX: Embora seja uma idéia legal (sic!) Pronta para uso, eu não recomendaria isso: você está colocando um estresse térmico adicional no dispositivo, e ele pode falhar completamente.
Piskvor

Respostas:

46

Diferentemente da experiência do DopeGhoti, a --bwlimitflag limita a transferência de dados, com o meu rsync (v3.1.2).

teste:

$ dd if=/dev/urandom bs=1M count=10 of=data
10+0 records in
10+0 records out
10485760 bytes (10 MB, 10 MiB) copied, 0.0871822 s, 120 MB/s

$ du -h data
10M     data

$ time rsync -q data fast
0.065 seconds

$ time rsync -q --bwlimit=1M data slow
10.004 seconds

(nota: minha timesaída parece diferente da maioria das timechamadas ( zshrecurso), esses horários não foram editados por mim)

Else, talvez algo ao longo das linhas de um duplo -execno find. Eu acredito que rsync -Rdeve criar e copiar as pastas pai, mas se não, então cp --parentsdeve.

$ find /failing/usb -exec rsync -R {} /somewhere/safe/ \; -exec sleep 1 \;

Nota : verifique também ddrescue , pode estar certo o que você está procurando :)

menino de damasco
fonte
1
Sim. A DG pode ter ficado confusa com a palavra "largura de banda" - mas isso se aplica a qualquer canal de transmissão de dados, não apenas à rede. A página de manual diz especificamente:, --bwlimit=KBPS limit I/O bandwidth; KBytes per secondnenhuma menção à rede. A navegação casual do código limita a velocidade de leitura , independentemente do destino. Além disso, anedota: uso esta opção há anos para limitar a velocidade de gravação local para local. linux.die.net/man/1/rsync
Piskvor
1
Ok, na segunda olhada, ele realmente conta o número de bytes gravados e dorme por um tempo calculado. io.c, linhas 832-3: if (bwlimit_writemax) sleep_for_bwlimit(n);De qualquer forma, isso provavelmente funcionaria como pretendido, lendo em pequenas rajadas e dormindo no meio. Eu recomendaria começar com um valor baixo e aumentar cuidadosamente, ou apenas deixar a lenta transferência passar da noite para o dia.
Piskvor
25

Um pouco de uma solução MacGyver, mas tive um bom sucesso com ela no passado:
coloque um hub USB 1 antigo entre o stick e o computador. De jeito nenhum ele vai copiar rápido dessa maneira :-)

Outra possibilidade: se você tiver outro stick disponível, coloque-o em outra porta USB conectada ao mesmo hub raiz (para compartilhar a largura de banda com o stick com problema).
Agora inicie uma grande operação de gravação no stick extra, para que ambos estejam competindo pela largura de banda. Para maior controle, você pode usar o ionice para diminuir ainda mais a prioridade no stick do problema.

Tonny
fonte
1
Tenho certeza de que deve haver uma maneira de fazer com que as portas funcionem como USB 1.1 por meio de uma solução de software, possivelmente dando opções ao módulo do kernel USB.
André Borie
@ AndréBorie: Existe - bbs.archlinux.org/viewtopic.php?pid=1342593#p1342593 , mas como existem aceleradores eficazes no SW, essa é uma solução de força bruta.
Piskvor
@Piskvor negocia uma taxa de transferência mais baixa com o dispositivo, como faria um hub USB 1. Não vejo nada de "força bruta" nisso.
André Borie
Ok, má escolha da palavra, eu admito. Mas os dispositivos de reconfiguração do IMHO exigiriam privilégios especiais (raiz ou pelo menos% adm), enquanto o controle da velocidade de leitura por processo seria mais simples. (Além disso, existem dispositivos que não conseguem fora do trabalho USB 2.0 em tudo - em violação da especificação)
Piskvor
13

Você pode usar rsync --bwlimit=RATEpara acelerar a velocidade de transferência de arquivos que, com base nos comentários abaixo, parece funcionar especificamente ao limitar a velocidade de leitura dos dados, que é exatamente o que você está procurando.

DopeGhoti
fonte
6
ionice? linux.die.net/man/1/ionice
steve
3
O ionice apenas dá prioridade, se duas coisas estão sendo lidas, por padrão, elas recebem 50/50. O ionice pode ajustar isso, mas se houver apenas uma coisa lendo, receberá 100%.
Coteyr
@coteyr Você está certo e é por isso que você precisa combiná-lo com um segundo processo de comer largura de banda no mesmo hub raiz USB. Veja minha resposta.
Tonny
2
Felizmente, sua resposta está incorreta: --bwlimitdefine o limite de E / S, não necessariamente um limite de rede . Testado várias vezes em vários cenários: essa opção faz com que o rsync se limite à leitura , independentemente do destino. (Descobri isso em um cenário semelhante, onde as gravações rápidas para um dispositivo local lento fez falhar)
Piskvor
1
@piskvor - obrigado por isso! É o que eu amo nesse lugar; Eu continuo aprendendo coisas novas (:
DopeGhoti
8

Além de soluções, além rsync --bwlimit=100de 100KiB / s.

  1. Use ddrescuecom a --max-read-rateopção para uma cópia completa do disco. Isso também permitirá que você reinicie uma cópia completa do disco, onde parou após um erro.

    ddrescue --max-read-rate=100K /failing/usb output.img output.logfile
    

ddrescuetambém possui muitas outras opções relevantes para a recuperação de dados, consulte o manual aqui .

  1. Use pv("visualizador de tubos") com a --rate-limitopção ou a throttleferramenta para classificar tubos limite. pvtambém pode mostrar progresso. Você pode fazer isso funcionar para qualquer ferramenta que use um tubo ou um tubo:

    tar -cf - /failing/usb | throttle -K 100 | tar -C /your/outputfolder/ -xvf -
    

    ou

    tar -cf - /failing/usb | pv --rate-limit 100k | tar -C /your/outputfolder/  -xvf -
    

    Dê uma olhada na página de manual pv para mais configurações e exemplos. Para throttle, você também pode experimentar a -wopção, que determina como a velocidade é calculada, consulte a página de manual do acelerador .

jmiserez
fonte
Agora que é uma ferramenta útil, não sabia disso, obrigado! pvmanpage tem ainda mais exemplos de vários usos.
Piskvor
Eu alcancei pv repetidamente desde que descobri nos dias de gravação de fitas. Voltar quando o tar gravou em unidades de fita. :)
Dan Garthwaite