Synology と FN OS NAS で Btrfs + jdupes の CoW 重複排除を使って容量を節約する

Synology や FN OS NAS で Btrfs の CoW 機能を使い、jdupes によるブロック単位の重複排除で容量を節約しつつ、ハードリンクの変更リスクを避ける方法を解説します。

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、圧縮ファイル;
  • 何度も書き出した写真や動画素材;
  • バックアップソフトが生成した大きな重複ファイル;
  • 手作業の整理中にコピーした一時ディレクトリ。

最初からシステムボリューム全体に実行するのはおすすめしません。まずはユーザーデータの一部から試すほうが安全です。

1
2
3
/volume1/video/
/volume1/photo/
/volume1/data1/aaa/

小さい範囲でコマンド、除外ルール、節約効果を確認してから、対象を広げるのがよいです。

基本コマンド

Btrfs ディレクトリで jdupes による CoW 重複排除を行う場合、重要なのは -B です。

1
jdupes -r -B "/volume1/data1/aaa/"

各オプションの意味は次のとおりです。

  • -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 オプションの書き方は異なります。一部の解説では次のように書かれています。

1
jdupes -r -B -X "req:*/@eaDir/*" -X "req:*/#recycle/*" "/volume1/data1/aaa/"

しかし、一部の Synology 環境では次のエラーになります。

1
Invalid extfilter filter name was specified

もし jdupes -X のヘルプに nostr:text_string が表示される場合は、次の書き方のほうが互換性があります。

1
jdupes -r -B -X nostr:/@eaDir/ -X nostr:/#recycle/ "/volume1/data1/aaa/"

意味は単純です。

  • -X nostr:/@eaDir/: パスに /@eaDir/ を含むファイルを除外する;
  • -X nostr:/#recycle/: パスに /#recycle/ を含むファイルを除外する。

対象パスに日本語や空白が含まれる場合は、必ずダブルクォートで囲みます。

1
jdupes -r -B -X nostr:/@eaDir/ -X nostr:/#recycle/ "/volume1/photo/视频工作/"

FN OS NAS での考え方

FN OS NAS で Btrfs ストレージプールを使っている場合、考え方は Synology と同じです。対象ディレクトリが Btrfs 上にあることを確認し、jdupes -B で CoW 重複排除を行います。

違いは、システムの隠しディレクトリ名が異なる可能性がある点です。Synology では @eaDir#recycle がよく出てきますが、FN OS では実際のディレクトリ構成を見て除外ルールを決める必要があります。

まずは次のように確認します。

1
find "/你的目标目录" -maxdepth 2 -type d

システムキャッシュ、ごみ箱、インデックスディレクトリ、アプリデータディレクトリがあるかを確認します。重複排除の効果が大きいのは、システムが生成した小さなキャッシュではなく、ユーザーデータ内の大きなファイルです。

CoW 重複排除の成功を確認する方法

ls -l だけを見ても判断できません。CoW 重複排除後も論理ファイルサイズは変わらず、ディレクトリ上では複数の完全なファイルに見えます。

より確実な確認方法は 3 つあります。

1. jdupes の出力を見る

実行中に次のような出力があれば、重複ファイルが検出され処理された可能性が高いです。

1
2
3
[SRC] /volume1/data1/aaa/1/file.mkv
====> /volume1/data1/aaa/2/file.mkv
====> /volume1/data1/aaa/3/file.mkv

[SRC] は基準となるファイルで、====> の後ろのファイルは同じ下層データブロックにまとめられたことを示します。ファイルは独立して存在しますが、物理容量は圧縮されています。

2. Btrfs の容量変化を比較する

重複排除の前後で次を実行します。

1
sudo btrfs filesystem usage /volume1/data1/aaa/

見るべき項目は次の 3 つです。

1
2
3
Used:
Free (estimated):
Data,single: Used:

重複排除が効いていれば、通常は次の変化が出ます。

  • Used が減る;
  • Data,single: Used が減る;
  • Free (estimated) が増える。

たとえば重複排除前の Used8.44TiB で、後に 8.20TiB へ下がったなら、数十 GB 程度でも CoW 重複排除によって物理容量が解放されたと判断できます。

3. compsize で実使用量を見る

システムに compsize をインストールできる場合、Btrfs の圧縮や重複排除後の実使用量をより直感的に確認できます。

1
sudo compsize "/volume1/data1/aaa/"

通常の du より、Btrfs 上の実際の占有量を把握するのに向いています。

安全に実行するための手順

おすすめの手順は次のとおりです。

  1. 対象ディレクトリが Btrfs ボリューム上にあることを確認する;
  2. 最初は小さなディレクトリで試し、いきなり全ボリュームをスキャンしない;
  3. システムの隠しディレクトリ、ごみ箱、アプリキャッシュを除外する;
  4. パスに日本語や空白がある場合はダブルクォートで囲む;
  5. 重複排除前に btrfs filesystem usage を記録する;
  6. 実行後にもう一度記録し、UsedFree (estimated) を比較する;
  7. オプションの意味が不明な場合は、まず jdupes --help でインストール済みバージョンのフィルターを確認する。

Synology では、まず次のコマンドから試すのがおすすめです。

1
jdupes -r -B -X nostr:/@eaDir/ -X nostr:/#recycle/ "/volume1/data1/aaa/"

使っている jdupesnostr に対応していない場合は、jdupes -X または jdupes --help の出力に合わせてフィルターを調整してください。

まとめ

Btrfs + jdupes -B の価値は、ファイルを削除したりハードリンク化したりせずに、重複内容だけを下層の物理領域で共有できることです。

Synology や FN OS のような NAS では、重複した動画、バックアップファイル、大きな素材ディレクトリの整理に特に向いています。重要なのはスキャン範囲と除外ルールです。ユーザーデータを優先し、システムキャッシュやごみ箱を避け、実行前後で Btrfs の容量変化を確認しましょう。

安全に容量を節約したいなら、まずこの形を覚えておけば十分です。

1
jdupes -r -B -X nostr:/@eaDir/ -X nostr:/#recycle/ "/你的Btrfs数据目录/"
记录并分享
Hugo で構築されています。
テーマ StackJimmy によって設計されています。