Openrsync: 一种现代的、采用 BSD 许可的 Rsync 协议实现

几十年来,rsync 一直是跨网络高效文件同步的金标准。然而,原始实现背负着多年遗留代码的沉重负担以及 GPL 许可的限制。于是有了 openrsync,这是由 OpenBSD 团队开发的 rsync 协议的洁净室实现(clean-room implementation)。

最初作为 rpki-client(1) 项目的一部分创建——这是一个由 NetNod 和 SUNET 等组织资助的 OpenBSD RPKI 验证器——openrsync 此后已被合并到 OpenBSD 基础系统中。它提供了一个采用 BSD 许可 (ISC) 的替代方案,与现代 rsync (协议版本 27) 兼容,通过强调安全性和极简主义,为文件同步提供了一种精简的方法。

核心算法:openrsync 如何工作

openrsync 的核心实现了经典的 rsync 算法,通过仅发送源文件和目标文件之间的差异来最大限度地减少数据传输。该过程分为 sender(管理源文件)和 receiver(管理目标)两部分。

数据块交换过程

openrsync 的效率依赖于一种复杂的“数据块交换”机制:

  1. 文件列表生成:sender 发送一个文件名和元数据的列表。双方都按字典顺序对该列表进行排序,以确保目录在包含它们的文件的处理之前被处理。
  2. n 种哈希以提高效率:对于常规文件,receiver 会将文件划分为多个数据块。每个数据块都会进行两次哈希计算:首先使用快速的 Adler-32 (4 字节) 哈希,然后使用较慢的 MD4 (16 字节) 哈希。
  3. 匹配:receiver 将这些哈希发送给 sender。sender 会扫描其自身版本的文件,并实时计算快速哈希。当快速哈希匹配时,它会使用慢速 MD4 哈希进行验证。
  4. 重构:如果找到匹配项,sender 会告诉 receiver 从其本地副本中重用哪个数据块。如果没有找到匹配项,sender 会传输原始字节。这个过程会一直持续,直到文件被完全重构。

数据块大小优化

为了平衡开销与精度,openrsync 根据文件总大小的平方根来计算数据块大小,最小值为 700 字节。这确保了无论是在同步小型配置文件还是海量数据库转储,该协议都能保持高效。

架构改进

openrsync 与原始 Samba rsync 之间的一个主要区别在于其内部架构。虽然原始 rsync 使用一个单独的“generator”进程(从 receiver fork 出)来处理文件扫描,但 openrsync 将 generator 和 receiver 合并为一个单一进程。

通过利用 event loop,openrsync 可以更迅速地响应读写请求,而无需进程间通信的开销。receiver 实际上在执行多任务处理,既充当 uploader(发送数据块元数据)又充当 downloader(写入从 sender 接收到的数据)。

安全设计

由于出自 OpenBSD 团队,安全并非事后补救,而是基础性要求。openrsync 利用原生的 OpenBSD 安全原语来限制攻击面:

  • pledge(2):这限制了进程可以进行的系统调用。例如,在非“dry-run”模式下,receiver 仅被授予磁盘写入权限。
  • unveil(2):这限制了进程对文件系统的视图。receiver 仅在目标目录及其子目录下被“unveiled”,从而防止进程意外或恶意地访问目标路径之外的文件。
  • 随机化种子:与某些使用 time(3) 的实现不同,openrsync 在服务器模式下使用 arc4random(3) 为其 MD4 哈希提供种子,以增加鲁棒性。

可移植性与生态系统

虽然官方支持 OpenBSD,但 openrsync 的设计目标是具有可移植性。它目前可以在 Linux (glibc 和 musl)、FreeBSD、NetBSD、macOS 和 OmniOS 上编译并运行。

然而,开发者警告称,pledgeunveil 的的安全性保证是至关重要的。将这些移植到其他系统(例如使用 FreeBSD 的 Capsicum)是维持相同安全态势的必要条件。正如作者所言,原始 rsync 会将任意网络数据泵入文件系统;如果没有这些保护,任何实现都可能存在潜在风险。

社区观点与现状

早期采用者和社区成员就其采用情况提出了几个关键点:

  • 集成:有趣的是,一些报告表明 openrsync 已经在 macOS 15.0 中被使用了。
  • 功能对等性:虽然它支持 rsync 的一部分命令行参数,但它正在不断进步。例如,在 OpenBSD 7.9 中最近添加了 --exclude 支持。
  • 许可协议的吸引力:转向 BSD 许可被视为对于那些认为 GPL 限制性太强的人来说的一次重大胜利,这可能有助于其更容易地集成到其他专有或许可宽松的 OS 分发版中。

"rsync 的这种碎片化问题在于,Apple 和 Android 会更倾向于它,但由于惯性,Linux 和更广泛的 GPL 世界将坚持使用原始实现。" — HN User @chasil

通过提供一个简洁、安全且许可宽松的实现,openrsync 不仅仅是提供了一个同步文件的工具——它还为当前安全环境下如何构建核心系统工具提供了一个现代化的蓝图。

Sources