
2026/06/22 5:44
F*ファイルシステム - OSカーネルを迂回してSSDを直接読み込むファイル検索
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
ffs は、標準的な OS キャッシュを迂回してディスクデバイスを直接読み取る高パフォーマンスのコマンドライン検索ツールとして際立っています。従来のカーネルインターフェースよりも原始的なバイナリ解析を優先し、OpenMP を通じた並列処理などの技法を採用することで、最終的にキャッシュが枯渇する大規模データセットにおいて既存ツールを上回ります。その主な利点は、仮想ファイルシステム(VFS)経路に依存せずデータを解析できる点であり、これを可能にするためユーザーはマウントされていないボリュームや ISO イメージを直接検索できます。画像ファイルのみについて Elevated permissions は不要ですが(macOS のロープディスクを読み取る場合は SIP を無効にする必要があります)、APFS や Btrfs などのファイルシステムに対応しています。特に主要ディスクや Btrfs に対して更新の無効化リスクが存在するため、スーパーブロックへのルートアクセスを許可する必要がある macOS では、System Integrity Protection を無効にすることで深いディスクデータへのアクセスが可能になります。また、対象となるファイルシステムに応じて OpenMP や libzstd などの特定ライブラリが必要です。最近のアップデートがディスクへ deferred される前にカーネルによってキャッシュされる可能性があるため、一部のケースではユーザーが手動でディスク同期をトリガーする必要があります。初期段階ではカーネルキャッシュのクリアによるパフォーマンスペナルティを受けるものの、持続的なロープ読み取り速度により、標準ツールが追いつけない巨大ドライブにおける網羅的な検索において優れています。
本文
デレクトストレージ直接検索ツール「fff」のご紹介
この CLI ツールは、OS カーネルを経由せずディスクストレージそのものを直接読み込み、ファイルを検索する機能を提供します(
grep に相当)。コードは C 言語 で約 1.5k 行 収められています。
📉 制限事項
は、ローカルデバイスノード(例:sudo
)を直接読み取る場合にのみ必要です。イメージファイル検索には管理者権限は不要です。/dev/rdisk*- macOS のメインディスク上使用時は、**SIP(System Integrity Protection)**の保護を無効にする必要があります。
- 新しいファイル書き込みの一部を見逃す可能性があります(手動で同期コールが必要な場合があります)。
- OS の他のコンポーネントが書き込んでいる間、高揮発性ファイルシステム上のツリー検索ができないことがあります。
- 本プロジェクトでは手動実装のファイルシステムのみをサポートしています。
✅ メリット
- ディスクからブロックを直接読み込みます。
- VFS やバッファリングされた
パスを迂回し、ブロックデバイス自体をプリロード(read()
)します。pread - ripgrep よりもさらに高速です(検索対象ファイル数が増えるほど性能差が拡大)。
- マウントされていないボリュームを検索できます(単なるバイナリデータの解析)。
- バイナリファイルを自動的に検出し、スキップします。
- OpenMP を使用して処理負荷を全コアに分散させます。
🚀 高速な検索プロジェクト「fff」
実際に動作し、
sudo 不要で ripgrep の性能を超えるツールです。ぜひお試しください。
💾 サポートされているファイルシステム
Linux(ほぼすべてのファイルシステム)
-
Ext4 (
)./fs/ext4.c- 実装が最も簡単なファイルシステムのひとつです。インプレース方式のジャーナリングファイルシステムなので、多くの場合に fff の最適な対象となります。
- ⚠️ 注意: カーネルが更新内容をキャッシュしている場合、最新のファイル変更が見えないことがあります。その場合は、手動で同期(
など)を強制してください。fsync
-
Btrfs (
)./fs/btrfs.c- B-ツリー方式を採用した効率的なストレージですが、追加制限があります。
- ファイル更新時にスーパーブロック全体を更新するため、fff がスーパーブロックを読み取った直後にカーネルがツリーを更新すると、読み取り結果が無効化されます。
- 回避策:
を使用するか、別の分離したボリュームを作成する。fsfreeze
-
APFS (MacOS) (
)./fs/apfs.c- Apple のプロプライエタリなファイルシステムです。リバースエンジニアリングによりサポートされていますが、セキュリティ強化により制限があります。
- メインディスク上で実行するには SIP を無効化する必要があります(
バイパスも不可能)。sudo - メインディスクに影響を与えずにテストする方法:ボリュームの生データへのパスとファイルシステムタイプを指定してマウントせず検索できます。
ffs "<QUERY>" /path/to/volume.dmg apfs
🗜️ デタッチされたボリュームでの検索
fff はバイト列を直接読み取るため、マウントなしで任意のデタッチされたボリュームを検索できます(例:
.iso, .dmg など)。
⚡ 速度について
fff は VFS やカーネルのファイルシステムキャッシュへのアクセスを持っていません。
- 初期状態: キャッシュがないため低速。
- 定常状態: カーネルが実際のディスク状態を読み込むようになり、次第に ripgrep よりも高速化します。
これは「カーネルの VFS がオーバーヘッドとなること」を証明しています。
以下のグラフは、Btrfs マウントされたドライブにおける ffs と ripgrep の比較結果です。ripgrep は高度な SIMD ベースのマッチャーを使用していますが、fff は約 1.8k 行の C コードのみです。
[repos] — 631,000 files
| Tool | Time |
|---|---|
| ffs | 5.505s |
| rg | 4.813s |
[dev] — 1,500,000 files
| Tool | Time |
|---|---|
| ffs | 18.413s |
| rg | 25.673s |
[home] — 3,250,000 files
| Tool | Time |
|---|---|
| ffs | 36.205s |
| rg | 74.690s |
※ ripgrep に使用されたフラグ:
-F --no-heading -H -n --no-ignore --hidden --one-file-system --no-messages※ これらの設定で fff と同じ結果を取得するように調整されています。
🔨 プロジェクトのビルド
プロジェクトをコンパイルするには、以下のライブラリが必要です:
(Btrfs サポート用)libzstd
(pkg-config 経由で必要)openmp
これだけでシンプルに動作します。