Как исправить ошибку поврежденного пакета с помощью 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. Это происходит только со мной; у некоторых из тех, с кем я работаю, этот сервер не имеет такой же проблемы.

Использование rsyncс терминала Cygwin в Windows 7, против сервера Centos 6.3.

Я не уверен, какая другая информация может быть полезна или как ее получить. Я буду обновлять вопрос или добавлять комментарии согласно любым предложениям.

Как мне решить это?

Большое спасибо!

Хуан Карлос Кото
источник

Ответы:

12

Я не уверен, что может вызвать corrupt packetпроблему, которая разрывает ваше соединение, но вы можете найти rsync --partialили --partial-dirопцию полезной при передаче больших файлов, чтобы при перезапуске передачи она продолжалась там, где передача прекратилась, вместо того, чтобы начинать пересылку снова весь файл:

--partial-Dir = .rsync-частичная

Таким образом, вы можете изменить исходную команду следующим образом:

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-partialво втором примере.

Разница между --partialи --partial-dir=.rsync-partialзаключается в том, что позднее создается каталог, в котором отдельные файлы хранятся отдельно от полностью переданных файлов, если это важно для вас на стороне получателя (сервера).

Rsync страница руководство будет объяснить это более подробно, хотя я также отметить важное примечание безопасности из страницы руководства:

ВАЖНО: --partial-dir не должен быть доступен для записи другим пользователям, иначе это угроза безопасности. Например, ИЗБЕГАТЬ "/ tmp".

aculich
источник
Я испробовал оба варианта, и ни один не решил проблему. Спасибо за подсказку, хотя.
Хуан Карлос Кото
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/
COA
источник
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
Инструментарий
источник