rsync trennt immer wieder: Rohrbruch

14

Ich verwende, rsyncum mein Home-Verzeichnis zu sichern. Das hat schon lange gut funktioniert. Hier ist der Befehl, den ich verwende:

rsync \
    -pavz \
    --delete \
    --exclude 'mnt/' \
    --exclude '.cache/' \
    --exclude 'Videos/' \
    --exclude 'Music/' \
    --exclude 'Documents/virtualbox' \
    /home/"${USER}" "${server}":"${dir}" 2>> "${errorFile}"

Ich habe jedoch den Server gewechselt, auf den ich eine Sicherung mache, und rsyncstarte und läuft jetzt einige Sekunden (bis zu einigen Minuten), stoppt dann aber mit der Fehlermeldung

packet_write_wait: Connection to x.x.x.x: Broken pipe
rsync: [sender] write error: Broken pipe (32)
rsync error: unexplained error (code 255) at io.c(820) [sender=3.1.1]

Da es auf anderen Servern funktioniert, vermute ich, dass das Problem entweder die Verbindung oder der Server selbst ist. Die Verbindung scheint stabil zu sein. Ich bin über ein Kabel verbunden und sehe keine Unterbrechungen. Ich habe auch versucht, den Server während der Sicherung zu pingen. Der Ping hat eine Antwortrate von 100%, selbst wenn die Sicherung unterbrochen wird.

Ich benutze kerberoszur Authentifizierung auf dem Remote-Server.

Ich habe versucht , mehrere Kombinationen mit ServerAliveInterval, ServerAliveCountMaxoder ClientAliveIntervalin meinem ~/.ssh/config, aber ohne Erfolg.

Es könnte sein, dass auf dem Server etwas läuft, das den rsyncBefehl aus irgendeinem Grund beendet, aber ich weiß nicht, wie ich das untersuchen soll. Irgendwelche Ideen?

pfnuesel
quelle
Vielleicht sollte ich hinzufügen, dass ich mich kerberosauf dem Remote-Server authentifiziere.
Pfnuesel
Das ist möglicherweise sehr wichtig. Bitte bearbeiten Sie Ihre Frage, um diese Informationen aufzunehmen
Roaima
Schlägt der Aufruf von rsync auf diesem Server jedes Mal oder nur manchmal fehl? Wenn Sie wiederholt die Zeit messen, die zum Scheitern benötigt wird, erscheinen dann Muster? Ich denke an ein Zeitlimit für die Kerberos-Authentifizierung oder ähnliches.
Dhag
Wenn ich einen Io-Fehler sehe, frage ich mich, ob das Dateisystem der Remote-Seite voll ist.
Jeff Schaller
1
@ Rubynorails Interessant. Das scheint ohne Probleme zu funktionieren.
Pfnuesel

Antworten:

6

Ihr Problem könnte (mangelnder) Speicher sein. Damals, als 1 GB für einen Server groß war, schlug rsync bei großen Datenmengen bei mir fehl. Vielleicht hat sich der Algorithmus verbessert, und die Speicherkapazitäten haben zugenommen, aber ich habe dieses Problem seit ungefähr 8 Jahren nicht mehr gesehen. Also wirklich, dies ist eine Außenaufnahme, aber eine, die es wert ist, erkundet zu werden. Versuchen Sie zuerst kleinere Datensätze. Sie können auch versuchen, als Formular für die Überprüfung der geistigen Gesundheit einen Teer-Teer zu erstellen:

tar cf - $HOME | ssh ${server} tar xf -

Wenn dies auch nach einigen Minuten fehlschlägt, ist es kein Speicher.

Otheus
quelle
4

Ich habe dies auch rsyncin der Vergangenheit erlebt. Die Lösung, die das Problem für mich behoben hat, bestand darin, es innerhalb einer screenSitzung auszuführen, wodurch die Verbindung zum Remote-Server aufrechterhalten werden konnte.

screen -LS rsync
[execute your rsync command]
Ctrl-A+D to detach from the session

Sie können den Status überprüfen, indem Sie ausführen screen -x rsync(oder was auch immer Sie die Sitzung benennen möchten, wenn Sie ihr einen Namen geben, der nicht erforderlich ist). Dadurch wird Ihre aktuelle Shell erneut an diese Sitzung angehängt. Denken Sie daran, die Verbindung erneut zu trennen, nachdem Sie den Status überprüft haben, damit er im Hintergrund weiter ausgeführt wird.

Sie können den Befehl, über den screenim Hintergrund ausgeführt werden soll, auch auf einen Schlag ausführen, indem Sie [jemand korrigiert mich bitte, wenn ich falsch liege] screen -dm 'command'. Vielleicht möchten Sie es, man screenbevor Sie es mit dem letzten versuchen.

BEARBEITEN:

Ich bearbeite meine Antwort, weil Sie bestätigt haben, dass screendies in diesem Szenario keine Unterstützung bietet, aber Sie haben auf meinen Kommentar scpgeantwortet und vorgeschlagen, herauszufinden, welche Ergebnisse Sie erhalten. Darauf haben Sie seltsamerweise geantwortet, dass es einwandfrei funktioniert hat.

Meine neue Antwort lautet also: benutze scp- oder ssh(mit tar) - stattrsync

Zugegeben, scpdie große Anzahl von Merkmalen wie nicht unterstützt rsyncwerden, würde aber eigentlich nur , wie viele Features zu entdecken , überrascht , dass es funktioniert Unterstützung , die fast ist identisch zu dem rsync.

Reale Szenarien für scpund andere Alternativen zu rsync:

Vor einiger Zeit wurde ich beauftragt, ein Shell-Skript zu erstellen, mit dem Protokolle von unseren Produktionsservern abgerufen und lokal auf einem Webserver gespeichert werden, damit Entwickler zur Fehlerbehebung darauf zugreifen können. Nachdem ich erfolglos versucht hatte, das Unix-Team zur Installation rsyncauf unseren Servern zu bewegen, kam ich auf eine Problemumgehung, scpdie genauso gut funktionierte.

Davon abgesehen habe ich das Skript kürzlich so geändert, dass es nur sshund tar- GNU tar/ verwendet gtar, um genau zu sein. GNU tarunterstützt viele der Optionen , die Sie tatsächlich in finden rsync, wie zum Beispiel --include, die --excludeErlaubnis / Attribut Erhaltung, Kompression usw.

Die Art und Weise, wie ich dies jetzt erreiche, besteht darin, sshauf den Remote-Server (über pubkey auth) zuzugreifen und zu verwenden gtar -czf - [other options such as --include='*.log' and --exclude='*core*', etc.]- dies schreibt alle Informationen in stdout, die dann [lokal] weitergeleitet werden, tar -xzfdamit keine Änderungen auf dem Remote-Produktionsserver vorgenommen werden und alle Dateien werden unverändert auf den lokalen Server gezogen. Es ist eine großartige Alternative zu rsyncdiesem Fall. Das einzige, was weder wichtig tarnoch scpunterstützt wird, sind inkrementelle Sicherungen und die Ebene der Fehlerprüfung auf Blockebene, die diese rsyncFunktionen bietet.

Der vollständige Befehl , den ich mich beziehe , bei der Verwendung sshund tarso etwas wie diese würde (remote ist Solaris 10, lokal ist Debian, für das, was es wert ist ):

cd /var/www/remotelogs
ssh -C user@remotehost "cd /path/to/remote/app.directories; gtar -czf - --include='*.log' --exclude='*.pid' --exlude='*core*' *" | tar -xz

In Ihrem Szenario wäre es umgekehrt - tar -cf -lokal und über einen Pipe an den Remote-Server ssh user@remotehost "tar -xf -"- es gibt eine andere Antwort, die auf diese Art von Verhalten verweist, aber nicht so detailliert ist.

Es gibt einige andere Optionen, die ich aufgenommen habe, um die Dinge zu beschleunigen. Ich habe alles unermüdlich geplant, um die Ausführungszeit so gering wie möglich zu halten. Sie würden denken, dass die Verwendung der Komprimierung mit tarsinnlos wäre, aber sie beschleunigt die Dinge tatsächlich ein wenig, ebenso wie die Verwendung des -CFlags mit ssh, um die sshKomprimierung zu aktivieren . Ich kann diesen Beitrag zu einem späteren Zeitpunkt aktualisieren, um den genauen Befehl aufzunehmen, den ich verwende (der dem, was ich gepostet habe, sehr ähnlich ist), aber ich habe im Moment keine Lust, auf VPN zuzugreifen, da ich diese Woche im Urlaub bin.

Unter Solaris 10 verwende ich es auch -c blowfish, da es die schnellste Verschlüsselung ist, mit der man sich authentifizieren kann, und auch dazu beiträgt, die Dinge ein wenig zu beschleunigen, aber unser Solaris 11 unterstützt es entweder nicht oder hat diese Verschlüsselungssuite deaktiviert.

Wenn Sie sich für die Option ssh/ entscheiden tar, ist es außerdem eine gute Idee, meine ursprüngliche Lösung zu implementieren, screenwenn Sie ein Backup erstellen , das eine Weile dauert. Wenn nicht, stellen Sie sicher, dass Ihre Keepalive- / Timeout-Einstellungen in Ihrem ssh_configgenau richtig eingestellt sind. Andernfalls führt diese Methode sehr wahrscheinlich zu einem Rohrbruch.

Selbst wenn Sie mitmachen scp, finde ich es immer eine bewährte Methode, screenoder tmuxwenn Sie eine Operation dieser Art durchführen, nur für den Fall . Oft folge ich nicht meinen eigenen Ratschlägen und tue dies nicht, aber es ist in der Tat eine gute Praxis, eines dieser Tools zu verwenden, um sicherzustellen, dass der Remote-Job nicht versagt, weil Ihre aktive Shell-Sitzung irgendwie getrennt wird.

Ich weiß, dass Sie die Grundursache Ihres rsyncProblems herausfinden möchten . Wenn dies jedoch wirklich wichtig ist, sind dies zwei großartige Problemumgehungen, mit denen Sie in der Zwischenzeit experimentieren können.

Rubynorails
quelle
1
Ich habe es mit versucht screen, das Ergebnis ist das gleiche.
Pfnuesel
@pfnuesel - zumindest ist es gut zu wissen, dass Sie es ausschließen können.
Rubynorails
2

Kerberos dient nur zur Authentifizierung, die nach dem Herstellen einer erfolgreichen Verbindung keine Probleme verursachen sollte.

Haben Sie auch versucht, den rsync-Daemon zu verwenden?

Befinden sich Ihre Server im selben Netzwerk oder haben Sie eine Firewall / einen Router dazwischen?

Sie können versuchen, eine Netcat-Sitzung zwischen den Servern einzurichten. Dies ist eine einfache Methode, um zu versuchen, ob Verbindungsprobleme zwischen Ihren Servern auftreten.

Auf dem ersten Server:

nc -lk <port-number>

Und auf dem Kunden

nc <server> <port-number>

Sie können die Verbindung offen lassen und prüfen, ob die Verbindung erhalten bleibt oder ob Sie die Verbindung verlieren. Sie können auch versuchen, etwas auf den Client zu schreiben, um sicherzustellen, dass es auf der anderen Seite landet.

toed
quelle
Leider habe ich keinen Root-Zugriff auf dem Server. Dies bedeutet, dass ich keinen rsync-Daemon oder keine Netcat-Sitzung ausführen kann.
Pfnuesel
@pfnusel können Sie netcatauf jedem Port> 1024
ausführen,
2

Ich hatte das gleiche Problem unter OSX El Capitan und habe es durch ein Upgrade auf rsync v3.11 behoben. Das Problem trat bei mir in Version 2.6.9 auf.

Bruno
quelle
Ich renne rsync 3.1.1.
Pfnuesel
Möglicherweise möchten Sie überprüfen, ob auf Ihrem Router kein Paketüberflutungsschutz (oder ein ähnlicher Schutz) aktiviert ist. Stellen Sie eine Verbindung über ein VPN her?
Bruno
Das könnte das Problem sein. Leider habe ich keinen Zugriff auf die Netzwerkgeräte. Auf anderen Servern funktioniert es jedoch einwandfrei. Ich vermute also, dass dieser bestimmte Server über eine Art Paketüberflutungsschutz verfügt.
Pfnuesel
1

Sie haben etwas auf dem Remote-Server, das in stdout schreibt . Dies könnte in Ihrem .profileoder sein .bash_profile. Es könnte etwas weniger offensichtliches sein wie sttyoder mesg. Kopieren Sie im Zweifelsfall ein Transkript in Ihre Frage, ob Sie sich beim Server anmelden (redigieren Sie den Hostnamen auf jeden Fall).

Roaima
quelle
Ich verstehe nicht Weder was falsch läuft, noch was ich tun soll, um herauszufinden, was auf stdout steht.
Pfnuesel
@pfnuesel Wenn Sie das Protokoll Ihrer Anmeldung kopieren und hier posten, kann jemand sehen, was los ist. Besser, poste deine .profileoder .bash_profilezur Überprüfung. Sie suchen nach Dingen wie mesgoderstty
Roaima
Es gibt keine mesgoder sttykeine meiner Punktedateien.
Pfnuesel
@pfnuesel noch etwas, das während der Anmeldung in das Terminal schreibt?
Roaima
Nein, aber selbst wenn ich etwas hinzufüge, das in stdout schreibt. Es ändert nichts.
Pfnuesel
1

Das einzige Mal, dass ich ein solches Problem mit rsync hatte, habe ich es auf einen freien Ethernet-Port auf einem anderen Computer zurückgeführt, der dieselbe IP-Adresse wie mein Zielserver hatte. Wenn rsync flockig ist, liegt mit ziemlicher Sicherheit ein Netzwerkzuverlässigkeits- oder (in meinem Fall) Konfigurationsproblem vor.

Nathan Siemers
quelle
1

Ich traf ein ähnliches Problem beim Laufen rsyncoder manuell (entweder mit cp, scpoder in Gnome Nautilus) das Kopieren von großen Dateien von einem Linux - Desktop auf einen niedrigen angetriebenen ARM - basierten Linux - NAS über ein Gigabit - Kabelnetz (kein kerberosin meinem Setup). Die NAS-Laufwerke werden gemeinsam genutzt und mithilfe von sambaauf dem Client bereitgestellt cifs. Die Lösung für mich bestand darin, das NAS-Dateisystem ohne Zwischenspeicherung vom Client aus bereitzustellen (siehe auch Manpages von mount.cifs ):

sudo mount -t cifs //server.lan/somedir /mnt/somedir/ -o cache=none

Alternativ kann , wenn auf dem Client das NAS - Laufwerks Montag mit gvfsin nautilusdiesem Problem bestehen bleiben würde nicht , wenn große Dateien zu kopieren (aber das funktioniert nicht in Kombination mit rsyncthough).

Wenn Sie Linux gleichzeitig mit lokalen Festplattenlesevorgängen in das Netzwerkdateisystem schreiben lassen, wird näher erläutert, warum dieses Problem möglicherweise auftritt.

Davidovitch
quelle
0

Aktualisieren Sie einfach Ihre rsync-Versionen, um sicherzustellen, dass sie auf dem sendenden und dem empfangenden PC genau gleich sind . Siehe meine Antwort hier: /server/883487/unable-to-rsync-due-to-broken-pipe/988794#988794 .

Gabriel Staples
quelle
1
Warum das Downvote? Dies sollte vielleicht ein Kommentar sein, keine Antwort? Jemand? Jemand?
Gabriel Staples
1
Ich kann das Problem nicht mehr reproduzieren, da ich keinen Zugriff mehr auf diesen Server habe. Aber es ist eine vernünftige Antwort und verdient die Ablehnung nicht.
Pfnuesel