如何为(相对)大文件使用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超时有关,因为它似乎在large(r)文件中发生。另外,我一直在使用WinSCP超时。这只发生在我身上;与我一起使用该服务器的几个人没有相同的问题。

使用rsync从Windows 7 Cygwin的终端,对一个CentOS 6.3服务器。

我不确定还有哪些其他信息可能有用或如何获得。我将根据任何建议更新问题或添加评论。

我该如何解决?

非常感谢!

Answers:


12

我不确定是什么原因会导致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在第一个示例和--partial-dir=.rsync-partial第二个示例中添加了该选项。

--partial和之间的区别--partial-dir=.rsync-partial是,后者在接收方(服务器)对您很重要的情况下,会创建一个目录,使部分文件与完全传输的文件分开。

rsync的手册页将进一步详细解释这一点,虽然我也会指出一个重要的安全说明的手册页:

重要说明:--partial-dir不能被其他用户写入,否则存在安全风险。例如,避免使用“ / tmp”。


我尝试了两种选择,但均未解决问题。不过,感谢您的提示。
Juan Carlos Coto 2014年

1

损坏表明计算机中的NIC或NIC驱动程序有问题;在我妻子的Windows机器上曾经有过一次:不得不反复尝试安装rsync。一旦成功,我可以反复调用rsync来传输和修复所需的其他软件,其中最著名的是包括更新的NIC驱动程序和校验和工具。


0

如果ulimit值为0或一个小数字,则应该给出该错误。尝试增加ulimit值,(such as 9999999999)然后重试。您可以编写一个小shell脚本(a.sh)并使用如下代码:

#!/bin/sh
ulimit 99999999999

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

1
那很有意思。我已经有一段时间没有从事此工作了。但是,如果您想解释一下它为什么起作用,那么我认为对于阅读该问题的人来说,它真的很有用。谢谢!
Juan Carlos Coto 2015年

-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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.