概要
- openrsync はOpenBSDベースシステムに統合された BSDライセンスのrsync実装
- rsyncプロトコル(バージョン27)互換 で、コマンドライン引数は一部のみ対応
- OpenBSD公式サポート だが、他のUNIX系OSにも移植可能
- セキュリティ強化 として、OpenBSDのpledge(2)とunveil(2)を活用
- rsyncとの主な違い やアルゴリズム、アーキテクチャも解説
openrsync概要
- openrsync は OpenBSD ベースシステムに組み込まれた rsync互換ユーティリティ
- BSD (ISC) ライセンス 採用、オープンソースプロジェクト
- rsyncプロトコル27 に対応、rsync 3.1.3で動作確認
- コマンドライン引数 はrsyncの一部のみサポート
- OpenBSD が公式サポート対象だが、他UNIX系OSにも移植可能
- 公式ドキュメント はマニュアルページ(rsync(5), rsyncd(5), openrsync(1))
- 開発背景 :rpki-client(1)プロジェクトの一環として開発
- NetNod, IIS.SE, SUNET, 6connect による資金提供
インストール・アンインストール
- UNIX系OS でのインストール手順
./configuremakemake install
- rsyncとの共存 可能、競合なし
- アンインストール は
make uninstallで対応 - サーバーとしての利用 :
openrsync --rsync-path=openrsync src/* dstなどで起動 - openrsyncとrsyncの相互運用 は、両方がサポートするフラグを利用
アルゴリズム概要
- rsyncアルゴリズム は 送信側(sender) と 受信側(receiver) で構成
- 送信側:ソースファイル管理
- 受信側:宛先ファイル管理
- ファイルリスト (名前・メタデータ)を共有し、両者でソート
- ディレクトリ優先順で処理
- ファイルリストはflist.cで実装
- ブロック交換 (block exchange)がアルゴリズムの中核
- receiverがファイルごとに情報をsenderへ送信
- senderは更新指示に従い、必要なデータブロックを送信
- 完了後、ファイルが最新化
ブロック交換詳細
- シンボリックリンク :メタデータのみで更新、データ転送不要
- ディレクトリ :未存在時のみ作成、データ転送不要
- 通常ファイル :
- サイズ・mtimeが一致すれば転送不要
- 一致しない場合、固定サイズブロックごとにハッシュ(Adler-32とMD4)計算
- receiverがブロックハッシュをsenderへ送信
- senderは一致するブロックを探索し、差分データのみ送信
- receiverはデータストリームとブロックでファイルを再構築
- 新規ファイルは全データ送信
- 完了後、MD4ハッシュで検証
ブロックサイズ
- ブロックサイズ はファイルサイズの平方根を切り上げ
- 最小ブロックサイズ は700バイト
- 8の倍数 に切り上げる仕様
アーキテクチャ
- openrsyncセッション は クライアント と サーバー プロセスに分割
- クライアント:ユーザーが実行
- サーバー:リモートホストでssh(1)経由またはデーモンとして実行
- --server フラグでサーバープロセスを識別
- 送信/受信モード はコマンドライン引数で自動判別
- ローカル・リモート判定 :パス指定形式で判断
- 例:
host:path/to/source - ソース・宛先が同時にリモートは不可(設計上の制限)
- 例:
- リモートサーバーの場合、クライアントがfork(2)してssh経由でopenrsyncを起動
- ネットワークデーモン の場合はsocket(2)で接続
- クライアント・サーバー実装 :client.c, server.c, socket.c, child.c
- プロトコル通信 はrsync(5)、デーモン時はrsyncd(5)も利用
- 受信側 はアップローダー・ダウンローダーの2役を持ち、イベントループで非同期処理
- uploader.c:ファイルを開き、ブロックをハッシュ化して送信
- downloader.c:データ受信、既存ファイルに書き込み
rsyncとの違い
- rsync は generatorプロセス をreceiverとは別にfork(2)して実行
- openrsync は generatorとreceiverを同一プロセス で実装し、イベントループで高速応答
- プロセス構成の簡素化 によるパフォーマンス・保守性向上
セキュリティ
- OpenBSDのpledge(2) で実行権限を最小化
- モードごとに必要な権限のみ付与(例:受信側は書き込み権限のみ)
- unveil(2) でファイルアクセス範囲を制限
- 宛先ディレクトリ以下のみアクセス可能
- chroot(2)不要、root権限不要
- MD4ハッシュ のシード値をランダム化し、セキュリティ強化
貢献方法
- パッチ送付先 :tech@openbsd.org
- 開発・移植用リポジトリ :OpenBSDバージョン+移植用の補助コードを含む
この内容はopenrsyncの全体像、インストール方法、アルゴリズム、設計、rsyncとの違い、セキュリティ、貢献方法を簡潔にまとめたものです。詳細は各マニュアルページやソースコードを参照してください。