Rsync 命令详解:Linux 文件同步与备份的艺术
Rsync 命令详解:Linux 文件同步与备份的艺术
- 一、认识 rsync
- 二、安装与基本语法
- 2.1 安装
- 2.2 语法与斜杠陷阱
- 三、常用选项速查表
- 3.1 选项列表
- 3.2 归档模式与常用组合
- 四、本地同步实战
- 五、远程同步:推与拉
- 5.1 推送(本地 → 远程)
- 5.2 拉取(远程 → 本地)
- 5.3 使用非标准 SSH 端口
- 六、镜像同步与 --delete
- 6.1 实现严格镜像
- 6.2 安全变体
- 七、增量备份与快照 (--link-dest)
- 7.1 硬链接快照原理
- 7.2 自动化快照脚本
- 八、过滤与排除规则
- 8.1 简单排除
- 8.2 使用排除规则文件
- 8.3 复杂包含与排除
- 九、传输优化:限速与断点续传
- 9.1 带宽限制
- 9.2 断点续传
- 十、rsync 守护进程模式
- 十一、调试、日志与统计
- 十二、自动化备份脚本示例
- 十三、常见陷阱与最佳实践
- 13.1 斜杠陷阱
- 13.2 --delete 双刃剑
- 13.3 文件时间导致重复传输
- 13.4 超大目录处理
- 13.5 rsync 与 SCP 的选择
- 十四、结语
一、认识 rsync
在 Linux 世界里,rsync是一个几乎无法绕过的命令。无论是运维工程师的日常备份,还是开发者同步代码到服务器,它都能以最小的网络开销、最灵活的方式完成文件传输。rsync(remote sync)是一款开源的、快速的、多功能的文件同步工具,最核心的能力是增量传输——只传输源和目标之间的差异部分,从而大幅节省时间和带宽。同时它还能保持文件的权限、时间戳、软硬链接等元信息,常用于备份、镜像、部署等场景。
二、安装与基本语法
2.1 安装
大多数发行版已经预装了rsync,如果没有:
# Debian/Ubuntusudoaptinstallrsync# RHEL/CentOS/Fedorasudodnfinstallrsync2.2 语法与斜杠陷阱
基本语法非常简单:
rsync[选项]源路径 目标路径- 源路径:可以是本地目录/文件,也可以是远程地址,如
user@host:/path - 目标路径:同理
- 如果源路径末尾带有
/,表示同步该目录的内容;不带则同步目录本身。这是最常见的坑,务必将这一点刻在脑子里。
三、常用选项速查表
3.1 选项列表
下表列出最实用的选项,后续会逐一展开示例。
| 选项 | 长选项 | 作用 |
|---|---|---|
-a | --archive | 归档模式,等于-rlptgoD,保留几乎一切属性并递归 |
-v | --verbose | 显示详细输出 |
-z | --compress | 传输时压缩数据 |
-P | --partial --progress | 显示进度,支持断点续传 |
-n | --dry-run | 模拟运行,不实际同步(测试必备) |
--delete | 删除目标端比源端多出的文件,实现镜像同步 | |
--exclude | 排除匹配的文件/目录 | |
--include | 包含匹配的文件/目录 | |
-e | --rsh | 指定远程 shell,如-e "ssh -p 2222" |
--bwlimit | 限速,单位 KB/s,如--bwlimit=5000 | |
--link-dest | 硬链接增量备份的关键,指向一个参考目录 | |
--checksum | -c | 基于文件校验和决定是否跳过,更准确但更慢 |
3.2 归档模式与常用组合
-a是基石选项,它等价于-rlptgoD,即递归、保留符号链接、权限、时间戳、组、所有者,以及设备文件等。日常使用中,-avzP已经能覆盖 80% 的场景,但务必先用-avn(即 dry-run)确认行为,尤其是涉及--delete时。
四、本地同步实战
将project/目录完整同步到/backup/project/,使备份成为源目录的精确副本:
rsync-av--delete/home/user/project/ /backup/project/注意源路径末尾的/:它表示把project/里面的所有内容复制到/backup/project/中。如果你写的是/home/user/project(没有斜杠),那么会在/backup/project/下再创建一个project子目录。
五、远程同步:推与拉
rsync 原生支持通过 SSH 进行远程传输,数据全程加密。
5.1 推送(本地 → 远程)
rsync-avzP/local/data/ user@192.168.1.100:/remote/backup/5.2 拉取(远程 → 本地)
rsync-avzPuser@192.168.1.100:/remote/logs/ /local/logs/5.3 使用非标准 SSH 端口
rsync-avzP-e"ssh -p 2222"/local/data/ user@remote:/backup/六、镜像同步与 --delete
6.1 实现严格镜像
如果你希望目标目录是源目录的严格镜像,即删除目标中源没有的文件,必须加上--delete:
rsync-av--delete/www/live/ /www/deploy/非常危险,务必先用-n测试:
rsync-avn--delete/www/live/ /www/deploy/6.2 安全变体
--delete-before:传输前删除--delete-after:传输后删除(默认行为)--delete-excluded:同时删除被排除的文件--delete-delay:延迟删除,减少 IO 开销
根据业务场景选择,但任何带有删除行为的操作都必须先在 dry-run 下验证。
七、增量备份与快照 (–link-dest)
7.1 硬链接快照原理
--link-dest是 rsync 的“杀手级”功能。它可以创建一个类似 Time Machine 的硬链接快照:每次备份时,对未变化的文件只创建硬链接而不复制数据,从而在保留多份历史快照的同时只占用极少量的额外空间。
7.2 自动化快照脚本
假设你想每天在/backup/下保留日期命名的快照:
#!/bin/bashBACKUP_DIR="/backup"DATE=$(date+%Y-%m-%d)LATEST_LINK="$BACKUP_DIR/latest"# 如果存在前一天的备份,则用它作为参考;否则不参考if[-d"$LATEST_LINK"];thenLINK_DEST="--link-dest=$LATEST_LINK"firsync-av--delete\$LINK_DEST\/home/user/important/\"$BACKUP_DIR/$DATE/"# 更新 latest 符号链接为最新备份rm-f"$LATEST_LINK"ln-sf"$BACKUP_DIR/$DATE""$LATEST_LINK"即使备份了 30 天,未变化的文件也只占用一份磁盘空间,latest总是指向最近一次成功备份。
八、过滤与排除规则
8.1 简单排除
排除特定文件或目录:
rsync-av--exclude'*.log'--exclude'.git/'--exclude'temp/'/src/ /dst/8.2 使用排除规则文件
对于复杂的排除需求,可以编写规则文件:
rsync-av--exclude-from='/etc/rsync-exclude.txt'/src/ /dst/rsync-exclude.txt示例:
*.tmp .git/ node_modules/ .DS_Store8.3 复杂包含与排除
rsync 采用先匹配先生效的原则。如果需要在整体排除的前提下包含某个子目录,可以这样:
rsync-av--include='subdir/***'--exclude='*'/src/ /dst/这里***会匹配subdir/下所有层级的内容。
九、传输优化:限速与断点续传
9.1 带宽限制
避免 rsync 吃满带宽,尤其在业务运行时段:
rsync-avzP--bwlimit=1000/large/data/ user@remote:/backup/限速单位为 KB/s。
9.2 断点续传
-P选项等同于--partial --progress,会保留未传完的临时文件(通常以.partial结尾)。对于已经中断的传输,直接重跑同样的命令,rsync 会利用这些文件自动续传,非常适合大文件场景。
十、rsync 守护进程模式
除了 SSH 通道,rsync 还可以通过自己的守护进程通信,适合提供公共镜像或简化权限管理。服务端配置/etc/rsyncd.conf:
[backup] path = /data/backup read only = no auth users = backupuser secrets file = /etc/rsyncd.secrets客户端连接:
rsync-av/local/files/ rsync://backupuser@server/backup/必须将密码文件权限设为 600,生产环境下推荐配合防火墙和 chroot 限制路径。
十一、调试、日志与统计
- 模拟运行:
-n或--dry-run永远是你最好的朋友。 - 查看更详细的信息:可叠加多个
-v,如-vvv查看哪些文件被跳过以及原因。 - 记录日志:使用
--log-file=/var/log/rsync.log将输出保存到文件。 - 统计摘要:
--stats会在结尾输出文件数、传输量等汇总信息。
十二、自动化备份脚本示例
一个完整的、带错误通知的每日备份脚本:
#!/bin/bashset-eSOURCE="/home/user"DEST="backup@nas::daily"LOG="/var/log/rsync-daily.log"rsync-avzP--delete\--exclude'.cache/'\--exclude'Downloads/'\--log-file="$LOG"\"$SOURCE/""$DEST"if[$?-eq0];thenecho"Backup success"|mail-s"Backup OK"admin@example.comelseecho"Backup failed"|mail-s"Backup FAILED"admin@example.comfi将此脚本加入 cron:
0 2 * * * /usr/local/bin/backup.sh十三、常见陷阱与最佳实践
13.1 斜杠陷阱
源路径末尾的/会改变行为:src/同步内容,src同步目录本身。每次使用前先用-n确认效果。
13.2 --delete 双刃剑
永远不要在未经 dry-run 验证的情况下对重要目标使用--delete,建议与快照机制搭配。
13.3 文件时间导致重复传输
如果发现 rsync 每次都传输某些未变化的文件,可能是时间戳丢失或文件系统不支持。可尝试添加--size-only仅比较大小,或-c比较校验和。
13.4 超大目录处理
递归扫描海量文件时,rsync 会消耗大量内存。可考虑拆分任务,或使用--delete-delay减少 IO 压力。
13.5 rsync 与 SCP 的选择
scp适合一次性快速拷贝完整文件。rsync适合增量同步、定时任务和需要保留属性的场景。对海量小文件,rsync 的增量算法优势极为明显。
十四、结语
rsync 是“一次学习,终身受用”的命令行工具。从简单的本地备份,到跨公网的镜像分发,它都表现得可靠而高效。掌握本文中的选项和思维模型,你已经可以解决绝大部分文件同步难题。最后,再强调一次:先 dry-run,再执行。
如果你还有更深层的需求,比如 rsync 算法的工作原理、与 inotify 结合实现实时同步等,也欢迎深入探索。希望这篇重构后的指南能成为你手边最清晰的参考。
