
2026/03/30 23:30
Foxing は、Linux ファイルシステム用の eBPF で駆動されるレプリケーション エンジンを目指しています。
RSS: https://news.ycombinator.com/rss
要約▶
日本語訳:
Foxing は Linux ファイルシステム(XFS、Btrfs、F2FS、Ext4)向けの本番レベルで eBPF を駆使した複製エンジンです。カーネルイベントを捕捉し、ターゲットディレクトリに非同期で再生することでほぼリアルタイムなミラーリングを実現します。本プロジェクトは主に 2 つのコンポーネントから構成されています。
- fxcp – 自動適応型 CoW / reflink、io_uring、および BLAKE3 Merkle デルタ検出を用いた高速で増分コピーを行うスタンドアロンのスマートコピーツール。
- foxingd – サブミリ秒レイテンシで継続的にイベント駆動型ミラーリングを実施する eBPF デーモン。
ベンチマークでは、fxcp が大きなファイルワークロードで rsync/cp より最大 54 倍速く、NFS スループットも向上(例:100 MB 転送時に約 3.6 倍)することが示されています。foxingd は単一ファイルのレプリケーション遅延を 15–21 ms(XFS→NFS、XFS→tmpfs)で提供し、バッチ操作は 30 ms 未満です。
Foxing は FXAR v2 アーカイブフォーマットを導入しています:ギアハッシュチャンク化(2 KB–2 MB)、BLAKE3 コンテンツアドレス可能ストレージ、バイナリインデックス、シーク可能アーカイブ、ストリーミングパイプサポート、並列エクスポート/インポート、および NFS セッションプーリング。コマンドライン機能には構造化 JSON 出力(
fxcp -a --json)、詳細な終了コード、スナップショット管理(snap list/prune/stats/export/import/restore)、グロブパターンでの選択的リストア、圧縮マトリクス(zstd、lZ4、gzip、xz)、および上書き前に reflink スナップショットを作成する --snapshot フラグが含まれます。
構造はマルチステージパイプラインです:カーネル BPF プローブ → ラングバッファ → 再順序/フィルタ → ディスパッチャー → ワーカー → SmartCopier。適応コピー戦略(NFS コンパウンド RPC、FICLONE、sendfile、io_uring)はファイルシステムとファイルサイズに基づいて自動的に選択されます。
安全機構としては、ループ防止(デバイス/PID フィルタリング)、部分書き込み保護(
.tmp.uuid ファイルを用いたアトミックモード、MARS バージョニングによるデルタモード)、fsync バリアと完全メタデータレプリケーションによる一貫性保証、マウント監視(デバイス ID トラッキング、fsync ライビネスプローブ)、ハイドレーションクリーンアップ、および ENOSPC 時のグローバル緊急削除が挙げられます。
Prometheus メトリックはポート 9100 (
foxing_events_dropped, foxing_worker_copy_in_flight 等) に公開され、リアルタイムステータスを表示する TUI が付属します。Foxing は Linux 6.12+(x86_64 または aarch64)で動作し、Fedora/RHEL COPR および Debian/Ubuntu パッケージとして入手可能です。ソースビルドには Cargo nightly と clang/llvm/bpftool/libbpf-dev が必要です。
容量計画に関しては、XFS/Btrfs/ext4 ではファイル単位のメタデータコストがほぼ無視できる一方で、xattrs をサポートしない環境では約 4 KB/インオブジェクトのサイドカー ファイルが使用されます。ターゲットはバージョニング履歴とファイルシステムオーバーヘッド用に約 5 % の余剰容量を確保すべきです。
Foxing は GPL‑2.0-or-later の下でリリースされています。これにより、企業は本番ファイルシステムの高速・低負荷バックアップを実現し、NFS ターゲットへのネットワーク負荷を軽減し、統合ツールによるスナップショット管理を簡素化できます。将来のリリースでは適応コピー戦略の改良、Prometheus メトリックの拡張、およびループ防止や部分書き込み保護といった安全機能のさらなる強化が予定されています。
本文
Foxing
高精度ファイルシステムレプリケーション
概要
Foxing(旧 xfs‑mirror)は、Linux ファイルシステム(XFS・Btrfs・F2FS・Ext4)向けの本番環境対応 eBPF 主導レプリケーションエンジンです。カーネル側ファイルシステムイベントをキャプチャし、非同期でターゲットディレクトリへ再生することで、ほぼリアルタイムにミラーリングを実現します。また、一貫性保証も強固です。
コンポーネント
| コンポーネント | 目的 |
|---|---|
| fxcp | 単体で動作する「スマートコピー」ツール。/ の代替として使えます。CoW / reflink、、BLAKE3 Merkle デルタ検出を自動調整し、BPF も root も不要です。 |
| foxingd | eBPF デーモン。サブミリ秒レイテンシで継続的にイベントをミラーリングします。 |
パフォーマンスハイライト
| ワークロード | rsync | cp | fxcp | fxcp vs rsync |
|---|---|---|---|---|
| 10 K 小ファイル(4 KB) | 607 ms | 424 ms | 607 ms | 同等 |
| 10 大ファイル(100 MB) | 1 236 ms | 4 ms | 23 ms | 54倍速 |
| 混合(5 K ファイル、2.1 GB) | 3 998 ms | 239 ms | 383 ms | 10倍速 |
| スパースファイル(10 × 50 MB) | 764 ms | 3 ms | 21 ms | 36倍速 |
NFS 4.2 ベンチマーク(XFS NVMe → NFS HDD)
| ワークロード | rsync | fxcp | fxcp vs rsync |
|---|---|---|---|
| 5 000 tiny ファイル | 12.8 s | 11.5 s | 1.11倍速 |
| NFS→NFS 100 MB(同一サーバ) | 297 ms | 82 ms | 3.62倍速 |
| 100 MB スループット | 322 ms | 386 ms | 0.83倍 (259 MB/s) |
foxingd デーモンレイテンシ(BPF イベント駆動)
| ワークロード | XFS→XFS | XFS→NFS | XFS→tmpfs |
|---|---|---|---|
| 単一ファイル作成 (4 KB) | 17 ms | 19 ms | 16 ms |
| 単一ファイル作成 (64 KB) | 16 ms | 18 ms | 17 ms |
| 名前変更伝搬 | 15 ms | 21 ms | 16 ms |
| バッチ10×4 KB | 187 ms | 209 ms | 190 ms |
fxcp は最適戦略(NFS コンパウンド RPC、reflink、sendfile、io_uring)を自動選択し、foxingd は BPF イベントキャプチャで単一ファイルレプリケーションレイテンシを 15–21 ms に抑えます。
v0.8.1 ハイライト
- FXAR v2 – gear‑hash 可変チャンク(2 KB–2 MB)、BLAKE3 コンテンツアドレス化ストレージ、バイナリインデックス。
- ランダムアクセス復元が可能なシーク可能アーカイブ。
- ストリーミングパイプサポート (
)。fxcp snap export | ssh … - Rayon での並列エクスポート/インポート、NFS セッションプールで最大4つのコンパウンド RPC を同時実行。
- アーカイブ形式を自動検出し、tar にフォールバック。
- 事前ディスク空きチェック、ターゲット CPU 自動チューニング(AVX2/AVX‑512)。
v0.8.0 ハイライト
- 構造化 JSON 出力 (
)。fxcp -a --json - ライブ進捗表示 (
)。--progress - 詳細な終了コード:
成功、0
部分失敗、1
完全失敗。2 - Systemd 連携(
)。sd_notify
v0.7.x ハイライト
- スナップショット管理 (
)。snap list/prune/stats/export/import/restore - CoW ストレージ統計と glob パターンでの選択的復元。
- 圧縮マトリクス(zstd、lz4、gzip、xz)。
、--snapshot
フラグ。--throttle- マルチソースコピー、インクルード/エクスクルードフィルタリング、ハイドレーションクリーニング、WAL ストーム検出。
クイックスタート
fxcp(root も BPF も不要)
# ビルド cargo build --release -p fxcp # 基本コピー fxcp -a /source /destination # 複数ソース fxcp -a /src1 /src2 /src3 /destination/ # rsync と同様に削除 fxcp -a --delete /source /destination # インクルード/エクスクルード fxcp -a --exclude '*.tmp' --include 'important.tmp' /source /destination # ドライラン fxcp -a -n /source /destination # foxingd 用署名生成 fxcp -a --generate-sigs /source /destination
foxingd(eBPF デーモン)
# 依存関係インストール(Fedora/RHEL) sudo dnf install clang llvm libbpf-devel bpftool # ビルド cargo build --release -p foxingd # TUI とともに起動 sudo ./target/release/foxingd daemon --config config.toml --tui # ワンショット同期 ./target/release/foxingd sync -a /source /destination # ステータス&メトリクス確認 foxingd status foxingd metrics
インストール
| OS | パッケージ |
|---|---|
| Fedora/RHEL (COPR) | |
| Debian/Ubuntu | パッケージはリリースにて配布 |
デーモンを有効化して起動:
sudo systemctl enable --now foxingd
設定(TOML)
最小構成例 (
/etc/foxing.toml):
worker_count = 4 queue_max = 200_000 [[sources]] path = "/mnt/data" [[sources.targets]] path = "/mnt/backup" profile = "SSD" # NVMe, SSD, HDD, Network, NFS, SdCard, Auto enable_versioning = true max_versions = 5 max_versions_size_mb= 10_240
fxcp は設定不要で、すべてを自動検出します。
コマンド
foxingd
| コマンド | 説明 |
|---|---|
| デーモン起動(フォアグラウンドまたは systemd)。 |
| rsync と同等のワンショット同期。 |
| デーモン状態確認。 |
| Prometheus メトリクス () を表示。 |
| 設定検証。 |
| 設定チートシートを出力。 |
スナップショット(MARS)
foxingd snapshot list /mnt/backup/database.db foxingd snapshot revert /mnt/backup/database.db 105432 foxingd snapshot copy /mnt/backup/database.db 105432 /tmp/db_restore.db foxingd snapshot cleanup /mnt/backup/database.db --dry-run foxingd snapshot force /mnt/backup/database.db --tag "pre-migration"
fxcp
fxcp -a /source /destination fxcp -a /src1 /src2 /src3 /destination/ fxcp -a --delete /source /destination fxcp -a --generate-sigs /source /destination fxcp -a -e '*.tmp' -e '.git' /source /destination fxcp -a --exclude-from excludes.txt --include-from includes.txt /source /destination fxcp -a -n /source /destination fxcp --cleanup /target fxcp snap list /backup fxcp snap prune --older-than 30d --keep-last 10 /backup fxcp snap export /backup -o backup.fxar fxcp snap inspect backup.fxar --list fxcp snap restore backup.fxar --file 'data/*.db' --latest -o /tmp/
容量計画
- メタデータコスト – XFS/Btrfs/Ext4 のネイティブ xattr (
) はほぼ無視できるオーバーヘッド。xattr 未対応の場合はuser.foxing.*
サイドカーを 4 KB 単位で使用。.foxing_meta - 余剰容量 – スナップショットとファイルシステムオーバヘッドを考慮し、ターゲットにはソースの 5 % 以上の空き容量を確保。
- 安全停止 – ターゲットが空き領域不足に陥った場合、foxingd はレプリケーションを安全に一時停止し、破損を防止。
安全機構
| 機能 | 説明 |
|---|---|
| ループ防止 | eBPF 内でデバイス・PID フィルタリングし、ターゲットやデーモン自身のイベントを除外。 |
| 部分書き込み保護 | アトミックモード( → rename)とデルタモード(MARS で in‑place 更新)。 |
| 一貫性 | による全体バリア、xattr・ACL・タイムスタンプの完全複製、クラッシュ時の再起動サポート。 |
| マウント監視 | デバイス ID トラッキングと fsync ライブプローブ;障害時はワーカーを一時停止し、ジャーナルで変更を記録。 |
| ハイドレーションクリーニング | 再起動時にソースに存在しないファイルを全スキャンして削除し、一致性を保証。 |
| 緊急パージ | 発生時、古いスナップショットを自動的に削除し、レプリケーション継続。 |
監視と可観測性
Prometheus メトリクスは
http://localhost:9100/metrics で公開されます。主要メトリクス:
– キューが満杯になった際に失われたイベント数。foxing_events_dropped
– ワーカーごとのアクティブコピー数。foxing_worker_copy_in_flight
– デルタコピーで節約したバイト数。foxing_delta_bytes_saved
– ガバナー状態(steady、startup、drain、probeBW)。foxing_tuner_state
テスト
make test-quick # 約15秒の回帰テスト make test # 完全スイート make test-json # CI 用 JSON 出力
v0.8.1 のアドベンチャーストレステストは、リネームストーム、NFS ドロップ/再同期、大ファイルの中断・再開、ディスク圧迫、デルタコピー、FXAR エクスポート/インポートを網羅。
ドキュメント
- API リファレンス – Rustdoc 自動生成。
- スナップショット & エクスポート – 時点のスナップショット、.fxar アーカイブ、CoW ストレージ、選択的復元。
- アーキテクチャ & 図解 – 処理パイプライン、マウント監視、エラー処理(Graphviz)。
- ベンチマーク & 比較 – パフォーマンスデータ、MTTC マトリクス。
- キュー・マーキング – CoDel/CAKE 理論をイベントディスパッチに適用。
- 障害シナリオ – 切断、クラッシュ、ランサムウェア、容量枯渇。
命名の由来
“Foxing” は古い紙や鏡に現れる茶褐色の斑点(錆びた銀化物)を指します。Rust で書かれたミラーリングツールとして、プロジェクトの目的 ― 高速な NVMe ソース(クイックフォックス)が遅い HDD/ネットワークターゲット(ラッシードッグ)に効率的にミラーリングする ― を象徴しています。