Patchen Sie eine sehr große Binärdatei über eine langsame Verbindung

861
mcandril

Zu Sicherungszwecken habe ich eine sehr große Binärdatei über eine vergleichbar langsame langsame Verbindung übertragen (die Übertragung dauerte 2 Wochen), indem ich sie auf einem gemounteten cifs-Anteil (so konnte und kann ich blockweise darauf zugreifen). Nach den 2 Wochen zeigte rsync einen Fehler (konnte ihn leider nicht speichern), aber die Dateigröße stimmte überein

tail -c 1000000000 myfile.img|md5sum # and head -c 1000000000 myfile.img|md5sum 

übereinstimmen, so dass der Anfang und das Ende der Datei identisch sind.

Da mein Downstream viel schneller ist, habe ich das vollständige Bild erneut heruntergeladen und md5-Summen für das Ganze übernommen, und diese passen NICHT zusammen. Anscheinend ist irgendwo in diesen 1,5 TB mindestens ein Bit, das sich unterscheidet.

Gibt es eine Möglichkeit, aus den beiden heruntergeladenen Dateien einen "Patch" zu generieren und ihn dann auf die Remote-Datei anzuwenden, so dass nur die falschen Blöcke erneut übertragen werden müssen?

Bitte beachten Sie noch einmal: Ich habe NICHT die Möglichkeit, Code remote auszuführen oder die Funktionen von rsync zu nutzen, für die rsync remote ausgeführt werden muss. Ich denke, ich könnte immer noch rsync verwenden und es funktioniert in der Größenordnung meiner Download-Rate, aber ich frage mich, ob es einen besseren Weg gibt, die Tatsache zu nutzen, dass ich beide Versionen lokal habe. Es wäre wahrscheinlich nicht so schwer, etwas aufzuschreiben, aber ich würde es vorziehen, etwas getestetes zu verwenden und die Arbeit zu speichern.

0
Ich habe hier gerade eine Antwort gesehen, die auf bsdiff hindeutet. Ich kann es nicht mehr sehen. Ich habe mir das tatsächlich angesehen und sagt, es läuft mit O ((n + m) log n). Da meine Dateien die gleiche Größe haben und anscheinend große Teile gleich sind, denke ich, dass dies in O (n) möglich sein sollte -> Einmal über die erste Datei laufen, das entsprechende Bit in der anderen betrachten und notieren, wenn Sie möchten um es zu ändern und zu was. mcandril vor 7 Jahren 0
Nun zu bsdiff: Die auf ihrer Seite genannten 200MHz Pentium Pro würden 9375h für meine 1,5 TB benötigen. Mein System ist nicht so langsam, aber auch kein moderner Core i7. Ich würde also wahrscheinlich noch in den Zeitbereich re-download bekommen, was ich auch mit rsync erreichen sollte, indem Sie diese https://blog.christophersmart.com/2014/01/15/force-rsync- verwenden. to-use-delta-transfer-to-fix-korrupte-entfernte-Datei / Kommentar-Seite-1 /. Der andere schlug einen vor, an den ich mich nicht erinnern kann. mcandril vor 7 Jahren 0

2 Antworten auf die Frage

1
meuh

(unter der Annahme von Linux) Wenn Sie der Meinung sind, dass nur ein Block der Daten beschädigt ist, die Größe des Blocks sich jedoch nicht geändert hat, können Sie dies verwenden cmp -l. Es vergleicht Byte für Byte und -lgibt den Offset eventueller Differenzen an. Wenn Sie nicht genau wissen, wo Sie in den Dateien anfangen sollen, können Sie einen ersten Start mit machen -i. Wenn Sie die Offsets fehlerhaft haben, können dd skip=...Sie diese aus der Originaldatei herausschneiden und dd seek=... conv=notruncin die beschädigte Datei einfügen. (Test zuerst auf Kopie)

Genial, genau das, wonach ich suche! mcandril vor 7 Jahren 0
0
billc.cn

Ich würde BitTorrent verwenden, um die Datei auf der entfernten Seite wiederherzustellen. Das Protokoll teilt eine Datei in kleine Blöcke auf und lädt Blöcke, deren Hashwerte nicht mit der Seed-Datei übereinstimmen, automatisch erneut herunter.

Um es in einer privaten Umgebung zum Laufen zu bringen:

  1. Deaktivieren Sie DHT auf den lokalen und fernen Bit-Torrent-Clients.
  2. Öffnen Sie lokale Bit-Torrent-Ports in der Firewall oder richten Sie die SSH-Portweiterleitung ein.
  3. Erstellen Sie eine Seed-Datei auf der Quellenseite. Verwenden Sie keinen Tracker. Stellen Sie sicher, dass der Client die Datei auch startet.
  4. Sichern Sie die Datei auf der Remote-Seite.
  5. Kopieren Sie die Seed-Datei auf die Remote-Seite und öffnen Sie sie mit dem Client.
  6. Richten Sie den Download - Pfad auf die beschädigte Datei und wählen Sie die Option, um nicht den Download zu starten !! Deaktivieren Sie auch die Optionen für die Verbindung mit DHT, Peer Exchange usw., falls verfügbar.
  7. Bitten Sie den Client, die heruntergeladene Datei erneut zu überprüfen. Es sollte ein Download-Prozentsatz gemeldet werden, der fast vollständig ist.
  8. Fügen Sie den lokalen Client als Peer zum Download hinzu
  9. Starten Sie den Download
Danke, aber wie gesagt: Ich kann keinen Code aus der Ferne ausführen. Das bedeutet auch, dass es keinen Remote-Bittorrent-Client geben kann. Das einzige, was ich habe, sind Protokolle wie SCP (aber NICHT SSH, ich kann nicht einmal die auf der entfernten Seite berechnete Prüfsumme erhalten), SFTP, CIFS, WebDAV. Potentielles Durcheinander ist jedoch kein großes Problem, da der Remote-Speicher Snapshots unterstützt. mcandril vor 7 Jahren 0
Wenn Sie über SCP / CIFS / WebDAV-Zugriff verfügen, können Sie diese als lokale Dateisysteme mounten und BitTorrent wie oben verwenden. Dies wäre jedoch besonders langsam. Eine Zwischenlösung wäre, dies von einem Computer mit schneller Verbindung zur Gegenseite zu tun. ZB AWS / VPS nach Stunden Anbieter in der Nähe des Remote-Servers. billc.cn vor 7 Jahren 0
Ja, aber in diesem Fall sehe ich nicht, dass Rsync nicht viel einfacher wäre. Ich habe tatsächlich einen Server mit schnellem Zugriff auf diesen Speicher, aber dann würde ich immer noch rsync verwenden. Hätte bei der ersten Übertragung daran gedacht. Auf jeden Fall ist meuhs Vorschlag genau das, was ich will, und ich kann mir nicht vorstellen, wie er schneller arbeiten könnte. Es ist O (n) lokal und überträgt dann nur die falschen Bytes. mcandril vor 7 Jahren 0