web-development-kb-pt.site

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

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, estou tentando descobrir como usar rsync para continuar copiando o arquivo de onde parou da última vez.

Tentei usar a opção --partial Ou --inplace, Mas junto com --progress, Encontrei rsync com --partial Ou --inplace Começa do começo ao invés do que restou da última vez. Parar manualmente rsync cedo e 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 vi na página de manual--partial, --inplace E --append Parecem estar relacionados à retomada da cópia do que restou da última vez . Alguém é capaz de explicar a diferença? Por que --partial Ou --inplace Funcionam para retomar a cópia? É verdade que, para retomar a cópia, rsync precisa trabalhar com a opção --append?

Além disso, se um arquivo parcial foi deixado por mv ou cp, não pelo rsync, rsync --append Continuará a copiar corretamente o arquivo?

52
Tim

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, o que presume que os dados que já existem no lado de recebimento sejam idênticos ao início do arquivo no lado de envio. [ ...] implica --inplace, [...]

Opção --inplace faz com que rsync (over) escreva diretamente o conteúdo do arquivo de destino; sem--inplace, rsync:

  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 manual rsync.

Observe que, se uma operação de cópia/atualização falhar nas etapas 1.-3. acima, rsync excluirá o arquivo de destino temporário; a --partial opção desativa esse comportamento e rsync deixará 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ê tenha chamado o primeiro rsync com --partial ou --partial-dir (o mesmo efeito que --partial, além disso instrui rsync para criar todos os arquivos temporários em um diretório específico).

39
Riccardo Murri

Esteja ciente que --append implica --inplace, o que implica --partial.

  • Apenas usando --partial você deve fazer com que rsync deixe transferências parciais e retome-as nas tentativas subseqüentes.

  • Usando --append você deve fazer com que rsync deixe os arquivos parciais e os retome da próxima vez. Após a transferência, rsync deve verificar 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 --append ou --append-verify uma falha na verificação da soma de verificação deve fazer com que o arquivo seja retransmitido completamente (usando --inplace)

Você deve poder retomar uma operação mv ou cp com rsync, mas poderá usar o --append-verify opção de paz de espírito.

Observe que usando --append faz com que rsync copie apenas os arquivos cujo tamanho no receptor seja menor que o tamanho no remetente (independentemente do tempo selos) ou estão 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 de manual

21
TomG

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

6
Steve Byrne

Você estava fazendo certo --partial faz o que você 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. O --append opção é perigosa e resultará em um arquivo corrompido se os dados não corresponderem por algum motivo.

2
David Schwartz

Por padrão, rsync ativará --whole-file se 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

Combinando isso com --inplace ou --partial permitirá retomar a transferência posteriormente.

Meu alias para usar rsync para copiar é:

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

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

1
Tom Hale