Come posso verificare che un file da 1 TB sia trasferito correttamente?


25

Spesso trasferisco immagini di macchine virtuali da hypervisor a un server di archiviazione per l'archiviazione a lungo termine.

Trasferisco usando netcat poiché è più veloce di scp, rsync, ect ..

hypervisor$ cat foo.box | nc <archive IP> 1234

archive$ nc -l -p 1234 > foo.box

Quando il file ha terminato il trasferimento, verifico che non vi fosse corruzione eseguendo md5sumsia la destinazione che l'origine.

Sfortunatamente, l'esecuzione di un md5sum su un file di grandi dimensioni può richiedere molto tempo. Come posso confrontare più rapidamente l'integrità di due file di grandi dimensioni?

Aggiornare:

  • La mia trasmissione raramente viene interrotta, quindi la possibilità di riavvio non è un problema.
  • In genere sono necessarie 3-4 ore per il trasferimento tramite NC e quindi 40 minuti per ottenere il md5sum.
  • La sicurezza dell'hash non è un problema in questo caso.

2
Puoi provare diversi checksum: en.wikipedia.org/wiki/Checksum . Non so della loro esibizione
tumchaaditya,

Quanto tempo richiede il trasferimento effettivo e quanto tempo impiega md5sum?
Keith Thompson,

Il trasferimento richiede in genere tra 3-4 ore e il calcolo di md5sums richiede circa 40 minuti.
tbenz9,

Risposte:


18

Puoi usare tee per fare la somma al volo con qualcosa del genere (adatta i comandi netcat alle tue esigenze):

Server:

netcat -l -w 2 1111 | tee >( md5sum > /dev/stderr )

Cliente:

tee >( md5sum > /dev/stderr ) | netcat 127.0.0.1 1111

1
Solo un pensiero: md5deepha una modalità "pezzo" ( md5deep.sourceforge.net/md5deep.html ) che può essere utile per questo.
LawrenceC,

@ultrasawblade - È un link fantastico, dovrò verificarlo per altri scopi. Grazie per averlo menzionato!
nerdwaller,

10

La risposta di Nerdwaller sull'utilizzo teeper trasferire e calcolare contemporaneamente un checksum è un buon approccio se sei principalmente preoccupato per la corruzione in rete. Tuttavia, non ti proteggerà dalla corruzione sulla strada del disco, ecc., Poiché prende il checksum prima che colpisca il disco.

Ma vorrei aggiungere qualcosa:

1 TiB / 40 minuti ≈ 437 MiB / sec 1 .

È piuttosto veloce, in realtà. Ricorda che a meno che tu non abbia molta RAM, deve tornare dalla memoria. Quindi la prima cosa da controllare è guardare iostat -kx 10mentre esegui i tuoi checksum; in particolare si desidera prestare attenzione alla %utilcolonna. Se stai agganciando i dischi (vicino al 100%), la risposta è acquistare spazio di archiviazione più veloce.

Altrimenti, come menzionato da altri poster, puoi provare diversi algoritmi di checksum. MD4, MD5 e SHA-1 sono tutti progettati per essere hash crittografici (anche se nessuno di questi dovrebbe essere più utilizzato a tale scopo; tutti sono considerati troppo deboli). Per quanto riguarda la velocità, puoi confrontarli con openssl speed md4 md5 sha1 sha256. Ho lanciato SHA256 per avere almeno un hash abbastanza forte.

The 'numbers' are in 1000s of bytes per second processed.
type             16 bytes     64 bytes    256 bytes   1024 bytes   8192 bytes
md4              61716.74k   195224.79k   455472.73k   695089.49k   820035.58k
md5              46317.99k   140508.39k   320853.42k   473215.66k   539563.35k
sha1             43397.21k   126598.91k   283775.15k   392279.04k   473153.54k
sha256           33677.99k    75638.81k   128904.87k   155874.91k   167774.89k

Di quanto sopra, puoi vedere che MD4 è il più veloce e SHA256 il più lento. Questo risultato è tipico dell'hardware simile al PC, almeno.

Se vuoi prestazioni ancora maggiori (a costo di essere banale da manomettere e anche meno probabilità di rilevare la corruzione), vuoi guardare un CRC o un hash Adler. Dei due, Adler è in genere più veloce, ma più debole. Sfortunatamente, non sono a conoscenza di implementazioni a riga di comando molto veloci; i programmi sul mio sistema sono tutti più lenti di md4 di OpenSSL.

Quindi, la tua migliore scommessa in termini di velocità è openssl md4 -r(la -rfa sembrare un output md5sum).

Se sei disposto a fare un po 'di compilazione e / o programmazione minima, vedi il codice di Mark Adler sopra Stack Overflow e anche xxhash . Se hai SSE 4.2, non sarai in grado di battere la velocità dell'istruzione CRC hardware.


1 1 TiB = 1024⁴ byte; 1 MiB = 1024² byte. Viene a ≈417 MB / sec con potenze di 1000 unità.


È veloce, sto copiando da un grande array RAID a un secondo array RAID grande.
tbenz9,

@ tbenz9 Ho pensato, non è un singolo disco! Ho aggiunto alcuni suggerimenti ad alcuni hash molto veloci, che purtroppo richiederanno almeno la loro compilazione ... Ma sicuramente funzioneranno tanto velocemente quanto i tuoi dischi (o anche la tua RAM) possono fornire i dati. (E se ti stai chiedendo di Mark Adler v. Adler32, sì, quello sembra essere il creatore di Adler32)
derobert

@derobert, Invece di usare piccoli file per testare, non avresti dovuto testarlo con un file grande come 1 TB?
Pacerier,

@derobert, Perché non usi shasuminvece?
Pacerier,

@Pacerier è l'output del benchmark integrato di OpenSSL. Senza dubbio con blocchi più lunghi, sarà un po 'più veloce, ma è improbabile che la classifica cambi (era coerente in tutte le dimensioni che ha testato). Shasum ha un'implementazione più veloce di OpenSSL? Anche se onestamente al giorno d'oggi se vuoi un hash crittografico veloce, useresti BLAKE2.
derobert,

9

Il opensslcomando supporta diversi digest dei messaggi. Di quelli che sono stato in grado di provare, md4sembra funzionare circa il 65% delle volte md5e circa il 54% delle volte sha1(per il file con cui ho provato).

C'è anche un md2nella documentazione, ma sembra dare gli stessi risultati di md5.

Molto approssimativamente, la velocità sembra essere inversamente proporzionale alla qualità, ma poiché (probabilmente) non sei preoccupato per un avversario che crea una collisione deliberata, questo non dovrebbe essere un grosso problema.

Potresti cercare digest di messaggi più vecchi e più semplici (c'era un md1, per esempio)?

Un aspetto secondario: hai un uso inutile dicat . Piuttosto che:

cat foo.box | nc <archive IP> 1234

Puoi usare:

nc <archive IP> 1234 < foo.box

o anche:

< foo.box nc <archive IP> 1234

Ciò consente di risparmiare un processo, ma probabilmente non avrà alcun effetto significativo sulle prestazioni.


1
Grazie per il suggerimento sul gatto, non legato alla domanda ma comunque un suggerimento utile. Saluti!
tbenz9,

@ tbenz9: il codice leggibile è più facile da eseguire il debug, la manutenzione e la modifica. "Inutile cat" quindi non è necessariamente del tutto negativo. Se non si ottiene alcun vantaggio prestazionale evitandolo, allora è meglio andare con qualunque cosa tu sia più a tuo agio, supponendo che sarai il manutentore di questo codice.
iconoclasta

1
@Keith, Link down ..
Pacerier

4

Due opzioni:

Uso sha1sum

sha1sum foo.box

In alcune circostanze sha1sum è più veloce .


Uso rsync

Il trasferimento richiederà più tempo, ma rsync verifica che il file sia arrivato intatto.

Dalla pagina man di rsync

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


1
Grazie per il suggerimento su sha1sum, rsync impiega più di 10 ore per il trasferimento, posso trasferire lo stesso file ed eseguire md5sums in circa 4 ore usando nc e md5sum. Sto cercando di ridurre ulteriormente le mie 4 ore.
tbenz9,

3

La scienza sta progredendo. Sembra che la nuova funzione hash BLAKE2 sia più veloce di MD5 (e crittograficamente molto più forte all'avvio).

Riferimento: https://leastauthority.com/blog/BLAKE2-harder-better-faster-stronger-than-MD5.html

Dalle diapositive di Zooko:

cicli per byte su Intel Core i5-3210M (Ivy Bridge) 
cicli di funzione per byte
messaggio lungo 4096 B 64 B MD5 5.0 5.2 13.1 SHA1 4,7 4,8 13,7 SHA256 12,8 13,0 30,0 Keccak 8.2 8.5 26.0 BLAKE1 5.8 6.0 14.9 BLAKE2 3.5 3.5 9.3

2

Probabilmente non puoi fare di meglio di un buon hash. Potresti voler controllare altre funzioni hash / checksum per vedere se ce ne sono significativamente più veloci md5sum. Nota che potresti non aver bisogno di qualcosa di forte come MD5. MD5 (e cose come SHA1) sono progettate per essere crittograficamente forti, quindi è impossibile per un attaccante / impostore creare un nuovo file che abbia lo stesso valore hash di un valore esistente (cioè, per rendere difficile manomettere la firma e -mail e altri documenti). Se non sei preoccupato per un attacco alle tue comunicazioni, ma solo un errore comms of the mills, qualcosa come un controllo di ridondanza ciclica (CRC) potrebbe essere abbastanza buono. (Ma non so se sarebbe più veloce.)

Un altro approccio è quello di provare a fare l'hash in parallelo con il trasferimento. Ciò potrebbe ridurre il tempo complessivo e sicuramente ridurre il fattore di irritazione dovuto alla necessità di attendere il completamento del trasferimento, quindi attendere nuovamente il completamento dell'MD5. Non l'ho provato, ma dovrebbe essere possibile fare qualcosa del genere:

  • Sulla macchina di origine:

    mkfifo myfifo
    tee myfifo < file_origine | nc dest_host  numero_porta e md5sum myfifo
    
  • Sulla macchina di destinazione:

    mkfifo myfifo
    nc -l -p numero_porta | tee myfifo> dest_file & md5sum myfifo
    

Ovviamente controllare le dimensioni dei file è un buon modo rapido per rilevare l'eventuale perdita di byte.


2

L'invio di file di grandi dimensioni è una seccatura. Perché non provare a dividere i file generando un hash per ogni blocco, quindi inviarlo alla destinazione e quindi controllare l'hash e unire i blocchi.

È inoltre possibile configurare una rete BitTorrent personale. Ciò garantirebbe che l'intera cosa raggiunga in sicurezza.


La mia comprensione è dal momento che è una fonte e una destinazione una rete BitTorrent non sarebbe utile. Non è utile solo quando si va in molte destinazioni da molte fonti?
tbenz9,

Ho preso in considerazione l'idea di suggerire questo approccio (suddividere il file di input in blocchi, inviarli separatamente e riassemblarli dall'altra parte) e non sono riuscito a capire come renderlo neutrale in termini di prestazioni, figuriamoci un miglioramento. Hai ancora la stessa quantità di tempo di trasferimento in rete, ma hai molte più spese generali su ciascuna estremità. Ciò comporta essenzialmente la copia del file dalla macchina di origine alla macchina di origine , quindi la copia sulla macchina di destinazione e quindi la copia dalla macchina di destinazione alla macchina di destinazione . Anche con grandi dischi RAM, questo non è gratuito.
Scott,

1
L'unico vantaggio di questo approccio è la ristartabilità, incluso il recupero più rapido da un errore di trasmissione. L'OP non ha detto con quale frequenza ottiene i guasti e non ha indicato che questo fosse qualcosa che voleva ottimizzare.
Scott,

@ tben9 Bittorrent è l'attuale strumento di scelta per il trasferimento singolo di file. Avere le informazioni hash con il file significa che il client finale può verificare i dati scaricati e correggerli se necessario. Le fonti multiple sono per la velocità. Quindi, sì, in questo caso è utile usare BT per assicurarsi che un file sia trasferito correttamente.
Underverse
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.