Wie behebe ich einen beschädigten Paketfehler mit rsync für (relativ) große Dateien?

10

Versuch, Dateien auf einem Server mit dem folgenden rsyncBefehl zu aktualisieren :

rsync -ravq -e "ssh -o ConnectTimeout=2 -o ServerAliveInterval=2 -ServerAliveCountMax=2" --delete ./local_dir user@$SERVER:/dest_dir

corrupt packet Fehler werden immer wieder geworfen, insbesondere:

rsync: writefd_unbuffered failed to write 4092 bytes to socket [sender]: Broken pipe (32)
rsync: connection unexpectedly closed (11337 bytes received so far) [sender]
rsync error: unexplained error (code 255) at /home/lapo/package/rsync-3.0.9-1/src/rsync-3.0.9/io.c(605) [sender=3.0.9]

Dies hängt wahrscheinlich mit einer sshZeitüberschreitung zusammen, da dies bei großen (r) Dateien der Fall zu sein scheint. Außerdem bekomme ich mit WinSCP immer wieder Zeitüberschreitungen. Das passiert nur mir; Einige der Leute, mit denen ich zusammenarbeite und die diesen Server verwenden, haben nicht das gleiche Problem.

Verwendung rsyncvon einem Cygwin-Terminal in Windows 7 gegen einen Centos 6.3-Server.

Ich bin mir nicht sicher, welche anderen Informationen nützlich sein könnten oder wie ich sie erhalten kann. Ich werde die Frage aktualisieren oder Kommentare gemäß den Vorschlägen hinzufügen.

Wie soll ich das lösen?

Vielen Dank!

Juan Carlos Coto
quelle

Antworten:

12

Ich bin nicht sicher, was das corrupt packetProblem verursachen könnte, das Ihre Verbindung trennt, aber Sie finden möglicherweise rsync --partialoder die --partial-dirOption hilfreich, wenn Sie große Dateien übertragen, damit die Übertragung beim Neustart dort fortgesetzt wird, wo die Übertragung aufgehört hat, anstatt erneut mit der Übertragung beginnen zu müssen wieder ganze Datei:

--partial-dir = .rsync-partiell

So können Sie Ihren ursprünglichen Befehl folgendermaßen ändern:

rsync -rav --progress --partial -e "ssh -o ConnectTimeout=2 -o ServerAliveInterval=2 -ServerAliveCountMax=2" --delete ./local_dir user@$SERVER:/dest_dir

oder

rsync -rav --progress --partial-dir=.rsync-partial -e "ssh -o ConnectTimeout=2 -o ServerAliveInterval=2 -ServerAliveCountMax=2" --delete ./local_dir user@$SERVER:/dest_dir

Beachten Sie, dass ich für dieses Beispiel die Option -q( --quiet) entfernt und die --progressOption im ersten Beispiel und --partial-dir=.rsync-partialim zweiten Beispiel hinzugefügt habe .

Der Unterschied zwischen --partialund --partial-dir=.rsync-partialbesteht darin, dass später ein Verzeichnis erstellt wird, das die Teildateien von den vollständig übertragenen Dateien trennt, wenn dies für Sie auf der Empfängerseite (Server) wichtig ist.

Die rsync-Manpage erklärt dies ausführlicher, ich werde jedoch auch auf einen wichtigen Sicherheitshinweis aus der Manpage hinweisen :

WICHTIG: Das --partial-dir sollte nicht von anderen Benutzern beschreibbar sein, da es sonst ein Sicherheitsrisiko darstellt. ZB VERMEIDEN "/ tmp".

aculich
quelle
Ich habe beide Optionen ausprobiert und beides hat das Problem nicht behoben. Vielen Dank für den Hinweis.
Juan Carlos Coto
1

Die Beschädigung deutet auf eine fehlerhafte Netzwerkkarte oder einen fehlerhaften Treiber in Ihrem Computer hin. hatte dies einmal auf der Windows-Box meiner Frau: musste wiederholt versuchen, rsync zu installieren. Sobald dies erfolgreich war, konnte ich wiederholt rsync aufrufen, um die andere benötigte Software zu übertragen und zu reparieren, die insbesondere aktualisierte NIC-Treiber und ein Prüfsummen-Tool enthielt.

Phil P.
quelle
0

Wenn der ulimit-Wert 0 oder eine kleine Zahl ist, sollte dieser Fehler angezeigt werden. Versuchen Sie, den Ulimit-Wert zu erhöhen, (such as 9999999999)und versuchen Sie es erneut. Sie können ein kleines Shell-Skript schreiben (a.sh)und so etwas verwenden:

#!/bin/sh
ulimit 99999999999

rsync -avrz --perms --delete --chmod=u+rwx,g+rx,o+x /dir1/ /dir2/
COA
quelle
1
Das ist interessant. Ich habe eine Weile nicht daran gearbeitet; Wenn Sie jedoch erklären möchten, warum es funktioniert, ist es meiner Meinung nach sehr nützlich für jeden, der diese Frage liest. Vielen Dank!
Juan Carlos Coto
-1

Schleife einfach, bis es endgültig übertragen wird

while ! sshpass -p 'xxxx' rsync --partial --append-verify --progress -a -e 'ssh -p 22' /source/ [email protected]:/dest/; do sleep 5;done
Toolkit
quelle