Bagaimana cara memperbaiki kesalahan paket korup dengan rsync untuk (relatif) file besar?

10

Mencoba memperbarui file di server, dengan rsyncperintah:

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

corrupt packet kesalahan terus dilemparkan, khususnya:

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]

Ini mungkin terkait dengan sshbatas waktu, karena tampaknya terjadi dengan file besar (r). Juga, saya terus mendapatkan batas waktu menggunakan WinSCP. Ini hanya terjadi pada saya; beberapa orang yang bekerja dengan saya yang menggunakan server ini tidak memiliki masalah yang sama.

Menggunakan rsyncdari terminal Cygwin di Windows 7, melawan server Centos 6.3.

Saya tidak yakin informasi apa yang mungkin berguna atau bagaimana cara mendapatkannya. Saya akan memperbarui pertanyaan atau menambahkan komentar sesuai saran.

Bagaimana saya mengatasi ini?

Terima kasih banyak!

Juan Carlos Coto
sumber

Jawaban:

12

Saya tidak yakin apa yang mungkin menyebabkan corrupt packetmasalah yang menjatuhkan koneksi Anda, tetapi Anda mungkin menemukan rsync --partialatau --partial-diropsi membantu saat mentransfer file besar sehingga ketika Anda memulai ulang transfer, itu akan berlanjut di mana transfer dibiarkan tanpa harus memulai alih mentransfer seluruh file lagi:

--partial-dir = .rsync-partial

Jadi, Anda dapat memodifikasi perintah asli Anda seperti ini:

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

atau

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

Perhatikan bahwa untuk contoh ini saya menghapus opsi -q( --quiet) dan menambahkan --progressopsi pada contoh pertama dan --partial-dir=.rsync-partialpada contoh kedua.

Perbedaan antara --partialdan --partial-dir=.rsync-partialadalah bahwa nanti membuat direktori yang membuat sebagian file terpisah dari file yang ditransfer sepenuhnya jika itu penting bagi Anda di sisi penerima (server).

The rsync manualnya akan menjelaskan hal ini lebih lanjut secara rinci, meskipun saya juga akan menunjukkan yang penting catatan keamanan dari manual ini:

PENTING: --partial-dir tidak boleh ditulis oleh pengguna lain atau itu adalah risiko keamanan. Misalnya HINDARI "/ tmp".

aculich
sumber
Saya mencoba kedua opsi, dan tidak memperbaiki masalah. Terima kasih atas petunjuknya.
Juan Carlos Coto
1

Korupsi menunjukkan driver NIC atau NIC yang buruk di mesin Anda; punya ini sekali di kotak Windows istri saya: harus berulang kali mencoba untuk menginstal rsync. Setelah itu berhasil, saya berulang kali dapat meminta rsync untuk mentransfer dan memperbaiki perangkat lunak lain yang diperlukan, yang paling penting termasuk driver NIC yang diperbarui dan alat checksum.

Phil P
sumber
0

Jika nilai ulimit adalah 0 atau angka kecil, itu harus memberikan kesalahan itu. Cobalah untuk meningkatkan nilai ulimit (such as 9999999999)dan coba lagi. Anda dapat menulis skrip shell kecil (a.sh)dan menggunakan sesuatu seperti ini:

#!/bin/sh
ulimit 99999999999

rsync -avrz --perms --delete --chmod=u+rwx,g+rx,o+x /dir1/ /dir2/
COA
sumber
1
Itu menarik. Saya belum mengerjakan ini untuk sementara waktu; namun, jika Anda ingin menjelaskan mengapa ini berhasil, saya pikir itu akan sangat berguna bagi siapa pun yang membaca pertanyaan ini. Terima kasih!
Juan Carlos Coto
-1

hanya loop sampai akhirnya ditransfer

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