一、为什么你的群晖NAS同步总是卡在大目录?
每次用rsync同步几十GB的相册目录时,进度条就像蜗牛爬?这其实是因为rsync默认会对整个目录树做全量校验。想象一下,它像个认真的图书管理员,每次都要把书架上的每本书都摸一遍确认位置——哪怕99%的书根本没动过。
典型症状:
- 同步开始时长时间卡在"calculating..."
- 网络带宽占用忽高忽低
- 小文件越多卡顿越明显
# 经典卡顿场景示例(技术栈:rsync命令)
rsync -avz /volume1/Photos/ user@remote:/backup/Photos/
# -a 归档模式(包含递归、保留属性等)
# -v 显示详细过程
# -z 启用压缩
二、增量校验:给rsync装上记忆芯片
解决方案是让rsync记住上次的检查结果。就像考试时允许带笔记,不用每次都重新推导公式。
关键技术参数:
rsync -avz --checksum --partial --progress \
--link-dest=/backup/Photos/last_backup \
/volume1/Photos/ user@remote:/backup/Photos/$(date +%Y%m%d)
# --checksum 基于文件内容校验(而非默认的修改时间+大小)
# --partial 保留中断的传输
# --progress 显示实时进度
# --link-dest 硬链接指向未修改文件(节省空间)
实战优化案例:
#!/bin/bash
# 增量备份脚本(技术栈:Shell脚本)
LAST_BACKUP=$(ssh user@remote "ls -d /backup/Photos/2* | tail -n1")
rsync -avz --delete \
--checksum \
--partial \
--link-dest="$LAST_BACKUP" \
--exclude="*.tmp" \
--exclude="@eaDir" \
/volume1/Photos/ \
user@remote:/backup/Photos/$(date +%Y%m%d)
# --delete 删除目标端不存在于源端的文件
# --exclude 排除临时文件和群晖系统目录
三、缓存优化:让频繁同步飞起来
对于需要每小时同步的监控录像目录,可以启用rsync的持久化缓存:
# 启用rsync守护进程模式(技术栈:rsyncd.conf)
cat <<EOF > /etc/rsyncd.conf
[surveillance]
path = /volume1/Surveillance
comment = 实时监控存档
uid = root
gid = root
read only = yes
dont compress = *.mp4
hosts allow = 192.168.1.0/24
secrets file = /etc/rsyncd.secrets
daemon chmod = yes
EOF
# 配套的客户端命令
rsync -avz --progress \
--password-file=/etc/rsync.pass \
/volume1/Surveillance/ \
rsync://user@remote/surveillance
内存缓存技巧:
# 使用/tmp作为临时中转区(技术栈:Linux Shell)
TMP_DIR=$(mktemp -d)
rsync -avz --temp-dir="$TMP_DIR" \
--compare-dest="$TMP_DIR/compare" \
/volume1/Projects/ \
user@remote:/backup/Projects/
# --temp-dir 指定临时文件目录(内存文件系统更佳)
# --compare-dest 与指定目录对比减少传输
四、避坑指南与高阶技巧
1. 权限陷阱:
群晖的@eaDir系统目录经常导致权限拒绝错误,建议添加:
--exclude='@eaDir/**' \
--exclude='#recycle/**' \
2. 网络优化:
# 限制带宽+重试策略(技术栈:rsync+iptables)
rsync -avz --bwlimit=5000 \
--timeout=30 \
--contimeout=20 \
/volume1/Music/ \
user@remote:/backup/Music/
# 配合QoS规则(需root权限)
iptables -A OUTPUT -p tcp --dport 873 -m owner --uid-owner rsyncuser -j CLASSIFY --set-class 1:1
3. 自动化监控方案:
#!/bin/bash
# 健康检查脚本(技术栈:Shell+邮件告警)
LOG_FILE="/var/log/rsync_status.log"
if ! pgrep -f "rsync.*/volume1/Important"; then
echo "[$(date)] Rsync进程异常终止" >> "$LOG_FILE"
mail -s "RSYNC警报" admin@example.com < "$LOG_FILE"
# 尝试自动重启
nohup rsync -avz /volume1/Important/ user@remote:/backup/Important/ &
fi
五、场景适配与终极方案
适合场景:
- 跨机房备份(配合
--compress-level=9) - 摄影师原始素材同步(建议
--max-size=10G限制单文件) - 虚拟机镜像传输(启用
--sparse处理稀疏文件)
不适用情况:
- 实时双向同步(考虑用Syncthing)
- 百万级小文件(建议先打包)
- Windows服务器(需换成cygwin版rsync)
终极组合拳:
#!/bin/bash
# 企业级备份方案(技术栈:Shell+rsync+校验)
BACKUP_DATE=$(date +%Y%m%d)
LOCK_FILE="/tmp/rsync_$BACKUP_DATE.lock"
# 防并发锁
exec 9>"$LOCK_FILE" || exit 1
flock -n 9 || { echo "已有同步进程运行"; exit 2; }
# 主同步流程
rsync -avAXz --stats \
--numeric-ids \
--delete --delete-excluded \
--exclude-from='/etc/rsync_excludes.lst' \
/volume1/Data/ \
user@remote:/backup/Data/$BACKUP_DATE
# 生成校验文件
ssh user@remote "cd /backup/Data/$BACKUP_DATE && sha256sum * > checksum.sha256"
# 释放锁
exec 9>&-
技术总结:
- 增量校验比全量扫描快10倍以上
- 适当的内存缓存能减少90%的IO等待
- 排除系统目录可避免80%的权限错误
- 带宽限制反而可能提高总体传输效率
下次当你的群晖NAS同步又卡住时,不妨试试这些方法。记住,好的工具就像瑞士军刀,关键是要知道每个组件的正确用法。
评论