Prima di tutto, per quanto riguarda la parte "riprendi" della tua domanda, --partial
basta dire all'estremità ricevente di conservare i file parzialmente trasferiti se l'estremità di invio scompare come se fossero completamente trasferiti.
Durante il trasferimento di file, vengono temporaneamente salvati come file nascosti nelle loro cartelle di destinazione (ad es. .TheFileYouAreSending.lRWzDC
) O in una cartella scelta in modo specifico se si imposta l' --partial-dir
opzione. Quando un trasferimento fallisce e --partial
non è impostato, questo file nascosto rimarrà nella cartella di destinazione con questo nome criptico, ma se --partial
impostato, il file verrà rinominato con il nome del file di destinazione effettivo (in questo caso TheFileYouAreSending
), anche se il file non è completo. Il punto è che in seguito è possibile completare il trasferimento eseguendo di nuovo rsync con --append
o --append-verify
.
Quindi, --partial
non significa in sé riprendere un trasferimento non riuscito o annullato. Per riprenderlo, dovrai usare uno dei suddetti flag nella prossima corsa. Quindi, se devi assicurarti che la destinazione non contenga mai file che sembrano andare bene ma che in realtà sono incompleti, non dovresti usare --partial
. Al contrario, se vuoi assicurarti di non lasciarti mai alle spalle file randagi non riusciti che sono nascosti nella directory di destinazione e sai che sarai in grado di completare il trasferimento in un secondo momento, --partial
è lì per aiutarti.
Per quanto riguarda l' --append
opzione sopra menzionata, questa è la vera opzione "riprendi" e puoi usarla anche se stai usando --partial
. In realtà, quando si utilizza --append
, non vengono mai creati file temporanei. I file vengono scritti direttamente nei loro target. A questo proposito, --append
fornisce lo stesso risultato di --partial
un trasferimento non riuscito, ma senza creare quei file temporanei nascosti.
Quindi, per riassumere, se stai spostando file di grandi dimensioni e desideri che l'opzione riprenda un'operazione rsync annullata o non riuscita dal punto esatto in cui è stata rsync
interrotta, devi utilizzare --append
o --append-verify
passare al tentativo successivo.
Come sottolineato da @Alex di seguito, poiché la versione 3.0.0 rsync
ora ha una nuova opzione --append-verify
, che si comporta come --append
prima che esistesse quel passaggio. Probabilmente vuoi sempre il comportamento di --append-verify
, quindi controlla la tua versione con rsync --version
. Se sei su un Mac e non lo usi rsync
da homebrew
, avrai (almeno fino a El Capitan incluso) una versione precedente e dovrai usare --append
piuttosto che --append-verify
. Il motivo per cui non hanno mantenuto il comportamento --append
e invece hanno nominato il nuovo arrivato --append-no-verify
è un po 'sconcertante. In entrambi i casi, --append
sulla rsync
prima versione 3 è lo stesso che --append-verify
sulle versioni più recenti.
--append-verify
non è pericoloso: leggerà e confronterà sempre i dati su entrambe le estremità e non solo supporrà che siano uguali. Lo fa usando checksum, quindi è facile sulla rete, ma richiede la lettura della quantità condivisa di dati su entrambe le estremità del filo prima che possa effettivamente riprendere il trasferimento aggiungendo alla destinazione.
In secondo luogo, hai detto che "hai sentito che rsync è in grado di trovare le differenze tra origine e destinazione e quindi di copiarle".
È corretto e si chiama delta transfer, ma è una cosa diversa. Per abilitarlo, aggiungi l' opzione -c
o --checksum
. Una volta utilizzata questa opzione, rsync esaminerà i file esistenti su entrambe le estremità del filo. Lo fa a blocchi, confronta i checksum su entrambe le estremità e, se differiscono, trasferisce solo le diverse parti del file. Ma, come sottolineato da @Jonathan di seguito, il confronto viene effettuato solo quando i file hanno le stesse dimensioni su entrambe le estremità - dimensioni diverse causeranno rsync per caricare l'intero file, sovrascrivendo la destinazione con lo stesso nome.
Ciò richiede inizialmente un po 'di calcolo su entrambe le estremità, ma può essere estremamente efficiente nel ridurre il carico di rete se, ad esempio, si esegue spesso il backup di file molto grandi file di dimensioni fisse che spesso contengono modifiche minori. Esempi che vengono in mente sono i file di immagine del disco rigido virtuale utilizzati in macchine virtuali o destinazioni iSCSI.
È da notare che se si utilizza --checksum
per trasferire un batch di file completamente nuovi nel sistema di destinazione, rsync calcolerà comunque i loro checksum sul sistema di origine prima di trasferirli. Perchè non lo so :)
Quindi, in breve:
Se stai usando spesso rsync per solo "spostare roba da A a B" e vogliono la possibilità di annullare questa operazione e poi riprenderlo, non usare --checksum
, ma non usare --append-verify
.
Se stai usando rsync per eseguire il backup delle cose spesso, --append-verify
probabilmente non farà molto per te, a meno che tu non abbia l'abitudine di inviare file di grandi dimensioni che aumentano continuamente di dimensioni ma raramente vengono modificati una volta scritti. Come suggerimento bonus, se si esegue il backup su uno spazio di archiviazione che supporta snapshot come btrfs
o zfs
, l'aggiunta dello --inplace
switch consente di ridurre le dimensioni dello snapshot poiché i file modificati non vengono ricreati, ma i blocchi modificati vengono scritti direttamente su quelli precedenti. Questa opzione è utile anche se si desidera evitare che rsync crei copie di file sulla destinazione quando si sono verificate solo piccole modifiche.
Durante l'utilizzo --append-verify
, rsync si comporterà come sempre su tutti i file della stessa dimensione. Se differiscono per modifiche o altri timestamp, sovrascriveranno la destinazione con l'origine senza esaminare ulteriormente quei file. --checksum
confronterà il contenuto (checksum) di ogni coppia di file con nome e dimensioni identici.
01/09/2015 AGGIORNATO Modificato per riflettere i punti sollevati da @Alex (grazie!)
AGGIORNATO 14/07/2017 Modificato per riflettere i punti sollevati da @Jonathan (grazie!)