rsync 详解:增量文件传输的事实标准
在文件同步这个世界里,GUI 工具来来去去,底层的王座三十年没换过人。RsyncProject/rsync(rsync)由 Andrew Tridgell(Samba 作者)于 1996 年开创,名称里的 r 指 remote——远程同步。它与其他传输工具的根本差异只有一条:检查发送方与接收方已有的文件,只传输有变动的部分(默认按文件大小与修改时间判断)。就凭这一点,它成了 Linux 世界文件同步与增量备份的事实标准,scp / cp / mv 的常用替代。前两篇拆解的 FreeFileSync 与 RsyncUI,本质都是给它套壳。本文从增量原理、核心参数、远程模式到增量备份实操,完整拆解。
1、项目概述
rsync 定位为提供快速增量文件传输的开源工具,同时具备备份恢复等能力。C 语言编写,官网 rsync.samba.org 为源头(GitHub 组织 RsyncProject 为官方镜像与协作入口),约 5.2k Star、597 Fork。注意两个"双方"约定:传输双方都必须安装 rsync;它支持本地两目录、本地与远程之间同步,但不支持两台远程计算机之间的直接同步。1996 年问世至今迭代不辍,2020 年入驻 GitHub 后持续活跃,最新开发版仍在推进(openrsync 等替代实现也已出现并被 macOS 等平台采纳)。
基本盘:
- 平台:类 Unix 全平台标配,多数发行版预装;macOS 自带,Windows 需 WSL 或第三方移植
- 安装:Debian 系 apt-get install rsync、Red Hat 系 yum install rsync、Arch 系 pacman -S rsync
- 协议:默认走 SSH 传输(早期需 -e 显式指定,现已默认);亦支持 rsync:// 守护进程模式(873 端口)
- 许可:GPL 系开源协议(GitHub 标注 Other,以仓库 LICENSE 原文为准)
- 相关实现:openrsync(OpenBSD 系轻量实现)、各发行版自带版本
2、增量原理:只传有变动的部分
rsync 的一切优势都源于一个朴素判断:大部分文件大部分时间没变过。
原理拆解:
- 快速检查:默认比较文件大小与修改时间,二者任一变动才纳入传输,元数据比对不读文件内容
- 校验升级:-c / --checksum 改为按内容校验和判断,更准但更慢,按需启用
- 增量复制:传输大文件时也只传变化块(rolling checksum 算法),断点可续(--partial / --append)
- 单向语义:rsync 是单向工具——"源到目标"的一次搬运,双向同步要执行两次方向相反的命令
原理要点:
1. 与 scp 的本质区别:scp 每次全量复制,rsync 第二次起只传差异——网络备份场景的差距是数量级的
2. 与 FreeFileSync 的层级关系:FFS 的差异 / 变更双基准对应 rsync 的快速检查 / --link-dest 数据库思路,GUI 是壳、rsync 是核
3. 递归元数据:-a 存档模式同步权限、修改时间、所有者、软链接等全部元信息,是备份场景的标准姿势
4. 不动未变文件:目标侧已一致的文件完全不被触碰,时间戳保持原样
3、核心参数速览
参数不多但组合性强,掌握十几个即可覆盖绝大多数场景。
# 本地同步:-r 递归(必须),-a 存档(递归 + 元数据,最常用)
rsync -r source destination
rsync -a source destination # 常见写法
# 尾斜杠语义:加斜杠同步"目录内容",不加则同步"目录本身"
rsync -a source/ destination # source 里的内容 → destination
rsync -a source destination # 形成 destination/source 结构
# 预演与镜像
rsync -anv source/ destination # -n 干跑预演 + -v 输出细节,先看后做
rsync -av --delete source/ destination # --delete 使目标成为源的镜像
# 排除与包含
rsync -av --exclude='*.txt' source/ destination
rsync -av --exclude={'file1.txt','dir1/*'} source/ destination
rsync -av --exclude-from='exclude-file.txt' source/ destination
rsync -av --include="*.txt" --exclude='*' source/ destination参数要点:
1. 尾斜杠是最常见的坑:source/ 与 source 是两种结果,写错目录层级就多套或少套一层
2. -n(dry-run)+ -v 是安全网:任何不确定的命令先干跑预演,确认清单再实跑
3. --delete 是双刃剑:不加则目标只增不减,加了才成镜像;配合 --backup 可把被删文件改名保留(默认后缀 ~)
4. 高频补充:-z 传输压缩、-P(--progress + --partial)进度与断点续传、-u 跳过目标更新的文件、--bwlimit 限速
4、远程同步与增量备份
远程两条路,备份一个杀手锏。
远程同步两种协议:
- SSH 协议(默认):rsync -av source/ user@remote_host:/destination,双向皆可推拉
- rsync 守护进程:地址用双冒号 user@host::module 或 rsync://host/module,module 是管理员分配的资源名,873 端口
- SSH 带附加参数时须 -e 指定:rsync -av -e 'ssh -p 2234' source/ user@host:/dest
# --link-dest 增量备份脚本(阮一峰教程示例)
#!/bin/bash
set -o errexit
set -o nounset
set -o pipefail
readonly SOURCE_DIR="${HOME}"
readonly BACKUP_DIR="/mnt/data/backups"
readonly DATETIME="$(date '+%Y-%m-%d_%H:%M:%S')"
readonly BACKUP_PATH="${BACKUP_DIR}/${DATETIME}"
readonly LATEST_LINK="${BACKUP_DIR}/latest"
mkdir -p "${BACKUP_DIR}"
# 与 latest 基准目录比对,变动文件实拷贝,未变文件生成硬链接
rsync -av --delete \
"${SOURCE_DIR}/" \
--link-dest "${LATEST_LINK}" \
--exclude=".cache" \
"${BACKUP_PATH}"
# 重建 latest 软链接指向本次备份
rm -rf "${LATEST_LINK}"
ln -s "${BACKUP_PATH}" "${LATEST_LINK}"备份要点:
1. --link-dest 的机制:源目录与基准目录比对,变动文件拷入新目录,未变文件以硬链接指向基准——每个备份目录"看起来"都是全量,磁盘上只存一份实体
2. 首次全量、后续增量:链式结构下删除中间某天的备份不影响其他天(硬链接引用计数保护),类似时光机效果
3. 与普通 -a 增量的区别:-a --delete 每次同步同一目标目录(单版本);--link-dest 每次生成新目录(多版本快照链)
4. 排除先行:.cache 等噪声目录用 --exclude 剔除,备份体积与速度双受益
5、定位对比:同步工具三选一
把 rsync 与 scp、GUI 系工具放在一张桌上,层级与分工清晰起来。
三者对比:
- rsync:增量传输 + 全参数控制,服务器与脚本场景之王,学习成本在参数(5.2k Star,GPL 系)
- scp:全量复制的简单传输,零学习成本,重复传输大目录时浪费明显
- FreeFileSync / RsyncUI:rsync 语义的 GUI 封装,可视化预览与任务管理,底层能力同源(macOS 前者跨平台,后者原生)
选型建议:
1. 服务器运维、脚本化备份、cron 定时任务 → rsync 裸用
2. 一次性小文件传输、不想记参数 → scp
3. 桌面可视化备份、任务配置管理 → FreeFileSync(跨平台)或 RsyncUI(macOS)
4. 组合玩法:GUI 工具管日常桌面任务,服务器侧 cron + rsync --link-dest 做链式增量,两套语义一致
6、总结
rsync 是 Andrew Tridgell 1996 年开创的增量文件传输工具(约 5.2k Star、C 语言、GPL 系协议):默认按大小与修改时间快速检查、只传变动文件,大文件内部增量传输支持断点续传;-a 存档模式保留全部元数据,--delete 实现镜像,--exclude / --include 精细过滤,-n 干跑预演是安全习惯;远程默认走 SSH,亦可走 873 端口的 rsync 守护进程;--link-dest 配合脚本可实现链式多版本增量备份——每个快照目录看似全量、磁盘只存一份实体。三十年迭代不辍,是类 Unix 世界文件同步的事实标准。
适用与边界:它适合一切服务器侧与脚本化的同步备份场景——cron 定时、发布部署、异地备份都是经典用法;单工具单向语义,双向同步需两次调用或换 Syncthing 等常驻方案;不支持两台远程机器间的直接同步(需中转);Windows 无原生版本(WSL 或 cwRsync 移植);默认按元数据判断改动,对"内容变了但大小时间没变"的文件需 -c 校验和兜底。GUI 工具(FreeFileSync、RsyncUI)是其语义的桌面化封装,底层能力同源。

