Wie kann ich überprüfen, ob eine 1-TB-Datei korrekt übertragen wurde?

24

Ich übertrage häufig VM-Images von Hypervisoren zur Langzeitspeicherung auf einen Archivserver.

Ich übertrage mit Netcat, da es schneller ist als scp, rsync, ect ..

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

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

Wenn die Übertragung der Datei abgeschlossen ist, stelle ich durch Ausführen sicher, dass keine Beschädigung vorliegt md5sum auf dem Ziel und der Quelle.

Leider kann das Ausführen einer md5sum für eine große Datei sehr lange dauern. Wie kann ich die Integrität von zwei großen Dateien schneller vergleichen?

Aktualisieren:

  • Meine Übertragung wird selten unterbrochen, so dass ein Neustart kein Problem darstellt.
  • Die Übertragung per NC dauert in der Regel 3-4 Stunden und dann 40 Minuten, um die MD5-Summe zu erhalten.
  • Die Sicherheit des Hashs spielt in diesem Fall keine Rolle.
tbenz9
quelle
2
Sie können verschiedene Prüfsummen ausprobieren: en.wikipedia.org/wiki/Checksum . Ich weiß jedoch nichts über ihre Leistung
tumchaaditya
Wie lange dauert die eigentliche Übertragung und wie lange dauert die md5sum?
Keith Thompson
Die Übertragung dauert in der Regel 3-4 Stunden, und die Berechnung der MD5-Summen dauert etwa 40 Minuten.
tbenz9

Antworten:

18

Sie können verwenden tee Um die Summe im Handumdrehen mit so etwas zu machen (passen Sie die netcat-Befehle an Ihre Bedürfnisse an):

Server:

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

Klient:

tee >( md5sum > /dev/stderr ) | netcat 127.0.0.1 1111
nerdwaller
quelle
1
Nur ein Gedanke: md5deep hat einen "Chunk" -Modus ( md5deep.sourceforge.net/md5deep.html ), die hierfür nützlich sein können.
LawrenceC
@ultrasawblade - Das ist ein großartiger Link, den ich für andere Zwecke überprüfen muss. Danke, dass du es erwähnt hast!
nerdwaller
10

Nerdwallers Antwort über die Verwendung tee Das gleichzeitige Übertragen und Berechnen einer Prüfsumme ist ein guter Ansatz, wenn Sie vor allem über Korruption im Netzwerk besorgt sind. Es schützt Sie jedoch nicht vor Beschädigung auf dem Weg zur Festplatte usw., da es die Prüfsumme verwendet, bevor sie auf die Festplatte trifft.

Aber ich möchte noch etwas hinzufügen:

1 TiB / 40 Minuten ≈ 437 MiB / Sek 1 .

Das geht eigentlich ziemlich schnell. Denken Sie daran, es sei denn, Sie haben eine Menge RAM, das muss aus dem Speicher zurückkommen. Das erste, was Sie überprüfen müssen, ist zuschauen iostat -kx 10 wie Sie Ihre Prüfsummen ausführen; Insbesondere möchten Sie auf die %util Säule. Wenn Sie die Datenträger fixieren (nahezu 100%), ist die Antwort der Kauf eines schnelleren Speichers.

Ansonsten können Sie, wie in anderen Postern erwähnt, andere Prüfsummenalgorithmen ausprobieren. MD4, MD5 und SHA-1 sind alle als kryptografische Hashes konzipiert (obwohl keines mehr für diesen Zweck verwendet werden sollte; alle gelten als zu schwach). Was die Geschwindigkeit angeht, kann man sie mit der vergleichen openssl speed md4 md5 sha1 sha256. Ich habe in SHA256 geworfen, um mindestens einen noch stark genug Hash zu haben.

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

Davon können Sie sehen, dass MD4 am schnellsten und SHA256 am langsamsten ist. Dieses Ergebnis ist zumindest für PC-ähnliche Hardware typisch.

Wenn Sie noch mehr Leistung wollen (auf Kosten des Seins) trivial Um Korruption zu manipulieren und auch weniger zu erkennen, möchten Sie sich einen CRC oder Adler-Hash ansehen. Von den beiden ist Adler normalerweise schneller, aber schwächer. Leider sind mir keine wirklich schnellen Befehlszeilenimplementierungen bekannt. Die Programme auf meinem System sind alle langsamer als OpenSSLs md4.

Also ist Ihre beste Wette in Bezug auf die Geschwindigkeit openssl md4 -r (das -r sieht aus wie md5sum output).

Wenn Sie bereit sind, Kompilierung und / oder Minimalprogrammierung durchzuführen, lesen Sie Mark Adlers Code über Stack Overflow und auch xxhash . Wenn Sie über SSE 4.2 verfügen, können Sie die Geschwindigkeit des Hardware-CRC-Befehls nicht übertreffen.


1 1 TiB = 1024 Bytes; 1 MiB = 1024² Bytes. Kommt zu ~ 417 MB / Sek. Mit einer Leistung von 1000 Einheiten.

derobert
quelle
Es ist schnell, ich kopiere von einem großen RAID-Array auf ein zweites großes RAID-Array.
tbenz9
@ tbenz9 Ich dachte, das ist auf keinen Fall eine einzelne Platte! Ich habe einige Zeiger zu einigen wirklich schnellen Hashes hinzugefügt, die leider mindestens kompiliert werden müssen ... Aber sie werden mit Sicherheit so schnell ausgeführt, wie Ihre Festplatten (oder sogar Ihr RAM) die Daten liefern können. (Und wenn Sie sich über Mark Adler v. Adler32 wundern, ja, das scheint der Schöpfer von Adler32 zu sein)
derobert
@derobert, Anstatt kleine Dateien zum Testen zu verwenden, hättest du es nicht mit einer großen Datei wie 1 TB testen sollen?
Pacerier
@derobert, warum benutzt du das nicht? shasum stattdessen?
Pacerier
@Pacerier, das ist die Ausgabe von OpenSSLs integriertem Benchmark. Zweifellos wird es mit längeren Blöcken etwas schneller sein, aber es ist unwahrscheinlich, dass sich das Ranking ändert (es war über alle getesteten Größen konsistent). Hat shasum eine schnellere Implementierung als OpenSSL? Obwohl heutzutage ehrlich gesagt, wenn Sie einen schnellen kryptografischen Hash wollen, würden Sie BLAKE2 verwenden.
derobert
9

Das openssl Befehl unterstützt mehrere Message Digests. Von denen konnte ich versuchen, md4 scheint in etwa 65% der Zeit zu laufen md5und ungefähr 54% der Zeit von sha1 (für die eine Datei, mit der ich getestet habe).

Es gibt auch eine md2 in der Dokumentation, aber es scheint die gleichen Ergebnisse zu geben wie md5.

In groben Zügen scheint die Geschwindigkeit in einem umgekehrten Verhältnis zur Qualität zu stehen, aber da Sie (wahrscheinlich) keine Bedenken haben, dass ein Gegner eine absichtliche Kollision hervorruft, sollte dies kein großes Problem sein.

Sie könnten sich nach älteren und einfacheren Nachrichtenübersichten umsehen (gab es eine md1, zum Beispiel)?

Ein kleiner Punkt: Sie haben eine Nutzloser Gebrauch von cat. Eher, als:

cat foo.box | nc <archive IP> 1234

Sie können verwenden:

nc <archive IP> 1234 < foo.box

oder auch:

< foo.box nc <archive IP> 1234

Dies spart einen Prozess, hat aber wahrscheinlich keine signifikanten Auswirkungen auf die Leistung.

Keith Thompson
quelle
1
Vielen Dank für den Katzentipp, der nichts mit der Frage zu tun hat, aber trotzdem ein hilfreicher Tipp ist. Prost!
tbenz9
@ tbenz9: lesbarer Code ist einfacher zu debuggen, zu warten und zu ändern. "Nutzlos cat "Daher ist es nicht unbedingt ganz schlecht. Wenn es keinen Leistungsgewinn gibt, wenn Sie ihn vermeiden, ist es besser, mit dem zu arbeiten, mit dem Sie sich wohler fühlen, vorausgesetzt Sie wird der Betreuer dieses Codes sein.
iconoclast
1
@ Keith, Link runter ..
Pacerier
4

Zwei Optionen:

Benutzen sha1sum

sha1sum foo.box

Unter bestimmten Umständen sha1sum ist schneller .


Benutzen rsync

Die Übertragung dauert länger, aber rsync überprüft, ob die Datei intakt eingetroffen ist.

Von der rsync-Manpage

Beachten Sie, dass rsync immer überprüft, ob jede übertragene Datei vorhanden war   auf der empfangenden Seite durch Überprüfung einer ganzen Datei richtig rekonstruiert   Prüfsumme, die beim Übertragen der Datei generiert wird ...

spuder
quelle
1
Vielen Dank für den Tipp zu sha1sum. Die Übertragung von rsync dauert mehr als 10 Stunden. Ich kann dieselbe Datei übertragen und die md5sums mit nc und md5sum in etwa 4 Stunden ausführen. Ich versuche meine 4 Stunden noch zu senken.
tbenz9
3

Die Wissenschaft macht Fortschritte. Es scheint, dass die neue BLAKE2-Hash-Funktion schneller als MD5 ist (und kryptografisch viel stärker zu booten ist).

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

Von Zookos Folien:

cycles per byte on Intel Core i5-3210M (Ivy Bridge)
Funktionszyklen pro Byte
lange Nachricht 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
Ninveh
quelle
2

Sie können wahrscheinlich nichts Besseres tun als einen guten Hash. Möglicherweise möchten Sie andere Hash- / Prüfsummenfunktionen ausprobieren um zu sehen, ob welche deutlich schneller sind als md5sum. Beachten Sie, dass Sie möglicherweise nicht so etwas Starkes wie MD5 benötigen. MD5 (und Dinge wie SHA1) sind so konzipiert, dass sie kryptografisch stark sind. Daher ist es für einen Angreifer / Betrüger nicht möglich, eine neue Datei zu erstellen das hat den gleichen Hash-Wert wie ein vorhandener Wert (d. h. um das Manipulieren signierter E-Mails und anderer Dokumente zu erschweren). Wenn Sie nicht über einen Angriff auf Ihre Kommunikation besorgt sind, aber nur ein gewöhnlicher Kommunikationsfehler, So etwas wie eine zyklische Redundanzprüfung (CRC) ist möglicherweise ausreichend. (Aber ich weiß nicht, ob es schneller gehen würde.)

Ein anderer Ansatz besteht darin, zu versuchen, den Hash parallel zur Übertragung durchzuführen. Dies könnte die Gesamtzeit reduzieren, und könnte definitiv den Reizfaktor reduzieren zu warten, bis die Übertragung abgeschlossen ist, und warten Sie dann erneut, bis der MD5 fertig ist. Ich habe das noch nicht getestet, aber es sollte möglich sein, Folgendes zu tun:

  • Auf dem Quellcomputer:

    mkfifo myfifo
    tee myfifo <  Quelldatei  | nc  dest_host   Port-Nummer  &Ampere; md5sum myfifo 
  • Auf dem Zielcomputer:

    mkfifo myfifo
    nc -l -p  Port-Nummer  | tee myfifo & gt;  dest_file  &Ampere; md5sum myfifo 

Das Überprüfen der Dateigrößen ist natürlich eine gute und schnelle Methode, um festzustellen, ob Bytes verloren gegangen sind.

Scott
quelle
2

Riesige Dateien zu verschicken ist ein Schmerz. Warum nicht versuchen, die Dateien zu zerlegen, die einen Hash für jeden Chunk erzeugen, und ihn dann an das Ziel senden und dann den Hash prüfen und die Chunks zusammenfügen?

Sie können auch ein persönliches BitTorrent-Netzwerk einrichten. Das würde dafür sorgen, dass das Ganze sicher ankommt.

Gaurav Joseph
quelle
Mein Verständnis ist, da es eine Quelle und ein Ziel ist, die ein BitTorrent-Netzwerk nicht vorteilhaft wäre. Profitiert das nicht nur, wenn es zu vielen Zielen aus vielen Quellen geht?
tbenz9
Ich überlegte, ob ich diesen Ansatz vorschlagen sollte (die Eingabedatei in Blöcke aufteilen, sie separat senden und am anderen Ende wieder zusammensetzen), und ich konnte nicht herausfinden, wie ich sie sogar leistungsneutral gestalten oder gar verbessern könnte. Sie haben immer noch die gleiche Zeit für die Netzwerkübertragung, aber Sie haben an jedem Ende viel mehr Overhead. Dies beinhaltet im Wesentlichen das Kopieren der Datei von der Quellmaschine zur Quellmaschine Kopieren Sie es dann auf den Zielcomputer. & amp; dann kopiere es vom Zielrechner zum Zielrechner . Auch bei großen RAM-Festplatten ist dies nicht kostenlos.
Scott
1
Der einzige Vorteil dieses Ansatzes ist die Neustartfähigkeit, einschließlich der schnelleren Wiederherstellung nach einem Übertragungsfehler. Das OP gab nicht an, wie oft er Ausfälle erleidet, und gab nicht an, dass dies etwas war, das er optimieren wollte.
Scott
@ tben9 Bittorrent ist das aktuelle Tool der Wahl für die einmalige Übertragung von Dateien. Wenn die Hash-Informationen in der Datei enthalten sind, kann der Endclient die heruntergeladenen Daten überprüfen und gegebenenfalls korrigieren. Die mehrfachen Quellen sind für Geschwindigkeit. Ja, in diesem Fall ist es vorteilhaft, BT zu verwenden, um sicherzustellen, dass eine Datei korrekt übertragen wird.
Underverse