NAS に動画、バックアップアーカイブ、インストールイメージ、写真の書き出しフォルダを保存していると、重複ファイルだけで数百 GB から数 TB を消費していることがあります。従来の方法では重複ファイルを削除するか、ハードリンクに置き換えることが多いですが、どちらも長期運用の NAS にはあまり向きません。
より安全な方法は、CoW に対応したファイルシステム上で jdupes を使い、ブロック単位の重複排除を行うことです。
Synology や FN OS のような NAS でストレージボリュームが Btrfs の場合、jdupes -B によってファイルシステムの下層機能を呼び出し、重複ファイルに同じ物理データブロックを共有させることができます。ディレクトリ上ではそれぞれ独立したファイルに見えますが、実際の保存領域は 1 つ分だけになります。
CoW 重複排除とハードリンクの違い
ハードリンクは、複数のパスが同じ inode を指す仕組みです。
容量は節約できますが、明確な弱点があります。どれか 1 つのファイルをプログラムが変更すると、他のハードリンク先から見える内容も一緒に変わります。メディアライブラリ、同期フォルダ、写真管理、バックアップディレクトリでは、この挙動が問題になりやすいです。
Btrfs の CoW 重複排除は違います。
複数の独立したファイルが同じデータブロックを共有し、どれか 1 つが変更されたときだけ、変更された部分が新しいデータブロックに書き出されます。他のファイルには影響しません。
つまり、CoW 重複排除後は次のようになります。
- ファイルパスは互いに独立したまま;
- 1 つのファイルを削除しても他のファイルは削除されない;
- 1 つのファイルを変更しても他のファイルは変わらない;
- 重複部分はディスク上で 1 つ分の容量だけを使う。
これが、NAS ではハードリンクより jdupes -B のほうが使いやすい理由です。
向いている用途
CoW 重複排除に向いているディレクトリは次のようなものです。
- メディアライブラリ内で重複しているドラマや映画;
- 複数の場所にあるインストーラ、ISO、圧縮ファイル;
- 何度も書き出した写真や動画素材;
- バックアップソフトが生成した大きな重複ファイル;
- 手作業の整理中にコピーした一時ディレクトリ。
最初からシステムボリューム全体に実行するのはおすすめしません。まずはユーザーデータの一部から試すほうが安全です。
|
|
小さい範囲でコマンド、除外ルール、節約効果を確認してから、対象を広げるのがよいです。
基本コマンド
Btrfs ディレクトリで jdupes による CoW 重複排除を行う場合、重要なのは -B です。
|
|
各オプションの意味は次のとおりです。
-r: サブディレクトリを再帰的にスキャンする;-B: 重複ファイルに対して Btrfs/CoW 重複排除を実行し、ハードリンクを作らない;"/volume1/data1/aaa/": スキャン対象のディレクトリ。
ここで最も重要なのは -B です。jdupes がファイルシステムの重複排除機能を使うようになり、通常は reflink、clone、dedupe range などの下層インターフェースが使われます。
Synology では @eaDir と #recycle を除外する
Synology では、@eaDir と #recycle をスキャン対象に含めないほうがよいです。
@eaDir は Synology が自動生成する隠しディレクトリで、サムネイル、メディアインデックス、拡張属性、パッケージ関連キャッシュなどが入っています。ファイル数が多く小さいため、スキャンコストが高いわりに節約効果は小さく、Synology のインデックスサービスに影響する可能性もあります。
#recycle は共有フォルダのごみ箱です。ここにあるファイルはいずれ削除される前提なので、重複排除する意味はあまりなく、結果の判断も難しくなります。
そのため、Synology ではこの 2 つを除外するのがおすすめです。
jdupes のバージョンによって -X オプションの書き方は異なります。一部の解説では次のように書かれています。
|
|
しかし、一部の Synology 環境では次のエラーになります。
|
|
もし jdupes -X のヘルプに nostr:text_string が表示される場合は、次の書き方のほうが互換性があります。
|
|
意味は単純です。
-X nostr:/@eaDir/: パスに/@eaDir/を含むファイルを除外する;-X nostr:/#recycle/: パスに/#recycle/を含むファイルを除外する。
対象パスに日本語や空白が含まれる場合は、必ずダブルクォートで囲みます。
|
|
FN OS NAS での考え方
FN OS NAS で Btrfs ストレージプールを使っている場合、考え方は Synology と同じです。対象ディレクトリが Btrfs 上にあることを確認し、jdupes -B で CoW 重複排除を行います。
違いは、システムの隠しディレクトリ名が異なる可能性がある点です。Synology では @eaDir と #recycle がよく出てきますが、FN OS では実際のディレクトリ構成を見て除外ルールを決める必要があります。
まずは次のように確認します。
|
|
システムキャッシュ、ごみ箱、インデックスディレクトリ、アプリデータディレクトリがあるかを確認します。重複排除の効果が大きいのは、システムが生成した小さなキャッシュではなく、ユーザーデータ内の大きなファイルです。
CoW 重複排除の成功を確認する方法
ls -l だけを見ても判断できません。CoW 重複排除後も論理ファイルサイズは変わらず、ディレクトリ上では複数の完全なファイルに見えます。
より確実な確認方法は 3 つあります。
1. jdupes の出力を見る
実行中に次のような出力があれば、重複ファイルが検出され処理された可能性が高いです。
|
|
[SRC] は基準となるファイルで、====> の後ろのファイルは同じ下層データブロックにまとめられたことを示します。ファイルは独立して存在しますが、物理容量は圧縮されています。
2. Btrfs の容量変化を比較する
重複排除の前後で次を実行します。
|
|
見るべき項目は次の 3 つです。
|
|
重複排除が効いていれば、通常は次の変化が出ます。
Usedが減る;Data,single: Usedが減る;Free (estimated)が増える。
たとえば重複排除前の Used が 8.44TiB で、後に 8.20TiB へ下がったなら、数十 GB 程度でも CoW 重複排除によって物理容量が解放されたと判断できます。
3. compsize で実使用量を見る
システムに compsize をインストールできる場合、Btrfs の圧縮や重複排除後の実使用量をより直感的に確認できます。
|
|
通常の du より、Btrfs 上の実際の占有量を把握するのに向いています。
安全に実行するための手順
おすすめの手順は次のとおりです。
- 対象ディレクトリが Btrfs ボリューム上にあることを確認する;
- 最初は小さなディレクトリで試し、いきなり全ボリュームをスキャンしない;
- システムの隠しディレクトリ、ごみ箱、アプリキャッシュを除外する;
- パスに日本語や空白がある場合はダブルクォートで囲む;
- 重複排除前に
btrfs filesystem usageを記録する; - 実行後にもう一度記録し、
UsedとFree (estimated)を比較する; - オプションの意味が不明な場合は、まず
jdupes --helpでインストール済みバージョンのフィルターを確認する。
Synology では、まず次のコマンドから試すのがおすすめです。
|
|
使っている jdupes が nostr に対応していない場合は、jdupes -X または jdupes --help の出力に合わせてフィルターを調整してください。
まとめ
Btrfs + jdupes -B の価値は、ファイルを削除したりハードリンク化したりせずに、重複内容だけを下層の物理領域で共有できることです。
Synology や FN OS のような NAS では、重複した動画、バックアップファイル、大きな素材ディレクトリの整理に特に向いています。重要なのはスキャン範囲と除外ルールです。ユーザーデータを優先し、システムキャッシュやごみ箱を避け、実行前後で Btrfs の容量変化を確認しましょう。
安全に容量を節約したいなら、まずこの形を覚えておけば十分です。
|
|