(比較的)大きなファイルのrsyncでの破損パケットエラーを修正する方法


10

rsync次のコマンドを使用して、サーバー上のファイルを更新しようとしています:

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

corrupt packet エラーがスローされ続けます、具体的には:

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]

ssh大きな(r)ファイルで発生するように思われるため、これはおそらくタイムアウトに関連しています。また、WinSCPを使用してタイムアウトが発生し続けます。これは私だけに起こっています。このサーバーを使用している私と一緒に働く人々の何人かは同じ問題を抱えていません。

rsyncCentos 6.3サーバーに対して、Windows 7のCygwin端末から使用する。

他にどのような情報が役立つか、またはどのように取得するかはわかりません。提案に従って、質問を更新するか、コメントを追加します。

これをどのように解決すればよいですか?

どうもありがとう!

回答:


12

何が原因でcorrupt packet接続が切断されるの--partialかはわかりませんが、--partial-dir大きなファイルを転送するときにrsync またはオプションが役立つため、転送を再開したときに、転送をやり直す代わりに転送が中断したところから続行されます。再びファイル全体:

--partial-dir = .rsync-partial

したがって、次のように元のコマンドを変更できます。

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

または

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

この例では、-q--quiet)オプションを削除--progressし、最初の例と--partial-dir=.rsync-partial2番目の例にオプションを追加したことに注意してください。

違い--partialとは--partial-dir=.rsync-partial、後でそれが受信側(サーバー)側のあなたにとって重要である場合は、部分的なファイルが完全に転送されたファイルとは別に保持ディレクトリを作成することです。

rsyncのmanページには、私はまた、重要な指摘ますけれども、さらに詳細にこれを説明しますセキュリティノートをマニュアルページから:

重要:--partial-dirは他のユーザーが書き込み可能であってはなりません。そうしないと、セキュリティ上のリスクがあります。たとえば、 "/ tmp"は避けます。


私は両方のオプションを試しましたが、どちらも問題を解決しませんでした。ヒントをありがとう。
ファンカルロスコト2014

1

破損は、マシンのNICまたはNICドライバーが不良であることを示しています。私の妻のWindowsボックスでこれが一度ありました:rsyncをインストールするように繰り返し試みる必要がありました。それが成功したら、rsyncを繰り返し呼び出して、特に更新されたNICドライバーとチェックサムツールを含む必要な他のソフトウェアを転送して修正することができました。


0

ulimit値が0または小さな数値の場合、そのエラーが発生しているはずです。ulimit値を増やして(such as 9999999999)再試行してください。小さなシェルスクリプト(a.sh)を記述して、次のようなものを使用できます。

#!/bin/sh
ulimit 99999999999

rsync -avrz --perms --delete --chmod=u+rwx,g+rx,o+x /dir1/ /dir2/

1
それは面白い。私はしばらくこれに取り組んでいません。ただし、なぜそれが機能するのかを説明したい場合は、この質問を読んだ人にとっては非常に役立つと思います。ありがとう!
ファンカルロスコト

-1

最終的に転送されるまでループする

while ! sshpass -p 'xxxx' rsync --partial --append-verify --progress -a -e 'ssh -p 22' /source/ remoteuser@1.1.1.1:/dest/; do sleep 5;done
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.