我正在使用这样的脚本:
rsync -avu --delete --progress user@host:~/backup .
并且每次过了一会儿,都会收到此错误:
rsync: connection unexpectedly closed (10251754 bytes received so far) [receiver]
rsync error: error in rsync protocol data stream (code 12) at io.c(226) [receiver=3.1.0]
rsync: connection unexpectedly closed (45482 bytes received so far) [generator]
rsync error: unexplained error (code 255) at io.c(226) [generator=3.1.0]
# generator = Debian 5, rsync version 3.0.3 protocol version 30 (Generator[A])
# receiver = Ubuntu 14.04, rsync version 3.1.0 protocol version 31 (Receiver[A])
我有十多年的经验rsync
,我尝试了一切方法,但我不明白为什么会发生这种情况。
两侧:日志中没有错误,tcpdump 中没有异常,没有连接问题,没有防火墙。只是一段时间后传输突然停止。
问题不局限于一台服务器。
我认为这可能是 rsync 版本之间不兼容的问题,因此我将生成器切换到完全不同的服务器场上的全新服务器(Debian 8),并在接收器上更新 rsync,但出现此错误:
rsync: connection unexpectedly closed (31931964 bytes received so far) [receiver]
rsync: [generator] write error: Broken pipe (32)
rsync error: unexplained error (code 255) at io.c(820) [generator=3.1.2]
rsync error: error in rsync protocol data stream (code 12) at io.c(226) [receiver=3.1.2]
# generator = Debian 8, rsync version 3.1.1 protocol version 31 (Generator[B])
# receiver = Ubuntu 14.04, rsync version 3.1.2 protocol version 31 (Receiver[B])
然后我尝试通过代理同步接收器[A]和生成器[B],并且成功了
Receiver[A](Italy) <=> HTTP Proxy(Paris) <=> Generator[B](Strasbourg)
所以现在我有
Receiver[A] <=> Generator[A] // ERROR
Receiver[A] <=> Generator[B] // ERROR
Receiver[B] <=> Generator[B] // ERROR
Receiver[A] <=> HTTP Proxy <=> Generator[A] // OK
Receiver[A] <=> HTTP Proxy <=> Generator[B] // OK
我也尝试过不使用 HTTP 代理
Receiver[A] <=> Generator[C] // OK
Receiver[A] <=> Generator[D] // OK
Receiver[A] <=> Generator[E] // ERROR
其中发电机[C]
、[D]
和[E]
是位于巴黎的服务器(与我的同一服务器场HTTP Proxy
)rsync 3.0.9, prot. v. 30
。
所以底线是:我在多个地点有多台服务器。Receiver[A]
我没有防火墙,几天前一切正常。现在rsync
回来了unexplained error
,我不知道为什么。
我认为这是某种物理网络错误(不是在我的计算机上),但我不知道是否可以找到、隔离和重现这个错误。
感谢您的帮助!
答案1
看起来您很难确定问题所在,但重现问题没有问题。在这种情况下,如果您能排除 SSH 连接本身的故障以及通过该连接获取的数据,可能会有所帮助。
您可以像下面这样运行rsync
命令,它将生成一些数据转储:
rsync -e 'bash -x -c "ssh -vvvv $0 $@ 2>/tmp/rsync-ssh.stderr | tee /tmp/rsync.stdout"' -avu --delete --progress user@host:~/backup .
查看这些文件的末尾可能会有一些有用的信息。例如,如果 SSH 连接中断,则应该在 中显示一些信息/tmp/rsync-ssh.stderr
。如果问题确实出在另一端,则 中的实际 rsync 协议转储/tmp/rsync.stdout
可能有一些字符串化的提示 ( strings /tmp/rsync.stdout
)。
如果我不得不猜测的话,这要么是一个糟糕的防火墙,要么是一个损坏数据包的物理问题,导致 SSH 连接中断。
答案2
写入磁盘缓存的速度可能rsync
比服务器上的磁盘能够跟上的速度更快,例如https://unix.stackexchange.com/a/331189/163108更详细的解释,以及https://unix.stackexchange.com/a/523896/163108对于类似的问题,但是在使用 / 安装的驱动器时情况rsync
有所samba
不同cifs
。
一种可能的解决方案是rsync
使用该--bwlimit=
选项进行节流。根据服务器的网络/磁盘性能,我建议尝试 2000-10000 之间的值(以 kbit/s 为单位)。