Überprüft rsync Dateien, die zwischen zwei lokalen Laufwerken kopiert wurden?

65

Ich möchte eine neue Kopie einer großen Anzahl von Dateien von einem lokalen Laufwerk auf ein anderes erstellen.

Ich habe gelesen, dass rsync einen Prüfsummenvergleich von Dateien durchführt, wenn sie über ein Netzwerk an einen Remote-Computer gesendet werden.

  1. Wird rsync den Vergleich durchführen, wenn die Dateien zwischen zwei lokalen Laufwerken kopiert werden?

  2. Wenn es eine Überprüfung macht - ist es eine sichere Wette? Oder ist es besser, einen Byte-für-Byte-Vergleich durchzuführen?

Frez
quelle

Antworten:

77

rsync verwendet immer Prüfsummen, um zu überprüfen, ob eine Datei korrekt übertragen wurde. Wenn die Zieldatei bereits vorhanden ist, überspringt rsync möglicherweise die Aktualisierung der Datei, wenn Änderungszeit und -größe mit der Quelldatei übereinstimmen. Wenn rsync jedoch feststellt, dass Daten übertragen werden müssen, werden für die zwischen dem sendenden und dem empfangenden rsync-Prozess übertragenen Daten immer Prüfsummen verwendet . Dies stellt sicher, dass die empfangenen Daten mit der hohen Wahrscheinlichkeit mit den gesendeten Daten übereinstimmen, ohne den hohen Aufwand eines Vergleichs auf Byte-Ebene über das Netzwerk.

Sobald die Dateidaten empfangen wurden, schreibt rsync die Daten in die Datei und vertraut darauf, dass die Daten ohne Beschädigung auf die Festplatte geschrieben wurden, wenn der Kernel einen erfolgreichen Schreibvorgang anzeigt. rsync liest die Daten nicht erneut und vergleicht sie als zusätzliche Prüfung mit der bekannten Prüfsumme.

Für die Verifizierung selbst verwendet rsync ab Protokoll 30 (erstmals in 3.0.0 unterstützt) MD5 . Für ältere Protokolle wird die Prüfsumme MD4 verwendet .

Während MD5 und MD4 lange als veraltet für sichere kryptografische Hashes angesehen wurden, sind sie für die Überprüfung von Dateibeschädigungen weiterhin geeignet.

Quelle: Die Manpage und der zu überprüfende rsync-Quellcode.

Kyle Jones
quelle
3
Ich hasse es, jedermanns Blase zu platzen, aber rsync überprüft die Summe nur, wenn das Flag -c hinzugefügt wird!
27
@clint Nein, die Antwort ist richtig. Zur Erklärung des -cFlags auf der Manpage : "Beachten Sie, dass rsync immer überprüft, ob jede übertragene Datei auf der Empfängerseite korrekt rekonstruiert wurde, indem eine Prüfsumme für die gesamte Datei überprüft wird, die beim Übertragen der Datei generiert wird, jedoch nach der Übertragung automatisch Die Überprüfung hat nichts mit der Überprüfung dieser Option vor der Übertragung zu tun.
Michael Mrozek
7
Diese Antwort macht nicht deutlich, ob die Datei nach einer Kopie tatsächlich überprüft wurde. Wenn die Prüfsumme beim Empfang der Datei berechnet wird, handelt es sich nicht um eine Post-Copy-Prüfsumme, und Sie können nicht sicher sein, ob die Datei korrekt geschrieben wurde. Sie müssten dann einen zusätzlichen Vergleich durchführen.
Andre Miller
7
Abwärtsstimmen, weil ich die Tatsache nicht mag, dass diese Antwort detailliert, gut geschrieben und technisch korrekt ist und gleichzeitig so wenig zum Thema gehört, dass sie die Leser irreführt. Das Problem ist, dass die Antwort genau beschreibt, was während der Übertragung geschieht , während der Fragesteller ausdrücklich angibt, dass er sich um lokale Kopien und nicht um Netzwerkübertragungen kümmert . Ich bin mir ziemlich sicher, dass Kyle Jones niemanden irreführen wollte, aber diese Antwort (IMHO) tut es.
Ndemou
4
Kyle Ich glaube nicht, dass deine Antwort falsch ist. Ich habe bereits bemerkt, dass es "detailliert, gut geschrieben und technisch korrekt" ist, aber es erfordert, dass der Leser unnötig fokussiert und vorsichtig ist. Warum die fehlende Überprüfung der Plattendaten abdecken, die nach 117 Wörtern, die wiederholt einen anderen irrelevanten Überprüfungsprozess beschreiben, in der Mitte Ihrer Antwort in Frage gestellt werden? Trotzdem vielen Dank für Ihre Zeit und Ihr Interesse an dieser Diskussion. Ich schätze es aufrichtig.
Ndemou
40

rsyncist nicht tun , um die Post-Kopie Überprüfung für lokale Dateikopien. Sie können überprüfen, ob dies nicht der Fall ist, indem Sie rsynceine große Datei auf ein langsames (dh USB-) Laufwerk kopieren und dann dieselbe Datei mit kopieren cp, dh:

time rsync bigfile /mnt/usb/bigfile

time cp bigfile /mnt/usb/bigfile

Beide Befehle benötigen ungefähr die gleiche Zeit und rsynckönnen daher möglicherweise nicht die Prüfsumme ausführen, da dies ein erneutes Lesen der Zieldatei von der langsamen Festplatte erfordern würde.

Die manSeite ist leider irreführend. Ich habe dies auch mit überprüft - stracenachdem der Kopiervorgang abgeschlossen ist, werden für die rsyncZieldatei keine read()Aufrufe mehr ausgegeben, sodass keine Prüfsummen erstellt werden können. Eine weitere Möglichkeit, die Sie überprüfen können, besteht in etwa darin, dass iotopSie rsyncgleichzeitig lesen und schreiben (Kopieren von der Quelle zum Ziel). Anschließend wird das Programm beendet. Wenn die Integrität überprüft würde, gäbe es eine Nur-Lese-Phase.

Felix
quelle
1
"Die Manpage ist leider irreführend. Ich habe dies auch mit strace überprüft." Haben Sie den Remote-, den Rsync-Prozess oder den lokalen Prozess gestrafft? Es gibt zwei ... eine wird auf dem Ziel ausgeführt, auch wenn Sie ssh verwenden.
user129070
8
Es gibt keine Überprüfung nach dem Kopieren für lokale oder entfernte Kopien. Sie werden rsync -cerneut ausgeführt, wenn Sie die Überprüfung erzwingen möchten.
Psusi
Die Überprüfung wird für den eingehenden Stream ausgeführt. Es ist nicht erforderlich, es von der Festplatte zurückzulesen, wenn das Dateisystem bestätigt hat, dass es geschrieben wurde.
OrangeDog
17

rsyncführt vor dem Kopieren (in einigen Fällen) einen Prüfsummenvergleich durch , um zu vermeiden, dass bereits vorhandene Daten kopiert werden. Mit dem Prüfsummenvergleich soll nicht überprüft werden, ob die Kopie erfolgreich war. Das ist die Aufgabe der zugrunde liegenden Infrastruktur: die Dateisystemtreiber, die Festplattentreiber, die Netzwerktreiber usw. Einzelne Anwendungen wie rsyncmüssen sich nicht um diesen Wahnsinn kümmern. Alles rsync, was Sie tun müssen (und tun müssen!), Ist, die Rückgabewerte von Systemaufrufen zu überprüfen, um sicherzustellen, dass kein Fehler aufgetreten ist.

Gilles 'SO - hör auf böse zu sein'
quelle
1
Dies scheint der akzeptierten Antwort zu widersprechen ...
djule5
2
@ djule5 Inwiefern? Die akzeptierte Antwort scheint hauptsächlich zu sein, wie rsync übertragene Dateien überprüft , aber die Frage und meine Antwort beziehen sich auf lokale Kopien.
Gilles 'SO- hör auf böse zu sein'
3
Okay, in diesem Zusammenhang stimme ich zu, dass es sinnvoller ist. So „Der Punkt des Prüfsumme Vergleichs nicht zu überprüfen, ob die Kopie erfolgreich war“ gilt nur für lokale Kopien; und "Prüfsummen werden immer für die zwischen dem sendenden und dem empfangenden rsync-Prozess übertragenen Daten verwendet" gilt nur für übertragene Kopien. Ich finde die akzeptierte Antwort in Bezug auf die Frage irreführend und glaube, dass Ihre Antwort die akzeptierte sein sollte (nur meine 2 Cent).
djule5
Ich halte diese Antwort immer noch für etwas irreführend. Beispielsweise wird angegeben, dass insbesondere die Netzwerktreiber überprüfen, ob die Kopie erfolgreich war. Wenn Sie jedoch angeben, dass der Prüfsummenvergleich nicht überprüft, ob die Kopie nur lokal erfolgreich war, werden die Netzwerktreiber nicht verwendet.
Ken
1
@ Ken Ich verstehe den Punkt nicht, den Sie versuchen zu machen. Ich vermute, Sie haben etwas falsch verstanden. Die Netzwerktreiber kommen nur zum Einsatz, wenn eine Netzwerkkopie vorhanden ist. Rsync selbst führt vor dem Kopieren einen Prüfsummenvergleich durch , um zu entscheiden, ob kopiert werden soll. Rsync führt nach dem Kopieren keinen Prüfsummenvergleich durch (da dies sinnlos wäre: Es weiß, was gerade kopiert wurde).
Gilles 'SO - hör auf böse zu sein'
4

Schnelle und schmutzige Antworten, direkt auf die Fragen.

F: Wird rsyncder Vergleich durchgeführt, wenn die Dateien zwischen zwei lokalen Laufwerken kopiert werden? A: Es wird ein Vergleich durchgeführt, um herauszufinden, was kopiert werden soll.

F: Wenn es eine Überprüfung durchführt - ist es eine sichere Wette? Oder ist es besser, einen Byte-für-Byte-Vergleich durchzuführen? A: So sicher wie die Mathematik hinter der MD5-Prüfsumme der Datei. Sie können versuchen, ein einfaches Experiment durchzuführen, um das Tool zu erlernen und ihm zu vertrauen.

Lange Antwort: Ich denke, Sie wollten rsyncnach dem Kopieren von Dateien einen Dateivergleich (Stück für Stück oder per Prüfsumme) durchführen. Wenn Sie einer der wenigen sind, die Datenintegrität schätzen, ist das Folgende möglicherweise hilfreich:

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

Der obige rsyncOrdner mit den Codedateien wird beim ersten Start und wenn er ohne Probleme abgeschlossen ist, rsyncsofort wieder ausgeführt, während der gleiche Dateinamenvergleich mit dem Hash der gesamten Datei durchgeführt wird.

MN
quelle
1

Verwenden von rsync zum Überprüfen der Integrität eines Duplikats

Um zu gewährleisten, dass dieser Test die Dateien von den Laufwerksmedien physisch neu liest, empfehle ich, beide Laufwerke herunterzufahren und neu zu starten, bevor dieser Test ausgeführt wird. Dadurch werden die internen flüchtigen Caches gelöscht.

Wenn Sie Linux nicht auch neu starten, sollten Sie zumindest die Caches ( * ) löschen mit:

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

Dann lesen Sie beide Bäume noch einmal und vergleichen ihre Prüfsummen:

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

Die moderne rsync-Prüfsumme verwendet MD5 (128 Bit). Die Wahrscheinlichkeit, dass ein Fehler in einer einzelnen Datei nicht erkannt wird, ist astronomisch gering (einige Diskussionen hier ), aber nicht unmöglich.

kein Balken
quelle
Ich wünsche Ihnen viel Glück bei der Überarbeitung der Schrägstriche.
Nobar
Keine Nachrichten sind gute Nachrichten.
Nobar
Kümmere dich nicht darum, --checksumbis der Test ohne ihn bestanden ist.
6.