rsync传输出现Broken pipe(32)连接中断问题求助
问题背景
尝试将约70GB图片/视频从Proxmox Debian VM传输到Raspberry Pi 4B,rsync连接随机中断,报错:
2023/06/21 03:05:28 [902423] rsync: [sender] write error: Broken pipe (32)
2023/06/21 03:05:28 [902423] sent 8888398299 bytes received 24769 bytes total size 43016448521
2023/06/21 03:05:28 [902423] rsync error: unexplained error (code 255) at io.c(823) [sender=3.2.3]
已尝试发送端SSH配置ServerAliveInterval/ServerAliveCountMax、排除内存不足,希望保留rsync特性,不愿改用scp。
环境配置:
- 发送端:Proxmox VM(Debian),4核i5-8259U,6GB内存+4GB交换空间
- 接收端:Raspberry Pi 4B(Raspbian),4GB内存
- 两端rsync版本均为3.2.3
可行解决办法
1. 强制在rsync命令中指定SSH双向保活参数
仅修改发送端~/.ssh/config可能未生效,直接在rsync命令中通过-e参数传递SSH选项,确保双向连接检测:
rsync -caPv -e "ssh -o ServerAliveInterval=20 -o ServerAliveCountMax=5 -o ClientAliveInterval=20 -o ClientAliveCountMax=5" --log-file='/home/user/backuplog/library-transfer.log' '/srv/docker/data-dir/' backupHost:'/mnt/hdd/docker/data/library-`date +"%d%m%Y"`/'
ServerAliveInterval:发送端每20秒向接收端发送SSH存活检测包ServerAliveCountMax:连续5次未收到回应则触发重连(rsync支持断点续传)ClientAliveInterval/ClientAliveCountMax:接收端向发送端发送检测包,避免单向断连未被察觉
2. 调整rsync传输缓冲与限速
大文件传输时,默认缓冲可能导致IO阻塞或网络丢包,手动设置缓冲大小并限速:
rsync -caPv --buffer-size=64M --bwlimit=1000 -e "ssh -o ServerAliveInterval=20 -o ServerAliveCountMax=5" --log-file='/home/user/backuplog/library-transfer.log' '/srv/docker/data-dir/' backupHost:'/mnt/hdd/docker/data/library-`date +"%d%m%Y"`/'
--buffer-size=64M:增大传输缓冲,减少磁盘IO频繁切换--bwlimit=1000:限制传输速度为1000KB/s(可根据局域网带宽调整,避免占满带宽导致丢包)
3. 拆分传输任务
将大目录拆分为多个子任务单独传输,避免单次任务过长导致中断:
#!/bin/bash if [[ "$EUID" -ne '0' ]]; then echo "Missing root privileges" exit fi TARGET_DIR="/mnt/hdd/docker/data/library-`date +"%d%m%Y"`/" # 提前在接收端创建目标目录 ssh backupHost "mkdir -p $TARGET_DIR" # 遍历源目录下的子目录/文件,逐个传输 for item in /srv/docker/data-dir/*; do item_name=$(basename "$item") echo "Transferring $item_name..." rsync -caPv -e "ssh -o ServerAliveInterval=20 -o ServerAliveCountMax=5" --log-file="/home/user/backuplog/library-transfer-$item_name.log" "$item" backupHost:"$TARGET_DIR" done
即使某一个子任务中断,只需重新执行该子任务即可,无需从头开始。
4. 检查接收端磁盘挂载与IO状态
Raspberry Pi的USB硬盘可能存在IO瓶颈或挂载不稳定:
- 查看磁盘错误日志(在RPi上执行):
dmesg | grep -i error
- 监控实时IO状态(在RPi上执行):
iostat -x 5
如果发现磁盘IO使用率持续100%,暂停其他占用IO的任务,或更换更快的USB硬盘/接口。
5. 禁用rsync的高级特性(可选)
两端rsync的特性差异(如64位时间戳)可能导致兼容问题,尝试禁用部分非必要特性:
rsync -caPv --no-times --no-acls --no-xattrs -e "ssh -o ServerAliveInterval=20 -o ServerAliveCountMax=5" --log-file='/home/user/backuplog/library-transfer.log' '/srv/docker/data-dir/' backupHost:'/mnt/hdd/docker/data/library-`date +"%d%m%Y"`/'
--no-times:不保留文件时间戳,避免32/64位时间戳兼容问题--no-acls/--no-xattrs:不传输ACL和扩展属性,减少传输数据量
内容的提问来源于stack exchange,提问作者786yt

