rsync
rsync 是一款开源的文件同步与复制工具,可在本地目录之间或本地与远程主机之间传输文件,并尽量保留权限、时间戳、属主等文件属性。它借助增量传输协议只发送源端与目标端不同的部分,因此在备份、镜像和部署等重复传输场景中比整体复制更节省带宽。该工具最初由安德鲁·特里奇尔(Andrew Tridgell)与保罗·麦克拉斯(Paul Mackerras)编写,1996 年首次发布,现按 GNU 通用公共许可证分发。
定义
rsync 是一个在类 Unix 系统上常见的命令行文件复制与同步程序,可以把文件、目录树从一个位置复制到另一个位置,也可以在本机与远程主机之间双向传输。它的定位是rcp等传统复制命令的替代品,同时提供更多控制选项,例如递归复制、压缩传输、过滤排除规则以及属性保留[1]。
需要区分两个容易混淆的概念:rsync 程序本身,以及被称为 rsync 算法的增量传输方法。后者解决的是「接收方已有类似文件时如何只传差异」的问题,程序以该算法为核心,但另外还实现了文件列表协商、过滤规则、守护进程服务等功能[2]。
该程序以 GNU 通用公共许可证发布,源码开放,可自行编译或在各发行版的软件仓库中获取[3]。
原理
增量传输是 rsync 区别于整体复制工具的关键。接收端把自己的文件切成固定大小的不重叠数据块,对每块计算两个校验值:一个是 32 位的滚动弱校验和,另一个是较慢但更强的哈希值;随后把这些校验值清单发给发送端。发送端在自己的文件上按字节逐位滑动窗口计算弱校验和,与清单比对,命中后再用强校验确认块内容一致,最后只把无法匹配的部分连同重建指令发回接收端[4]。
滚动校验和的特殊性质使这一过程代价很低:若已知第 $n$ 到第 $n+S-1$ 字节的校验和为 $R$,那么第 $n+1$ 到第 $n+S$ 字节的校验和可以由 $R$、移出的第 $n$ 字节和移入的第 $n+S$ 字节直接算出,无需重新扫描中间数据。因此文件中间插入若干字节时,后续块仍能被重新对齐识别,只有真正变化的内容需要传输。
在文件层面,rsync 默认采用所谓「快速检查」:只要源端与目标端文件的大小与最后修改时间都一致,就跳过该文件,不再比较内容[5]。这一策略避免了读取全部数据,但也意味着大小和时间戳相同而内容不同的文件不会被发现[6]。
传输通道方面,rsync 默认借助 SSH 建立连接并执行远端命令,也可指定其他远程 shell,或连接对端运行的 rsync 守护进程,守护进程默认使用 873 端口[2]。整个流程可概括为:
sequenceDiagram
participant R as 接收端
participant S as 发送端
R->>R: 分块并计算弱/强校验和
R->>S: 发送校验和清单
S->>S: 滚动校验和逐位比对
S->>R: 发送不匹配块与重建指令
R->>R: 拼装出与源端一致的文件
发展历程
1996 年 6 月 19 日,安德鲁·特里奇尔与保罗·麦克拉斯在公告中宣布发布 rsync,将其描述为带特殊功能的 rcp 替代品,并随包附上描述增量算法的技术报告[1]。同年项目开始以 GPL 授权方式分发[7]。
早期版本使用 128 位 MD4 哈希作为强校验。随 rsync 3.0.0 一同发布的协议第 30 版改用 MD5 哈希,校验强度有所变化[8]。该版本还引入增量递归等改动,改变了目录遍历与文件列表的生成方式[9]。
许可证方面,项目在 2007 年由 GPL 第 2 版转向 GPL 第 3 版,3.0.0 正式版于 2008 年 3 月发布[7]。程序早期由特里奇尔维护,后由韦恩·戴维森(Wayne Davison)接手,并得到各地开发者的持续改进。
特里奇尔在其 1999 年的博士论文中讨论了该工具的设计、实现与性能,rsync 算法本身也成为后续若干增量同步工具的参考[10]。
应用
备份与目录镜像是 rsync 最典型的用途。借助 --delete 选项可以让目标端与源端完全一致,即删除目标端多余的文件;配合 --link-dest 把未变化的文件以硬链接方式指向上一份备份,可以形成占用空间较小的多份快照式备份。
网站与构建产物发布也常用它:把本地构建目录推送到服务器目录,只传输变化过的静态文件,从而减少每次发布的网络开销。归档模式 -a 常用作起手参数,可递归传输并保留权限、时间戳、属主、软链接等属性[11]。
运维迁移场景中,rsync 适用于在云主机、不同操作系统之间搬运大量文件,既可通过远程 shell 加密传输,也可配置成守护进程以服务端与客户端模式提供服务。其断点续传选项 --partial 会保留中断的未完成文件,使下一次传输可以只补齐剩余部分[2]。
rsync 算法还被独立实现为库与配套工具,例如 librsync 以及基于其签名文件与差异文件生成流程的 rdiff,用于在本地生成可移植的增量补丁[12]。
局限
快速检查的准确性有边界。默认只比较大小与修改时间,若文件内容变化而大小和时间戳恰好未变,同步会被跳过;改用 --checksum 逐文件计算校验和可提高准确性,但需读取完整文件,目录规模大时明显变慢。相反,若目标端时间戳被其他工具重置,rsync 可能重复传输本未变化的文件,此时可通过 --size-only 等选项调整比较策略。
属性保留并非默认全开。归档模式 -a 覆盖常用属性,但硬链接、访问控制列表和扩展属性需要额外选项才保留;保留硬链接时 rsync 需在内存中维护 inode 与路径的对应表,文件系统规模大时内存开销显著,且只能还原单次运行范围内的链接关系。缺少 -t 或 -a 时,下一次传输会退化为对全部文件重新处理[13]。
--delete 是能力也是风险点。该选项会删除目标端存在而源端没有的文件,若源路径或目标路径书写错误,多余文件可能被批量清除,因此通常先以 --dry-run 预览结果。
网络与安全层面的限制同样存在。守护进程模式会做身份认证但并不加密传输的数据,涉及敏感内容时更适宜通过 SSH 通道运行[14]。此外,rsync 本身只能在一端发起、由本地推动或拉取,不支持在两台远端主机之间直接同步,需借助其中一台主机中转[15]。
参见
参考资料
- First release of rsync - From: Andrew Tridgell <Andrew [引用日期2026-10-29]
- rsync [引用日期2026-10-29]
- Format: https://www [引用日期2026-10-29]
- rsync 的核心算法:报错 [引用日期2026-10-29]
- rsync.1 [引用日期2026-10-29]
- Linux 同步工具rsync学习 [引用日期2026-10-29]
- rsync [引用日期2026-10-29]
- rsync [引用日期2026-10-29]
- marc.info 上的网页 [引用日期2026-10-29]
- Rsync [引用日期2026-10-29]
- 如何在 linux 上使用 rsync 同步本地和远程目录 [引用日期2026-10-29]
- PHP: Contents of /pecl/rsync/trunk/package.xml [引用日期2026-10-29]
- rsync.1.en [引用日期2026-10-29]
- Building Internet Firewalls, 2nd Edition [引用日期2026-10-29]
- rsync-common 未授权访问漏洞(PDF) [引用日期2026-10-29]