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. 高效能哈希計算:對於一般檔案,receiver 會將檔案分割成多個區塊。每個區塊會進行兩次哈希計算:首先使用快速的 Adler-32 (4-byte) 哈希,接著使用較慢的 MD4 (16-byte) 哈希。
  3. 比對:receiver 會將這些哈希值傳送給 sender。sender 會掃描其自身的檔案版本,並即時計算快速哈希。當快速哈希匹配時,它會使用慢速 MD4 哈希進行驗證。
  4. 重組:如果找到匹配項,sender 會告訴 receiver 應該從其本地副本中重用哪個區塊。如果未找到匹配項,sender 會傳送原始位元組。此過程會持續進行,直到檔案被完全重組。

區塊大小優化

為了平衡開銷與精確度,openrsync 會根據檔案總大小的平方根來計算區塊大小,且最小限制為 700 bytes。這確保了無論是在同步小型配置檔案還是大型資料庫轉儲檔,該協定都能保持高效。

架構改進

openrsync 與原始 Samba rsync 之間的主要差異之一在於其內部架構。雖然原始 rsync 使用獨立的「generator」程序(從 receiver fork 出來)來處理檔案掃描,但 openrsync 將 generator 與 receiver 合併為單一程序。

透過利用 event loop,openrsync 可以更迅速地回應讀取與寫入請求,而無需處理程序間通訊的開銷。receiver 實際上同時扮演了 uploader(傳送區塊元數據)與 downloader(寫入從 sender 接收到的數據)的多重角色。

設計中的安全性

由於出自 OpenBSD 團隊,安全性並非事後才考慮的附加功能,而是基礎性的要求。openrsync 利用了原生的 OpenBSD 安全性原語(security primitives)來限制攻擊面:

  • 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