web-dev-qa-db-ja.com

(比較的)大きなファイルのrsyncで破損したパケットエラーを修正するにはどうすればよいですか?

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を使用してタイムアウトが発生し続けます。これは私だけに起こっています。このサーバーを使用している私と一緒に働く人々の何人かは同じ問題を抱えていません。

Centos 6.3サーバーに対して、Windows 7のCygwinターミナルからrsyncを使用します。

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

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

どうもありがとう!

10

corrupt packetの問題が原因で接続が切断される原因は不明ですが、大きなファイルを転送するときにrsyncの--partialまたは--partial-dirオプションを使用すると、転送を再開するときに役立つ場合があります。ファイル全体の転送をやり直す必要がなく、転送が中断したところから続行します。

--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オプションを追加し、2番目の例に--partial-dir=.rsync-partialを追加したことに注意してください。

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

rsyncマンページ でこれについて詳しく説明しますが、マンページの重要なセキュリティノートについても指摘します。

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

12
aculich

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

1
Phil P

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/
0
C.O.A.