Retomar a transferência de um único arquivo pelo rsync

52

No Ubuntu, quero copiar um arquivo grande do meu disco rígido para um disco removível por rsync. Por algum outro motivo, a operação não pode ser concluída em uma única execução. Então, eu estou tentando descobrir como usar rsyncpara continuar copiando o arquivo de onde parou da última vez.

Tentei usar a opção --partialou --inplace, mas junto com --progress, descobri rsynccom --partialou --inplacerealmente inicia desde o início, em vez do que restou da última vez. Parar manualmente rsynce verificar o tamanho do arquivo recebido também confirmou o que encontrei.

Mas com --append, o rsync começa com o que restou da última vez.

Estou confuso como eu vi na página do homem --partial , --inplacee --appendparecem se relacionar com a retomada copiando a partir do que foi deixado pela última vez. Alguém é capaz de explicar a diferença? Por que não fazer --partialou --inplacede trabalho para retomar a cópia? É verdade que, para retomar a cópia, rsynctem que trabalhar com a --appendopção?

Além disso, se um arquivo parcial foi deixado mvou cpnão pelo rsync, a rsync --appendcópia do arquivo será retomada corretamente?

Tim
fonte

Respostas:

39

Para retomar uma cópia interrompida, você deve usar rsync --append. Na explicação da página de manual sobre --append:

Isso faz com que o rsync atualize um arquivo anexando dados ao final do arquivo, que pressupõe que os dados que já existem no lado de recebimento são idênticos ao início do arquivo no lado de envio. [...] implica --inplace, [...]

A opção --inplacefaz rsync(sobre) escrever diretamente o conteúdo do arquivo de destino; sem --inplace , rsyncseria:

  1. crie um novo arquivo com um nome temporário,
  2. copiar conteúdo atualizado nele,
  3. troque-o pelo arquivo de destino e, finalmente,
  4. exclua a cópia antiga do arquivo de destino.

O modo normal de operação evita principalmente conflitos com aplicativos que podem ter o arquivo de destino aberto e alguns outros contratempos devidamente listados na página de rsyncmanual.

Observe que, se uma operação de cópia / atualização falhar nas etapas 1.-3. acima, rsyncexcluirá o arquivo de destino temporário; a --partial opção desativa esse comportamento e rsyncdeixa arquivos temporários parcialmente transferidos no sistema de arquivos de destino. Portanto, retomar uma operação de cópia de arquivo único não ganhará muito, a menos que você chame a primeira rsynccom --partialou --partial-dir(o mesmo efeito que --partial, além disso, instrui rsync a criar todos os arquivos temporários em um diretório específico).

Riccardo Murri
fonte
Obrigado! Se um arquivo parcial foi deixado pelo mv ou o cp não pelo rsync, o rsync --append retomará corretamente a cópia do arquivo?
Tim
11
@ Tim Em suma, --appendmarcas rsyncacreditam que, se dois arquivos correspondentes têm comprimento diferente, então o mais curto é idêntica à parte inicial do longa. Portanto, sim, se você começar a copiar um arquivo grande cpe interromper o processo de cópia, rsync --appendcopiará apenas a parte restante do arquivo. ( Nota: se cpfor interrompido por uma falha no sistema, há uma pequena chance de que o conteúdo e os metadados do arquivo não estejam sincronizados, ou seja, o arquivo está corrompido. Nesse caso, executar rsyncnovamente sem --append corrigir o problema.)
Riccardo Murri
2
Então, se eu entendi isso corretamente, não há como dizer ao rsync para verificar um arquivo parcial e retomar a transferência para esse arquivo parcialmente transferido ?
21714 Winny
11
@ Winny, muito tardiamente: para uma cópia local, não há uma maneira sensata de fazer isso. Para uma cópia em rede, este é o modo padrão quando você especifica --partialsem --append.
roaima
11
@ Winny --appende --append-verifytem um caso de falha perigosa: quando o arquivo do receptor é do mesmo tamanho ou maior, mas possui dados diferentes. Sugiro uma solução baseada em seu--no-whole-file lugar.
Tom Hale
21

Esteja ciente de que --appendimplica --inplace, o que implica --partial.

  • Ao usá- --partiallo, você deve rsyncdeixar transferências parciais e recomeçá-las nas tentativas subsequentes.

  • Ao usar, --appendvocê deve rsyncdeixar os arquivos parciais e recomeçá-los na próxima vez. Após a transferência rsync, verifique apenas a soma de verificação dos dados transmitidos.

  • --append-verify inclui o arquivo inteiro na verificação da soma de verificação, incluindo qualquer parte transferida em uma transferência anterior.

  • Com uma --appendou --append-verifyuma falha na verificação da soma de verificação, o arquivo deve ser retransmitido completamente (usando --inplace)

Você poderá retomar uma operação mvou cp, rsyncmas poderá usar a --append-verifyopção para ter tranqüilidade.

Observe que o uso --appendfaz rsynccom que copiar apenas os arquivos cujo tamanho no receptor seja menor que o tamanho no remetente (independentemente dos carimbos de data / hora) ou que estejam ausentes no receptor. Pela documentação desta opção:

Se um arquivo precisar ser transferido e seu tamanho no receptor for igual ou maior que o tamanho no remetente, o arquivo será ignorado.

Mais informações na página do manual

TomG
fonte
--appende --append-verifytem um caso de falha perigosa: quando o arquivo do receptor é do mesmo tamanho ou maior, mas possui dados diferentes. Sugiro uma solução baseada em seu--no-whole-file lugar.
Tom Hale
A documentação do @TomHale sugere que, para que um arquivo seja pulado, ele precisa ter exatamente o mesmo tamanho e tempo de modificação nas duas extremidades. Se essa é uma preocupação plausível, --checksumdeve ser usada. Não consigo encontrá-lo especificado explicitamente, mas logicamente qualquer uma das opções de retomada deve implicar --no-whole-fileporque --whole-filedeve ser incompatível.
TomG 7/10
--append-verifypula arquivos de tamanho igual ou maior com datas diferentes , o que pode ser "inesperado". Não há necessidade de --checksum todos os arquivos, pois rsyncele fará uma soma de verificação de arquivo inteiro, mas apenas no que ele é transferido.
Tom Hale
--checksuminforma rsyncà soma de verificação dos arquivos antes do envio, o que garante que todos os arquivos alterados sejam transferidos, independentemente do tamanho / hora. Você tem uma fonte para o --append-verifycomportamento inesperado , pois o que você descreve não corresponde à documentação ou à minha experiência (limitada)?
TomG
--append-verifyrefere-se ao --appendque diz: If a file needs to be transferred and its size on the receiver is the same or longer than the size on the sender, the file is skipped.Mesmo que um arquivo precise ser transferido por causa --checksumdisso, ele ainda pode ser ignorado.
Tom Hale
6

David Schwartz está correto --partial(ou melhor -P) faz o que você deseja. Eu verifiquei isso em um arquivo 37G que foi parado ~ 8g nele, em uma rede. O rsync examinou rapidamente as primeiras partes do parcial (mostrando o progresso que estava ocorrendo graças a -P) e, em seguida, retomou a transferência para o final do arquivo parcial.

Steve Byrne
fonte
Uma cópia de rede é tratada de maneira diferente de uma cópia local, que é o problema aqui.
roaima
@roaima Você tem uma fonte para isso ou um documento que explica com mais detalhes quais são as diferenças? Não consigo encontrá-lo na (enorme) página de manual.
Jonas Schäfer
@JonasWielicki, a página de manual faz alusão a ele na --whole-filedescrição da opção.
roaima 04/02
@roaima Muito obrigado! Isto também significa que a solução adequada é --no-W(que realmente funciona!)
Jonas Schäfer
@JonasWielicki é extremamente ineficiente, e é por isso que está desativado por padrão. Você realmente não deseja usar, a --no-Wmenos que entenda exatamente o que isso significa para os arquivos locais. Veja unix.stackexchange.com/a/181018/100397
roaima
2

Você estava fazendo certo, --partialfaz o que quer. Parece estar começando do início, porque sempre começa no início da lista de blocos de dados de arquivo que ele precisa copiar. A --appendopção é perigosa e resultará em um arquivo corrompido se os dados não corresponderem por algum motivo.

David Schwartz
fonte
As cópias locais não são comparadas, elas são simplesmente substituídas (ou --appendcontinuadas a partir do deslocamento de bytes).
roaima
1

Por padrão, rsyncserá ativado --whole-filese estiver transferindo do disco local para o disco local. Isso reiniciará uma transferência interrompida desde o início, em vez de verificar as partes que já estão lá.

Para desativar isso, use:

--no-whole-file

Combinar isso com --inplaceou --partialpermitirá retomar a transferência posteriormente.

Meu alias para usar rsyncpara copiar é:

rscp='rsync -ax --inplace --sparse --no-whole-file --protect-args'

Aviso : tenha cuidado ao usar --append-verify, pois pulará qualquer arquivo de destino que seja do mesmo tamanho ou maior.

Tom Hale
fonte
Para transferências de rede, rsynccompare os arquivos de origem e de destino correspondentes antes da transferência para enviar apenas as partes que foram alteradas (transferência delta). --no-whole-filemanda rsyncfazer o mesmo para a cópia local para local. A documentação não sugere que isso afetaria a retomada de transferências parciais de arquivos únicos. rsyncpulará arquivos com exatamente o mesmo tamanho e timestamps por design. Nem --append-verifynem --no-whole-filedeve mudar esse comportamento, mas --checksumdeve funcionar com qualquer um para a paz de espírito ao custo de IO de disco
TomG
--append-verifypula arquivos de tamanho igual ou maior com datas diferentes , o que pode ser "inesperado". Não há necessidade de --checksum todos os arquivos, pois rsyncele fará uma soma de verificação de arquivo inteiro, mas apenas no que ele é transferido.
Tom Hale