Rsync verifica i file copiati tra due unità locali?


65

Voglio fare una nuova copia di un gran numero di file da un'unità locale a un'altra.

Ho letto che rsync esegue un confronto di checksum dei file quando li invia a una macchina remota su una rete.

  1. Rsync farà il confronto quando si copiano i file tra due unità locali?

  2. Se effettua una verifica, è una scommessa sicura? O è meglio fare un confronto byte per byte?

Risposte:


77

rsync utilizza sempre i checksum per verificare che un file sia stato trasferito correttamente. Se il file di destinazione esiste già, rsync potrebbe saltare l'aggiornamento del file se il tempo e le dimensioni della modifica corrispondono al file di origine, ma se rsync decide che i dati devono essere trasferiti, i checksum vengono sempre utilizzati sui dati trasferiti tra i processi rsync di invio e ricezione . Ciò verifica che i dati ricevuti siano gli stessi dei dati inviati con alta probabilità, senza il pesante sovraccarico di un confronto a livello di byte sulla rete.

Una volta ricevuti i dati del file, rsync scrive i dati nel file e confida che se il kernel indica una scrittura corretta, i dati sono stati scritti senza corruzione sul disco. rsync non rilegge i dati e li confronta con il checksum noto come controllo aggiuntivo.

Per quanto riguarda la verifica stessa, per il protocollo 30 e oltre (inizialmente supportato in 3.0.0), rsync utilizza MD5 . Per i protocolli meno recenti, il checksum utilizzato è MD4 .

Sebbene a lungo considerato obsoleto per hash crittografici sicuri, MD5 e MD4 rimangono adeguati per controllare la corruzione dei file.

Fonte: la pagina man e il bulbo oculare del codice sorgente rsync da verificare.


3
Odio far esplodere la bolla di tutti, ma rsync controlla la verifica della somma solo se viene aggiunto il flag -c!

27
@clint No, la risposta è corretta. Dalla spiegazione della -cbandiera della pagina man : "Nota che rsync verifica sempre che ogni file trasferito sia stato correttamente ricostruito sul lato ricevente controllando un checksum di tutto il file che viene generato mentre il file viene trasferito, ma quel post-trasferimento automatico la verifica non ha nulla a che fare con questa opzione prima del trasferimento "È necessario aggiornare questo file?" selezionare ".
Michael Mrozek

7
Questa risposta non chiarisce se verifica effettivamente il file dopo una copia. Se il checksum viene calcolato mentre il file viene ricevuto, allora non è un checksum post-copia e non si può essere certi che il file sia scritto correttamente. Dovresti quindi eseguire un confronto aggiuntivo.
Andre Miller,

7
Votazione negativa perché non mi piace il fatto che questa risposta sia dettagliata e ben scritta e tecnicamente corretta e allo stesso tempo così fuori tema da indurre in errore i lettori. Il problema è che la risposta è molto dettagliata su ciò che accade durante il trasferimento, mentre l'interrogante afferma specificamente che si preoccupa delle copie locali e non dei trasferimenti di rete. Sono abbastanza sicuro che Kyle Jones non volesse ingannare nessuno, ma questa risposta (IMHO) lo fa.
ndemou,

4
Kyle Non credo che la tua risposta sia sbagliata. Ho già notato che è "dettagliato, ben scritto e tecnicamente corretto", ma richiede che il lettore sia concentrato e attento inutilmente. Perché coprire la mancanza di verifica dei dati del disco che viene messa in discussione a metà della tua risposta dopo 117 parole che descrivono ripetutamente un altro processo di verifica irrilevante? Comunque grazie per il tuo tempo e interesse per questa discussione. Lo apprezzo sinceramente.
ndemou,

40

rsyncnon non fare la verifica post-copia per le copie dei file locali. È possibile verificare che non lo sia utilizzando rsyncper copiare un file di grandi dimensioni su un'unità lenta (ad esempio USB) e quindi copiando lo stesso file con cp, ad esempio:

time rsync bigfile /mnt/usb/bigfile

time cp bigfile /mnt/usb/bigfile

Entrambi i comandi impiegano circa lo stesso tempo, quindi rsyncnon è possibile eseguire il checksum, poiché ciò implicherebbe la rilettura del file di destinazione dal disco lento.

La manpagina è purtroppo fuorviante al riguardo. Ho anche verificato questo con: stracedopo che la copia è completa, rsyncnon emette read()chiamate sul file di destinazione, quindi non può essere ripristinato. Ancora una volta puoi verificarlo con qualcosa del genere iotop: vedi rsyncleggere e scrivere simultaneamente (copiando dall'origine alla destinazione), quindi esce. Se stesse verificando l'integrità, ci sarebbe una fase di sola lettura.


1
"La pagina man è purtroppo fuorviante al riguardo. L'ho verificato anche con strace" Hai modificato il telecomando, eseguendo il processo rsync o quello locale? Ci sono due ... uno corre sulla destinazione, anche quando usi ssh.
user129070

8
Non esiste una verifica post-copia per alcuna copia, locale o remota. Corri di rsync -cnuovo se vuoi forzarlo a controllare.
psusi

La verifica viene eseguita sul flusso in entrata mentre procede. Non è necessario rileggerlo dal disco se il filesystem ha confermato che è stato scritto.
Smetti di fare del male a Monica l'

17

rsynceffettua un confronto di checksum prima di copiare (in alcuni casi), per evitare di copiare ciò che è già lì. Il punto del confronto del checksum non è verificare che la copia abbia avuto esito positivo. Questo è il lavoro dell'infrastruttura sottostante: i driver del filesystem, i driver del disco, i driver di rete, ecc. Le singole applicazioni come rsyncnon hanno bisogno di preoccuparsi di questa follia. Tutto quello che rsyncoccorre fare (e fare!) È controllare i valori di ritorno delle chiamate di sistema per assicurarsi che non ci siano errori.


1
Questo sembra contraddire la risposta accettata ...
djule5

2
@ djule5 In che modo? La risposta accettata sembra principalmente riguardare il modo in cui rsync controlla i file trasferiti , ma la domanda e la mia risposta riguardano le copie locali .
Gilles 'SO- smetti di essere malvagio' il

3
Ok, bene in quel contesto sono d'accordo che abbia più senso. Quindi "Il punto del confronto del checksum non è verificare che la copia abbia avuto successo" è vera solo per le copie locali ; e "i checksum vengono sempre utilizzati sui dati trasferiti tra i processi rsync di invio e ricezione" è vero solo per le copie trasferite . Trovo la risposta accettata fuorviante riguardo alla domanda e credo che la tua risposta dovrebbe essere quella accettata (solo i miei 2 centesimi).
djule5,

Sento ancora che questa risposta sia leggermente fuorviante. Ad esempio, afferma che i driver di rete in particolare verificano se la copia ha avuto esito positivo, ma se si dicesse che il confronto checksum non verifica se la copia ha avuto esito positivo solo per locale, i driver di rete non entrerebbero in gioco.
Ken,

1
@Ken Non capisco il punto che stai cercando di chiarire. Ho il sospetto che tu abbia letto male qualcosa. I driver di rete entrano in gioco solo se è presente una copia di rete. Rsync stesso fa un confronto di checksum prima di fare qualsiasi copia, al fine di decidere se copiare. Rsync non esegue alcun confronto di checksum dopo la copia (perché sarebbe inutile: sa cosa è appena copiato).
Gilles 'SO- smetti di essere malvagio' il

4

Risposte rapide e sporche, direttamente alle domande.

D: Effettuerà rsyncil confronto quando si copiano i file tra due unità locali? A: Farà un confronto per capire cosa copiare.

D: Se effettua una verifica, è una scommessa sicura? O è meglio fare un confronto byte per byte? A: sicuro come la matematica dietro il checksum del file MD5. Puoi provare a fare un semplice esperimento per imparare e fidarti dello strumento.

Risposta lunga: suppongo che tu volessi rsyncfare un confronto dei file (bit per bit o per checksum) dopo aver copiato i file. Se sei uno dei pochi che valorizzano l'integrità dei dati, potresti trovare utile quanto segue:

rsync -avh [source] [destination] && rsync -avhc [source] [destination] 

sopra la rsynccartella dei file di codice al primo avvio e, se completata senza problemi, verrà eseguita di rsyncnuovo immediatamente durante l'esecuzione dello stesso confronto di nomi di file utilizzando l'hash dell'intero file.


1

Utilizzo di rsync per verificare l'integrità di un duplicato

Per garantire che questo test rileggi fisicamente i file dal supporto dell'unità, suggerisco di spegnere entrambe le unità e riavviarle prima di eseguire questo test. Questo cancellerà le loro cache volatili interne.

Se non riavvii anche Linux, dovresti almeno eliminare le cache ( * ) con:

sudo sh -c 'echo 3 > /proc/sys/vm/drop_caches'

Quindi per rileggere entrambi gli alberi e confrontare i loro checksum:

rsync --dry-run --checksum --itemize-changes --archive SRC DEST

Il checksum rsync moderno utilizza MD5, ovvero 128 bit. La probabilità che questo errore non rilevi un errore in un singolo file è astronomicamente bassa (alcune discussioni qui ), ma non impossibile.



Buona fortuna per ottenere le barre finali giuste.
nobar

Nessuna notizia è una buona notizia.
nobar

Non preoccuparti --checksumfinché il test non è passato senza di esso.
nobar
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.