1 ポイント 投稿者 GN⁺ 4 시간 전 | 1件のコメント | WhatsAppで共有
  • openrsync は、rsync を BSD(ISC) ライセンスで実装したシステムで、現在は OpenBSD base に統合されている
  • 最新の rsync と互換性があり、テストには rsync 3.1.3 が使われているが、プロトコル 27 をサポートしていれば動作可能
  • rsync のコマンドライン引数すべてではなく、一部の引数のみを受け付けるため、openrsync と rsync を併用する場合は双方でサポートされるフラグを使う必要がある
  • 公式サポート OS は OpenBSD であり、他の UNIX システムでもコンパイルして実行できるよう移植性のための glue が含まれている
  • 標準ドキュメントはマニュアルページであり、プロトコルの詳細は rsync(5)rsyncd(5)、ユーティリティのドキュメントは openrsync(1) にある
  • プロジェクトは OpenBSD 向け rpki-client(1) の一部として書かれ、NetNodIIS.SESUNET6connect が資金提供した
  • インストールは一般的な UNIX システムで ./configuremakemake install により行い、既存の rsync インストールと競合しない
  • rsync アルゴリズムは senderreceiver に分かれており、sender がソースファイル一覧とメタデータを作成し、双方がファイル名を辞書順にソートして位置ベースで項目を参照する
  • 通常のファイル同期では、ファイルサイズと更新時刻が同じならスキップし、異なる場合は固定サイズブロックごとに高速な Adler-32 系 4 バイトハッシュと低速な MD4 16 バイトハッシュを使って変更データを再構成する
  • ブロックサイズのデフォルト値はファイル全体サイズの平方根を丸めた値で、最小サイズは 700 B、さらに平方根の結果は理由不明ながら 8 の倍数に切り上げられる
  • セッションはユーザーが実行するクライアントとリモートで実行されるサーバープロセスに分かれ、サーバーは ssh(1) でオンデマンド起動されるか、常駐するネットワークデーモンとして動作する
  • rsync では generator が receiver の横で別プロセスとして動作するのに対し、openrsync は generator と receiver を 1 つのプロセスに統合し、イベントループで読み書き要求に応答する
  • セキュリティ面では OpenBSD の pledge(2) により実行モードごとのシステム操作を制限し、unveil(2) により宛先ディレクトリ以下のファイルシステムアクセスのみを許可する
  • サーバーモードでは MD4 ハッシュシードは time(3) ではなく arc4random(3) によって生成される
  • Linux(glibc・musl)、FreeBSD、NetBSD、Mac OS X、OmniOS へ移植可能で、GitHub CI が x86_64、aarch64、s390x アーキテクチャのテストを実施しているが、OpenBSD の pledge と unveil に相当するセキュリティ機能をどう合わせるかが移植の主要な制約となっている

1件のコメント

 
GN⁺ 4 시간 전
Hacker Newsのコメント
  • リモートサーバーが送信元または送信先である場合、クライアントが fork(2) で子プロセスを作成し、ssh(1) を通じてリモートホスト上でサーバー openrsync を起動したあと、クライアントとサーバーが socketpair(2) パイプで通信する、という説明は、どう動くのか曖昧に感じる
    おそらく fork された子がソケットペアで親に接続を渡すか、標準入出力をソケットペアの「パイプ」に接続してから sshexec する、という意味なのだと思う
    でもこれは、空港までは車で行くという話なのに、オーストラリアまで車で行くと言っているようなものだ

  • openrsync が発表されて以来あちこちで使ってきたが、時間が経つにつれて確実によくなっている。全面的に使えるようになる日を楽しみにしている
    ただ、自分の使い方では Samba の rsync と合わない点が一つある: openrsync --rsync-path=openrsync -av -e ssh /etc/services example.com:/tmp/services
    期待していたのはリモートに /tmp/services ファイルを作ることだが、実際には /tmp/services/services が作られる
    -av -e ssh /path/to/src/ example.com:/path/to/dst/ のような一般的なディレクトリミラーリングは Samba の rsync と同じように動く

    • この動作は「普通の」 rsync とも一致しているように見える。中身だけを同期したいなら、services の後ろに 末尾スラッシュ が必要だと思う
      訂正: 実は自分の「普通の」 rsync も macOS の openrsync だった
    • 送信先にすでに /tmp/services ディレクトリがあったかどうかが重要だ
      rsync で最も紛らわしい点の一つが、ディレクトリと末尾スラッシュ の扱いだ
    • 送信元に末尾スラッシュを付けるとディレクトリの中身をコピーし、省略するとディレクトリ自体をコピーする。自分の知る限り、これは POSIX ツール全般でかなり標準的な動作だ
    • 数え切れないほど長い年月 rsync に苦しめられてきた身としてその衝動はわかるが、2つ目の services を作るほうがずっと筋が通っていて、より安全なデフォルト だと思う
      rsync のデフォルトを少しでも狂っていない方向に変える機会があるなら、未来の世代をこの混乱から救うべきだ
  • 最近の rsync コードベースでは バイブコーディングのコミット が急に増え、それによるリグレッションまで起きているのを見ると、これはとても良いニュースだ

    • rsync はずっと堅牢だったのでこの手の話は聞き流そうとしていたが、実際にアップグレード後、自分のバックアップスクリプトが壊れた
      GitHub の最新の issue には、直近2つのパッチで入ったバグが大量に整理されており、たぶん大した意味もなかったであろう怪物級の 約9000行コミット も含まれている
      LLM はコードを書くことをより速く簡単にするが、いつだって重要なのは考えることだった。なぜこんなに古くて信頼されてきたソフトウェアを壊すのか理解できない
  • このパッケージの開発背景が必要な人のために言うと、このプロジェクトは現在 RPKI バリデータ の一部として開発されている
    https://medium.com/@jobsnijders/a-proposal-for-a-new-rpki-va...

  • Michael Stapelberg / Gokrazy チームによる Go 実装もある: https://github.com/gokrazy/rsync

  • 実際の移植作業の核心は、OpenBSD の pledge(2)unveil(2) が提供する セキュリティ機能 をどう再現するかにある。これらはシステム機能の決定的な要素だ
    これらの機能がなければ、システムは公開ネットワークから任意のデータを受け入れることになる
    https://justine.lol/pledge/
    Alpine Linux edge では pledge が見当たらない。Linux で Pledge を試してきた人はいるのだろうか? pledge なしで openrsync を使う危険性について自分が誤解しているのか、それともこの記事は OpenBSD ユーザー向けにしか書かれていないのか?

    • Linux には pledgeunveil、Capsicum のような機能はない。cgroups、名前空間、そして同じようなことをするために組み合わせる雑多な仕組みがある
      Linux は、特定のシステムコールとカーネルパスで概念全体を提供する隔離機能というより、複数の仕組みが繰り返し追加されて相互に組み合わされ、サンドボックス化 や機能制限を構成する方式で作られてきた
      最近の Linux 側には Landlock のような新機能もあるようだが、おそらく完全に新しく作るのではなく、既存の Linux の基本要素の上に積み上げる形だろう
      「ぐちゃぐちゃ」というのは、おそらくあちこちに散らばっているという意味だ。閉じる方法が多すぎて、どれが最善か選ぶには各サブシステムを深く掘る必要がある。単純な1〜2個のシステムコールだけを使うのとは対照的だ
    • 引用された箇所の上にはこう書いてある: 「公式サポート対象 OS は OpenBSD だけであり、それがかなりのセキュリティ機能を備えているからだ」
      そして下にはこうある: 「FreeBSD の Capsicum なら可能かもしれないが、Linux のセキュリティ設備はぐちゃぐちゃで、適切に安全化するには専門家の手が必要だ」
      つまり ポータブル というのはコンパイルして実行できるという意味であって、同じセキュリティ機能を持つという意味ではない
      Linux upstream に pledge/unveil が入るとよいのだが、期待はしていない
    • その引用文は単純化しすぎていて、ほとんど完全に間違っているように見える
      「これらの機能がなければ、システムが公開ネットワークから任意のデータを受け入れる」という言い方とは違って、pledgeunveil は任意データを受け入れるかどうかを変えるものではない。これらは 侵害されたプロセスができること を制限する
      Security セクションでは正しく説明されているので、あの表現がどこから来たのかわからない
  • このバージョンは macOS 15.0 から使われているものだ

    • 15.0 だったっけ? 15.x 系列のマイナーリリースのどれかで入った記憶があり、いくつかのスクリプトが理由もわからず壊れたのを覚えている
      訂正: 面白いことに 15.0 には含めていたものの、下位互換性を壊す変更は 15.4 まで温存していたようだ。 https://apple.stackexchange.com/a/479297
  • 最近の rsync プロトコルをサポートしていないため、64ビットタイムスタンプ のサポートがなく、その結果、新しいファイルシステムではメタデータを実際には同期できない

  • なぜそんな名前なのか気になる。Openrsync というと、クローズドソースのプログラムに対するオープンソース代替のように聞こえる
    でも元の Rsync も GPL ではなかったか? 単にもっと扱いやすいライセンスだから「よりオープン」という意味なのか?

    • OpenBSD 側の人たちは、派生著作物にも GPL を適用しなければならないという要件のため、GPL のほうがオープンではない と見るだろう
    • OpenBSD と密接なプロジェクトには open で始まるものが多い。opensshopenbgpdopenntpdopensmtpd のような具合だ