Defekte Datei - Rsync?

DemonLord

Weeeeee!
Hallo Leute!

Ich hab ein kleines Problem, dafür eine grosse DSL Leitung. Nein Moment, andersrum. Ein grosses Problem aber nur eine kleine DSL Leitung. Ich hab über Nacht von meinem Heimrechner aus eine 2GB Datei auf meinem Server geschoben. Diese ist nun leider defekt :/. 2GB sind so 8-10 Stunden Uploadzeit, die will ich nur sehr ungerne nochmal machen.

Daher eine Frage: Kann man eventuell die lokale und die defekte Datei patchen? ZB, mit Rsync? Das nur die Defekten Teile "ausgewechselt" werden?

Ich habs mit

Code:
rsync -ncv --progress --stats file.tar remotefile.tar

versucht, aber der würde...

Code:
Number of files: 1
Number of files transferred: 1
Total file size: 1863475492 bytes
Total transferred file size: 1863475492 bytes
Literal data: 0 bytes
Matched data: 0 bytes
File list size: 43
File list generation time: 59.155 seconds
File list transfer time: 0.000 seconds
Total bytes sent: 65
Total bytes received: 26

sent 65 bytes  received 26 bytes  1.50 bytes/sec
total size is 1863475492  speedup is 20477752.66

...anscheinend die ganze Datei nochmal hochladen.

Hat noch einer eine kreative Idee?

Schöne Ostern noch!
-Christian.
 
jigdo?

Hatte mal was über net-p2p/jigdo gelesen,
jigdo ist das Werkzeug, mit dem vorzugsweise Debian seine Images verteilt(e),
um möglichst Bandbreite effizient/sparsam einzusetzen,
weil es wohl auch CD und DVD Images "upgraden" können soll
und dabei nur die Daten lädt, die sich geändert haben.


Gruß, Fusselbär
 
Daher eine Frage: Kann man eventuell die lokale und die defekte Datei patchen? ZB, mit Rsync? Das nur die Defekten Teile "ausgewechselt" werden?

Nein. Um einen Patch zu erstellen muss die defekte Datei mit der Originalen verglichen werden und somit müssen beide Teile auf einem Rechner vorhanden sein.
Du kannst aber etwas anderes versuchen, wenn es sich um einen abgebrochenen Upload handelt:

Schau nach, wieviel bytes ungefähr auf dem Zielrechner angekommen sind. angenommen es sind 1.8GB angekommen, geh auf nr Sicher und geh von 1.7 aus.
Local: Erstell mit dd eine Dtei, die die hinteren 0.3 GB enthält.
Remote: erstell mit dd eine Datei, die die ersten 1.7GB enthält.

Lad die 0.3 hoch und häng sie an die 1.7 Datei an. Du musst natürlich bytegenau arbeiten.
 
Nein. Um einen Patch zu erstellen muss die defekte Datei mit der Originalen verglichen werden und somit müssen beide Teile auf einem Rechner vorhanden sein.
Du kannst aber etwas anderes versuchen, wenn es sich um einen abgebrochenen Upload handelt:

Schau nach, wieviel bytes ungefähr auf dem Zielrechner angekommen sind. angenommen es sind 1.8GB angekommen, geh auf nr Sicher und geh von 1.7 aus.
Local: Erstell mit dd eine Dtei, die die hinteren 0.3 GB enthält.
Remote: erstell mit dd eine Datei, die die ersten 1.7GB enthält.

Lad die 0.3 hoch und häng sie an die 1.7 Datei an. Du musst natürlich bytegenau arbeiten.

Naja, die Dateien waren absolut Identisch (Größe).
Was ich gemacht habe: Ich hab die defekte Datei runtergeladen. (Downstream ist 1.6mb/s). So hatte ich Original und Kopie auf dem heimischen Rechner. Jetzt hätte ich ein Patch (bsdiff) machen können, aber: bsdiff brauchte bei der Größe einen RAM von 21GB (Ja, einundzwanzig Gigabyte). Was ich dann gemacht habe war folgendes: Ich hab jede Datei in 10MB große Stücke zerhackelt und die einzelnen Stücke dann mit bsdiff verglichen, und hatte so zum Schluss über 200 Patches mit einer Gesamtgröße von 2MB. Flux hochgeladen und gepatcht. Und siehe da: Die Sha256sum der auf dem Server befindlichen, auseinandergehaxelten, gepatchten und wieder zusammengeklebten Datei ist nun identisch mit der lokalen Datei.

Wie auch immer das geht. Aber es ging.

-Christian.
 
Du hast dich von der rsync(1) Ausgabe ins Boxhorn jagen lassen. rsync(1) ueberprueft die Datei in Checksumm-Bloecken und vergleicht erstmal nur die Checksummen, so aehnlich wie du das gemacht hast.

Hier ein Beispiel, es wird eine 2G Datei lokal und remote angelegt. Dann werden der lokalen Datei ein paar Bytes angehaengt. Eigentlich uebertragen werden muss so nur der letzte Block (aber es muessen halt alle Checksumm-Bloecke verglichen werden)
Code:
% truncate -s2g foo
% echo 1 >> foo
% \time rsync -va ./ acme:
sending incremental file list
./
foo

sent 185476 bytes  received 370802 bytes  2488.94 bytes/sec
total size is 2147483650  speedup is 3860.45
      223.42 real        60.47 user        26.58 sys

Hat also nur 4min gedauert und es ging nichtmal 1MB ueber die Leitung. Waehrend des Transfers kann man remote zusehen, wie die entsprechende Datei einmal umkopiert wird, nach erfolgreichem Abschluss wird sie dann nur noch ausgetauscht:

Code:
% ls -ltra foo .foo.aUsr6c
-rw-r--r--  1    2147483650 Mar 26 19:09 foo
-rw-------  1    563085312 Mar 26 19:16 .foo.aUsr6c
% ls -ltra foo .foo.aUsr6c
-rw-r--r--  1   2147483650 Mar 26 19:09 foo
-rw-------  1   1306001408 Mar 26 19:17 .foo.aUsr6c

Man achte auf die Timestamp. Nein, meine DSL-Leitung packt *nicht* 600MB pro Minute :(.

hth
 
Back
Top