プログラミング
Show HN: 移動するブロックが懐かしくなり、本物のLinuxディスクデフラグメンターを自作しました
Show HN: I missed the moving blocks, so I built a real Linux disk defragmenter (github.com)
要約
20年以上Linuxを使用している開発者が、Windows時代に愛用していたグラフィカルなディスクデフラグメンターの機能がLinuxに不足していると感じ、自作ツール「Defragger」を開発しました。このツールは、ファイルや空き領域の断片化を視覚化し、ext4ファイルシステムやオフラインのFATボリュームのデフラグ・圧縮を行うことができます。α版であり、使用には注意が必要ですが、ファイルシステムの内部構造を理解するのに役立ちます。
全文翻訳
Defragger Linux向けのリアルなグラフィカルデフラグメンターです。たまに役立ちますが、奇妙なほど満足感があります。
20年以上前にLinuxに移行して以来…Windowsで最も恋しくなったユーティリティが、グラフィカルなディスクデフラグメンターでした。現代のLinuxファイルシステムが毎週のデフラグ儀式を必要とするからではありません。古いブロックマップは、マシンを読みやすくする偶然のインターフェースの一つでした。ファイルシステムが自己組織化していくのを実際に観察することができたのです。
そして最近、高スループットロガーのテスト中に再現可能なストレージレイアウトが必要になりました。断片化とエクステント割り当ては、NVMe上でも測定可能なばらつきを加えていたため、ノスタルジアプロジェクトは実際のファイルシステムツールになりました。
Defraggerは、ファイル、空き領域、ファイルシステムメタデータがどのように割り当てられているかを表示し、断片化されたファイルを見つけ、e4defragやfilefragを呼び出すことなくサポートされているファイルシステムを再編成できます。
警告
これはα版のファイルシステムソフトウェアです。重要なデータをバックアップしてください。ext4パスは最もテストされています。FAT書き込みサポートは新しいため、最初に使い捨てまたは完全にバックアップされたボリュームで使用してください。
安全に試す
デモ
このデモは、リポジトリの意図的に断片化されたext4フィクスチャを解凍し、そのコピーを一時的なループデバイスとしてアタッチし、Defraggerを開きます。ターミナルに表示されるループデバイスを選択してください。Defraggerを閉じると、一時イメージはデタッチされ削除されます。このデモは実際のボリュームには書き込みません。デモには、zstd、ループデバイスサポート、および一時イメージのアタッチのためのsudoのみが必要です。アプリケーション自体は特権なしで動作します。
仕組み
Defraggerは既存のコマンドラインツールのラッパーではありません。ext4の場合、FS_IOC_GETFSMAPを介してファイルシステム割り当てマップを取得し、FS_IOC_FIEMAPを介して個々のファイルをマップし、カーネルのEXT4_IOC_MOVE_EXTインターフェースを使用してエクステントを移動します。グラフィカルアプリケーションとCLIは決してroot権限で実行されません。特権操作は、D-Bus経由でPolicyKitによって承認された狭いヘルパーによって実行されます。ヘルパーは、任意のパスやコマンドではなく、検証済みの不透明な操作IDを受け入れます。
クラシックなFAT書き込みはオフラインのみです。Defraggerは、FATのコピーとファイルチェーンの両方を検証し、ディレクトリメタデータをリダイレクトする前にコピーされたデータを読み戻し、ミラーリングされた割り当てテーブルを保守的に更新します。完全な特権境界、検証ルール、および更新順序については、アーキテクチャノートを参照してください。
何をするか
断片化を分析し、適応型のファイルシステムブロックマップを表示します。ext4ファイルとオフラインFAT16/FAT32ボリュームをデフラグします。オフラインFAT16/FAT32ボリュームのデータをファイルシステムの前方に移動してコンパクト化します。昇格されたアクセスが必要な操作にはPolicyKitを使用し、GUIとCLIは特権なしで実行し続けます。安全なキャンセルをサポートし、進捗状況と最終的なメトリクスを報告します。
サポートされる環境
Defraggerは、Qt 6とKDE KirigamiがインストールされたLinuxで実行されます。KDE Plasmaが主なデスクトップターゲットですが、プロジェクトはArch Linuxに限定されません。特権モードには、systemd、PolicyKit、およびアクティブなグラフィカルPolicyKitエージェントが必要です。
| 機能 | ext4 | FAT16/FAT32 | FAT12 | exFAT |
|------------------|------|-------------|-------|-------|
| ファイルシステム分析 | オンライン | オンライン | オンライン | オンライン |
| デフラグメンテーション | オンライン | オフライン | - | - |
| コンパクト化 | - | オフライン | - | - |
ビルドにはRust 1.85以降、CMake 3.24以降、Qt 6 BaseおよびDeclarative、Kirigami、Qt Quick Controlsデスクトップスタイル、PolicyKit、およびC++ツールチェーンが必要です。パッケージ名はディストリビューションによって異なります。
ソースから実行
デフォルトの開発ビルドは、一時的なsystemdヘルパーを使用し、PolicyKitを介して承認を求めます。最初にインストールする必要はありません。
cargo run --release # または単に run
systemdまたはPolicyKitが利用できない場合は、特権ヘルパーなしで実行します。
cargo run --release --no-default-features
CLIは、デバイスパス、マウントポイント、デバイスシンボリックリンク、およびループイメージパスを受け入れます。
cargo run --release -p defragger-cli -- list
cargo run --release -p defragger-cli -- analyze /dev/nvme0n1p2
cargo run --release -p defragger-cli -- defrag /dev/nvme0n1p2 --yes
cargo run --release -p defragger-cli -- compact /dev/sdb1 --yes
システム全体へのインストール
cmake -S . -B build -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr
cmake --build build
sudo cmake --install build
sudo systemctl daemon-reload
これにより、アプリケーション、CLI、root権限を持つD-Busヘルパー、systemdサービス、およびPolicyKitアクションがインストールされます。特権境界と実装の詳細については、アーキテクチャノートを参照してください。
ライセンス
Copyright 2026 Guillaume Binet。
Defraggerは、MITライセンスまたはApache License 2.0のいずれかを選択できるデュアルライセンスです。サードパーティのコンポーネントおよびアセットは、それぞれのライセンスの下にあります。特に、アプリケーションアイコンはKDEのBreeze Iconsプロジェクトからのものであり、その帰属表示とライセンスの詳細を参照してください。