📖 知识点简介
Rsync(Remote Sync)是 Linux 下最强大的文件同步工具,增量传输、差量拷贝、断点续传是其核心利器。结合 SSH 使用可实现安全的远程备份方案,是运维备份体系中最基础也最常用的一环。
🛠️ 核心命令整理
1. Rsync 参数速查
| 参数 | 含义 | 常用度 |
|---|---|---|
-a |
归档模式(递归 + 保留权限/时间/属主等) | ⭐⭐⭐ |
-v |
输出详细同步信息 | ⭐⭐⭐ |
-z |
传输时压缩 | ⭐⭐⭐ |
-P |
--partial --progress 合体,显示进度 + 断点续传 |
⭐⭐⭐ |
--delete |
删除目标目录中源没有的文件(保持严格一致) | ⭐⭐ |
--exclude |
排除指定文件/目录 | ⭐⭐⭐ |
--link-dest |
硬链接增量备份(节省空间神器) | ⭐⭐ |
-n |
dry-run 模拟运行,测试不实际执行 | ⭐⭐⭐ |
--bwlimit |
限制带宽(KB/s),防止占满业务带宽 | ⭐⭐ |
-e |
指定远程 shell(默认 SSH,可自定义端口) | ⭐⭐ |
2. 本地同步
bash
# 基本同步:将源目录同步到目标目录
rsync -av /data/source/ /data/backup/
# 注意斜杠差异:
# 带斜杠 /data/source/ → 同步目录内容
# 不带斜杠 /data/source → 同步目录本身
# 结果:/data/backup/file.txt (带斜杠)
# 结果:/data/backup/source/file.txt (不带斜杠)
# 带进度条 + 压缩
rsync -avzP /data/source/ /data/backup/
3. 远程同步(基于 SSH)
bash
# 推送到远程服务器
rsync -avzP /data/local/ user@remote:/data/backup/
# 从远程拉取
rsync -avzP user@remote:/data/remote/ /data/local_copy/
# 指定 SSH 端口(默认 22 时无需 -e)
rsync -avzP -e "ssh -p 22222" /data/ user@host:/data/
# 指定密钥文件
rsync -avzP -e "ssh -i ~/.ssh/id_ed25519 -p 22222" /data/ user@host:/data/
📋 实操示例
场景 1:网站目录每日增量备份脚本
bash
#!/bin/bash
# /usr/local/bin/backup_web.sh
# 功能:每日增量备份 /var/www/html 到 /backup/web/
SRC="/var/www/html/"
DST="/backup/web/"
LOG="/var/log/rsync_web.log"
DATE=$(date "+%Y-%m-%d %H:%M:%S")
echo "[$DATE] Starting backup..." >> "$LOG"
rsync -avzP --delete \
--exclude="cache/" \
--exclude=".tmp/" \
--exclude="*.log" \
"$SRC" "$DST" >> "$LOG" 2>&1
if [ $? -eq 0 ]; then
echo "[$DATE] Backup completed successfully" >> "$LOG"
else
echo "[$DATE] Backup FAILED!" >> "$LOG"
fi
加入 crontab 每天凌晨 3 点执行:
bash
0 3 * * * /usr/local/bin/backup_web.sh
场景 2:硬链接增量备份(类比 macOS Time Machine)
利用 --link-dest 实现全量备份的体验、增量备份的存储:
bash
#!/bin/bash
# /usr/local/bin/backup_hardlink.sh
# 功能:硬链接增量备份 /data/project
SRC="/data/project/"
BASE="/backup/project"
DATE=$(date +%Y%m%d_%H%M%S)
DST="$BASE/$DATE"
LATEST=$(ls -1d "$BASE"/*/ 2>/dev/null | tail -1)
mkdir -p "$BASE"
# 首次备份
if [ -z "$LATEST" ]; then
rsync -avzP "$SRC" "$DST"
echo "[$DATE] Full backup done -> $DST"
else
rsync -avzP --link-dest="$LATEST" "$SRC" "$DST"
echo "[$DATE] Incremental backup done -> $DST (based on $LATEST)"
fi
# 只保留最近 7 天
find "$BASE" -maxdepth 1 -type d -mtime +7 -exec rm -rf {} ;
第一次跑是全量,后续每次只存差异部分。未修改的文件通过硬链向上一版本,空间近乎零增长。
场景 3:断点续传 + 带宽限制(传输大文件)
bash
# 10MB 日志文件半路断了?--partial 从断点接着传
rsync -avP --partial --bwlimit=1024 /data/bigfile.log user@remote:/backup/
# bwlimit=1024 ≈ 1MB/s,白天跑不影响业务
# 不加 --bwlimit 会打满带宽,慎用
场景 4:模拟运行校验
bash
# -n(dry-run)检查会同步哪些文件,不做实际传输
rsync -avzn --delete /data/source/ /data/backup/
生产环境一定要先 dry-run! 加
--delete时尤其小心,一次误操作可能清空目标目录。
⚠️ 常见坑点 & 注意事项
-
斜杠
/决定目录层级 --- 这是 rsync 最容易踩的坑。src/vssrc结果完全不同。写脚本时统一用带斜杠的写法,行为更容易预测。 -
--delete必须配合 dry-run 使用 ---rsync -av --delete会把目标中有但源没有的文件全部删掉。如果源路径写错了,后果很严重。每次跑--delete前先加-n模拟一遍。 -
--exclude模式注意路径是相对源目录的 --- 不要写成绝对路径。例如同步/var/www/html/时排除缓存:bash# ✅ 正确 rsync -av --exclude="cache/" /var/www/html/ /backup/ # ❌ 错误 rsync -av --exclude="/var/www/html/cache/" /var/www/html/ /backup/ -
SSH 传输大文件时网络不稳定 --- 建议加
-P(=--partial --progress),万一断了重跑会自动续传。配合screen或tmux使用更稳妥,防止终端关闭中断传输。 -
文件变化监控用 inotify + rsync 替代定时任务 --- 如果文件变化频繁且需要实时同步,crontab 定频不够及时。可以用
inotifywait监听文件变化后触发 rsync:bash# 需安装 inotify-tools while inotifywait -r -e modify,create,delete /data/watch/; do rsync -avz /data/watch/ user@remote:/backup/ done -
Rsync daemon 模式(rsync://) --- 除了 SSH 隧道,rsync 还支持走自己的 873 端口作为 daemon 服务。配置
/etc/rsyncd.conf可实现模块化分享,但这会暴露端口在外网,建议仅在内网使用,外网务必走 SSH 隧道。 -
备份脚本注意日志记录 --- 不加日志,出问题了根本不知道备份有没有执行成功。建议同时记录退出码并配合告警(如邮件/企业微信通知)。
Rsync 是运维工具箱里的瑞士军刀:增量、差量、远程、限速、断点续传,一个命令全搞定。搭配 SSH 加密传输,就是最轻量的异地灾备方案。