Riprendi il trasferimento di un singolo file tramite rsync


52

In Ubuntu, voglio copiare un grosso file dal mio disco rigido su un disco rimovibile da rsync. Per qualche altro motivo, l'operazione non può essere completata in un'unica esecuzione. Quindi sto cercando di capire come usare rsyncper riprendere a copiare il file da dove era stato interrotto l'ultima volta.

Ho provato a usare l'opzione --partialo --inplace, ma insieme a --progress, ho trovato rsynccon --partialo --inplaceeffettivamente inizia dall'inizio invece che da quello che era rimasto l'ultima volta. L'arresto manuale rsyncanticipato e il controllo delle dimensioni del file ricevuto hanno confermato anche ciò che ho trovato.

Ma con --append, rsync parte da ciò che era rimasto l'ultima volta.

Sono confuso come ho visto sulla pagina man --partial , --inplacee --appendsembra di riferirsi a riprendere la copia da quello che è stato lasciato l'ultima volta. Qualcuno è in grado di spiegare la differenza? Perché non lavorare --partialo --inplaceriprendere a copiare? È vero che per riprendere a copiare bisogna rsynclavorare con l' --appendopzione?

Inoltre, se un file parziale è stato lasciato da mvo cp, non da rsync, rsync --appendriprenderà correttamente a copiare il file?

Risposte:


39

Per riprendere una copia interrotta, è necessario utilizzare rsync --append. Dalla spiegazione della pagina man di --append:

Questo fa sì che rsync aggiorni un file aggiungendo i dati alla fine del file, il che presume che i dati già esistenti sul lato ricevente siano identici all'inizio del file sul lato di invio. [...] Implica --inplace, [...]

L'opzione --inplaceconsente rsync(sopra) di scrivere direttamente il contenuto del file di destinazione; senza --inplace , rsyncsarebbe:

  1. crea un nuovo file con un nome temporaneo,
  2. copia il contenuto aggiornato al suo interno,
  3. scambiarlo con il file di destinazione e infine
  4. elimina la vecchia copia del file di destinazione.

La normale modalità operativa previene principalmente i conflitti con le applicazioni che potrebbero avere il file di destinazione aperto e alcuni altri inconvenienti che sono debitamente elencati nella rsyncmanpage.

Si noti che, se un'operazione di copia / aggiornamento non riesce nei passaggi 1.-3. sopra, rsynceliminerà il file di destinazione temporaneo; l' --partial opzione disabilita questo comportamento e rsynclascerà i file temporanei parzialmente trasferiti sul filesystem di destinazione. Pertanto, riprendere un'operazione di copia di un singolo file non guadagnerà molto a meno che non sia stato chiamato il primo rsynccon --partialo --partial-dir(lo stesso effetto di --partial, inoltre, indica rsync di creare tutti i file temporanei in una directory specifica).


Grazie! Se un file parziale è stato lasciato da mv o cp non da rsync, rsync --append riprenderà correttamente la copia del file?
Tim

1
@Tim In breve, --appendfa rsynccredere che, se due file corrispondenti hanno una lunghezza diversa, quella più corta è identica alla parte iniziale di quella più lunga. Quindi, sì, se inizi a copiare un file di grandi dimensioni con cpe interrompi il processo di copia, rsync --appendcopierà solo la parte rimanente del file. ( Nota: se cpviene interrotto da un arresto anomalo del sistema, vi è una piccola possibilità che il contenuto del file e i metadati non siano sincronizzati, ovvero che il file sia danneggiato. In questo caso, eseguirlo rsyncancora una volta senza --append risolvere il problema.)
Riccardo Murri,

2
Quindi, se lo capisco correttamente, non c'è modo di dire a rsync di verificare un file parziale e riprendere il trasferimento a quel file parzialmente trasferito ?
Winny,

1
@Winny, molto in ritardo: per una copia locale non c'è modo sensato per farlo. Per una copia di rete questa è la modalità predefinita quando si specifica --partialsenza --append.
roaima,

1
@Vinci --appende --append-verifyhai un caso di errore pericoloso: quando il file del destinatario ha le stesse dimensioni o più grande ma ha dati diversi. Suggerisco invece una soluzione basata su--no-whole-file .
Tom Hale,

21

Sii consapevole che --appendimplica --inplace, che implica esso stesso --partial.

  • Usando semplicemente --partialdovresti rsynclasciare i trasferimenti parziali e riprenderli nei tentativi successivi.

  • Usando --appendsi dovrebbe rsynclasciare entrambi i file parziali e riprenderli la prossima volta. Dopo il trasferimento rsyncdovrebbe verificare solo il checksum dei dati trasmessi.

  • --append-verify include l'intero file nella verifica del checksum, inclusa qualsiasi parte trasferita in un trasferimento precedente.

  • Con una --appendo --append-verifyuna verifica del checksum non riuscita, il file dovrebbe essere ritrasmesso completamente (utilizzando --inplace)

Dovresti essere in grado di riprendere un'operazione mvo cpcon rsyncma potresti voler usare l' --append-verifyopzione per la tranquillità.

Si noti che l'utilizzo --appendcausa la rsynccopia solo di quei file che hanno le dimensioni sul ricevitore più brevi delle dimensioni sul mittente (indipendentemente dai timestamp) o che sono assenti sul ricevitore. Dalla documentazione su questa opzione:

Se un file deve essere trasferito e la sua dimensione sul destinatario è uguale o più lunga della dimensione sul mittente, il file viene ignorato.

Maggiori informazioni nella pagina man


--appende --append-verifypresentano un caso di errore pericoloso: quando il file del destinatario ha le stesse dimensioni o è più grande ma ha dati diversi. Suggerisco invece una soluzione basata su--no-whole-file .
Tom Hale,

@TomHale la documentazione suggerisce che per saltare un file dovrebbe avere esattamente la stessa dimensione e il tempo di modifica su entrambe le estremità. Se questa è una preoccupazione plausibile, allora --checksumdovrebbe essere usato. Non riesco a trovarlo specificato in modo esplicito, ma logicamente nessuna delle opzioni che possono essere ripristinate dovrebbe implicare --no-whole-fileperché --whole-filedovrebbe essere incompatibile.
TomG

--append-verifysalterà i file di dimensioni uguali o più grandi con date diverse , che potrebbero essere "imprevisti". Non è necessario per --checksum tutti i file, come rsyncfarà comunque un checksum di un intero file, ma solo su ciò che trasferisce.
Tom Hale,

--checksumcomunica rsyncal checksum i file prima dell'invio, il che garantisce che tutti i file modificati vengano trasferiti, indipendentemente dalle dimensioni / dal tempo. Hai una fonte per il --append-verifycomportamento imprevisto in quanto ciò che descrivi non corrisponde alla documentazione o alla mia (limitata) esperienza?
TomG

--append-verifysi riferisce a ciò --appendche dice: 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.Anche se un file deve essere trasferito a causa di --checksum, potrebbe ancora essere ignorato.
Tom Hale,

6

David Schwartz ha ragione --partial(o meglio -P) fa quello che vuoi. Ho verificato questo su un file 37G che è stato interrotto ~ 8g in esso, su una rete. rsync ha rapidamente scansionato le prime parti del parziale (mostrando i progressi fatti grazie a -P), quindi ha ripreso il trasferimento alla fine del file parziale.


Una copia di rete viene trattata in modo diverso da una copia locale, che è il problema qui.
roaima,

@roaima Hai una fonte per questo o un documento che spiega più in dettaglio quali sono le differenze? Non riesco a trovarlo nella (enorme) manpage.
Jonas Schäfer,

@JonasWielicki la pagina man allude ad essa sotto la --whole-filedescrizione dell'opzione.
roaima,

@roaima Grazie mille! Questo significa anche che la soluzione corretta è --no-W(che funziona davvero!)
Jonas Schäfer

@JonasWielicki è estremamente inefficiente, motivo per cui è disabilitato per impostazione predefinita. Non vuoi davvero usarlo a --no-Wmeno che tu non capisca esattamente cosa significa l'impostazione per i file locali. Vedi unix.stackexchange.com/a/181018/100397
roaima

2

Lo stavi facendo bene, --partialfa quello che vuoi. Sembra iniziare dall'inizio perché inizia sempre all'inizio dell'elenco di blocchi di dati di file che deve copiare. L' --appendopzione è pericolosa e si tradurrà in un file danneggiato se i dati non corrispondono per qualche motivo.


Le copie locali non vengono confrontate, vengono semplicemente sovrascritte (o --appendproseguite dall'offset di byte).
roaima,

1

Per impostazione predefinita, rsyncverrà abilitato --whole-filese il trasferimento dal disco locale al disco locale. Questo riavvierà un trasferimento interrotto dall'inizio, piuttosto che controllare le parti che sono già lì.

Per disabilitarlo, utilizzare:

--no-whole-file

La combinazione di questo con uno --inplaceo --partialconsentirà di riprendere il trasferimento in un secondo momento.

Il mio alias per usare rsyncper copiare è:

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

Attenzione : fare attenzione all'utilizzo --append-verifyin quanto salterà qualsiasi file di destinazione che abbia la stessa dimensione o più grande.


Per i trasferimenti in rete rsyncconfronta i file di origine e di destinazione corrispondenti prima del trasferimento per inviare solo le parti che sono state modificate (delta-transfer). --no-whole-filedice rsyncdi fare la stessa cosa per la copia da locale a locale. La documentazione non suggerisce che avrebbe alcun effetto sulla ripresa dei trasferimenti parziali di singoli file. rsyncsalterà i file con le stesse dimensioni e timestamp esattamente di progettazione. Né --append-verify, né --no-whole-filedovrebbe modificare l'azione, ma --checksumdovrebbe funzionare con entrambi per la pace della mente a costo di IO disco
TomG

--append-verifysalterà i file di dimensioni uguali o più grandi con date diverse , che potrebbero essere "imprevisti". Non è necessario per --checksum tutti i file, come rsyncfarà comunque un checksum di un intero file, ma solo su ciò che trasferisce.
Tom Hale,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.