- Btrfs は、ファイル システム、RAID、ボリューム マネージャーを、COW、スナップショット、圧縮、ネイティブ チェックサムと組み合わせています。
- サブボリュームは Btrfs 内の論理システムであり、/、/home、/var を分離し、ゾーンごとにスナップショットを管理できます。
- マルチデバイスのサポートにより、ディスクの追加/削除、RAID プロファイルの変更、オンラインでのデータのバランス調整が可能になります。
- snapper や btrbk などのツールは Btrfs スナップショットを利用しますが、実際のバックアップには外部コピーが依然として必要です。

ext4やXFSからBtrfsに移行して、戸惑いの表情を浮かべるのはごく自然なことです。Btrfsは「単なる別のファイルシステム」ではなく、ファイルシステム、RAID、ボリュームマネージャを組み合わせたものなのです。サブボリューム、スナップショット、ロードバランシング、スクラブといった概念を目にすると複雑に感じるかもしれませんが、実際にはそれらはシームレスに連携する要素なのです。
この記事では、Btrfsサブボリュームの使用方法と、Arch、Debian、openSUSE、Synology/QNAPなどのNASデバイスといった一般的なインストール環境におけるその役割、スナップショット、RAID、圧縮との関連性、そしてディスク容量への影響について解説します。また、ファイルシステム、サブボリューム、スナップショットの作成、複数のディスクの管理を行うための実際のコマンド例や、よくある問題(例えば、空き容量があるにもかかわらず発生する悪名高いENOSPCエラーなど)についても紹介します。
Btrfs とは何ですか? また、他のものと何が違うのですか?
Btrfsは、GNU/Linux向けの次世代ファイルシステムであり、単一のSSDから冗長性、スナップショット、圧縮機能を備えたマルチディスクプールまで拡張できるように設計されています。バージョン2.6.29以降、カーネルに統合されており、開発は現在も活発に行われていますが、ディスクフォーマットは安定化されているため、今日作成されたBtrfsシステムは将来のカーネルでも読み取り可能です。
ext4やXFSといった従来型のファイルシステムとは異なり、Btrfsは、これまでファイルシステム、ソフトウェアRAID(mdadm)、論理ボリュームマネージャ(LVM)に分散していた機能を統合しています。単一のスタックで、マルチデバイス管理、RAIDプロファイル、スナップショット、サブボリューム、整合性チェックなど、さまざまな機能を利用できます。
Btrfs の主要原則: COW、スナップショット、RAID、チェックサム
Btrfsの中核となるのは、コピーオンライト(COW)モデルです。データを変更する際、システムは元のデータを同じ場所に上書きするのではなく、新しいブロックを別の場所に書き込み、参照を更新します。これにより、ファイルやサブボリュームのクローン作成がほぼ瞬時に行えるだけでなく、時間と容量の両面で非常に低コストなスナップショットも作成できます。
この設計では、データとメタデータの各ブロックに独自のチェックサム(通常はCRC32C)が付与されます。Btrfsはブロックを読み込む際にチェックサムをチェックし、一致しない場合は、別のコピーが存在する場合(例えば、RAID 1やRAID 10の場合)、正常なレプリカを読み込み、エラーを即座に修正します。これにより、ext4単体では検出できない、サイレントなデータ破損を防ぐことができます。
さらに、Btrfsは、RAID0、RAID1、RAID10、RAID5、RAID6などのRAIDプロファイルを持つ複数のデバイスを内蔵でサポートしており、データ(-d)とメタデータ(-m)を個別に設定できます。内部的には、mdadmのような従来のブロックRAIDではなく、ファイルシステム自体が管理する「チャンク」レベルでのレプリケーションとストライピングを採用しています。
最後に、Btrfsは透過的なオンザフライ圧縮(zlib、lzo、zstd)を適用できます。データは書き込み前に圧縮され、読み込み時に解凍されるため、アプリケーションからは完全に透過的に処理されます。これにより、ディスク容量の消費量が削減され、多くの場合、低速なディスクや機械式ディスクでの読み込み速度も向上します。
Btrfsファイルシステムの作成
サブボリュームの操作を開始するには、まずデバイス上にBtrfsファイルシステムが必要です。基本的な作成プロセスは、他のmkfsファイルシステムと非常によく似ています。
mkfs.btrfs /dev/sdb
このコマンドは、RAIDやその他の追加機能を使用せずに、 /dev/sdbをBtrfsで初期化します。ディスク全体またはパーティションを使用できます。その後、マウントポイントにマウントします。例:
mount /dev/sdb /mnt/btrfs
最初から複数のデバイスを使用するシステムを構築したい場合は、作成コマンドに複数のデバイスを追加するだけです。
mkfs.btrfs /dev/sdc /dev/sdd
この場合、Btrfsはデバイスの容量を合計した論理プールを作成します(デフォルトでは、データは「single」形式、メタデータはRAID1形式でミラーリングされます。特に指定がない限り)。マウント時には、デバイスを1つだけ指定すればよく、例えば/dev/sdcを指定します。
ネイティブRAIDプロファイルと動的プール管理
ファイルシステムを作成する際、 -dy -m オプションを使用してデータとメタデータの冗長性プロファイルを指定できます。指定できる値は、raid0、raid1、raid10、raid5、raid6、または single などです。Btrfs における RAID1 の典型的な例は次のとおりです。
mkfs.btrfs -d raid1 -m raid1 /dev/sdc /dev/sdd
従来のRAID 1とは異なり、Btrfsにはブロック単位で完全に一致するミラーリングは存在しません。保証されているのは、データまたはメタデータの各ブロックが異なるデバイス上に少なくとも2つのコピーを持つことですが、いわゆる「双子」ディスクは存在せず、異なるサイズのディスクも使用可能です。
システムがマウントされたら、次のようなコマンドを使用して、ホット状態でディスクプールにディスクを追加したり削除したりできます。
btrfs device add /dev/sdb /mnt/btrfs
btrfs device delete /dev/sdc /mnt/btrfs
デバイスを追加した後は、既存のデータチャンクをすべてのディスクに再分散するために、データ負荷分散を実行することをお勧めします。
btrfs filesystem balance /mnt/btrfs
このバランス調整処理は、選択されたRAIDプロファイルに従ってブロックを再配置することで、すべてのディスクが連携し、より均等に領域が使用されるようにします。これはオンライン操作であり、実行中もファイルシステムへのアクセスは可能です。
再インストールせずにシングルからRAID1に切り替える方法
Btrfs の優れた点の 1 つは、アンマウントや再インストールをせずに、既存のシステムを別の RAID プロファイルに変換できることです。たとえば、Btrfs のルートが単一のディスク /dev/sda1 にあり、/dev/sdb1 を追加して RAID 1 に切り替えたいとします。
手順としては、新しいデバイスを追加し、プロファイル変換による負荷分散を実行します。
btrfs device add /dev/sdb1 /
btrfs balance start -dconvert=raid1 -mconvert=raid1 /
この処理中に、Btrfs はチャンクを再配置し、すべてのデータとメタデータが両方のディスクに複製されるようにします。処理が完了すると、「btrfs filesystem show /」コマンドで同様の使用状況を持つ 2 つのデバイスが表示され、「btrfs filesystem df /」コマンドで Data、Metadata、および System の RAID1 プロファイルが表示されます。
RAID の劣化と Btrfs による修復
ネイティブRAID1構成でディスクのいずれかが故障した場合、システムは劣化モードに移行します。Btrfsでこのシステムを設定するには、次のオプションが必要です。
mount -o degraded /dev/sdb /mnt/btrfs
システムがこの状態にある間、Btrfsは正常なコピーからデータを提供し続けますが、完全な冗長性は確保されません。正しい手順は、新しいディスクを追加し、不足しているデバイスをプールから削除し、ロードバランシングを実行してブロックを再複製することです。
局所的な破損やディスクの問題が発生した場合は、スクラブを実行するオプションもあります。スクラブはすべてのブロックをスキャンし、チェックサムを確認し、可能であれば正常なコピーから修復を行います。
btrfs scrub start /mnt/btrfs
btrfs scrub status /mnt/btrfs
このスクラブ処理はシステムがマウントされている間、バックグラウンドで実行されるため、特にサーバーやNASデバイスでは、ピーク時以外の時間帯にスケジュールするのが最適です。
透過的な圧縮: zlib、lzo、zstd
`compress` または `compress=<something>`オプションを使用してシステムを設定すると、その時点以降に書き込まれるすべてのデータが自動的に圧縮されます。例:
mount -o compress=zstd /dev/sdb /mnt/btrfs
システムは圧縮されたブロックをディスクに保存しますが、`ls`や`stat`を実行すると、圧縮されていない論理サイズが表示されます。この利点は、`df`(使用容量が少ない)や`btrfs filesystem df`などのツール、または`compsize`などのユーティリティを使用した場合に顕著に現れます。
利用可能なアルゴリズムは、圧縮率とCPU使用率のバランスがそれぞれ異なります。
- ZLIB: 圧縮率は高いですが、速度は遅くなります。非常に静的なデータに便利です。
- イゾ非常に高速ですが、圧縮率は低くなります。書き込み量が多いシステムに適したオプションです。
- zstd: いくつかの設定可能なレベルを備えた、非常に興味深いバランス。
マウント時に圧縮レベルを調整することもできます。例えば、速度を優先する場合は zstd:1、CPU 使用率を犠牲にして圧縮率を最大化する場合は zstd:15 と指定します。これらのパラメータは、システムがマウントされたときに /proc/mounts ファイルと dmesg メッセージに反映されます。
ファイルへのコピーオンライト:reflinksによるインスタントクローン
ファイルレベルのCOWメカニズムは、例えば`cp`コマンドの`--reflink=always`オプションによって利用できます。reflinkを使用して大きなファイルをBtrfsにコピーする場合、データはディスク上に複製されず、同じブロックへの参照が追加されるだけです。
cp --reflink=always imagen.iso copia1.iso
コピーは即座に作成され、初期状態では追加の容量を一切消費しません。ファイルのいずれかが変更された場合にのみ、影響を受けるブロックが物理的にコピーされます(真のコピーオンライト)。これは、仮想マシンのテンプレートやベースイメージなどに非常に役立ちます。
サブボリュームのスナップショットにも同じことが言えます。これは、サブボリューム全体をコピー&ペースト(COW)で複製したものです。作成時にはメタデータはほとんど使用されず、実際のストレージ消費量は、元のファイルとスナップショットの内容の違いに応じて後から発生します。
Btrfs サブボリューム: サブボリュームとは何か、そして何に使われるのか
Btrfsにおけるサブボリュームは、実際にはメインシステム内の「ミニファイルシステム」です。完全なBtrfsには常に少なくとも1つのサブボリューム(最上位レベル)があり、その上に他のサブボリュームを作成できます。外部からは、それらは単純なディレクトリとして表示されます。
このシステムの優れた点は、各サブボリュームを個別にマウントでき、独自のスナップショット、クォータ(クォータシステムが有効になっている場合)、およびバックアップポリシーを設定できることです。しかも、これらすべてを親ボリュームと同じストレージプールとRAID構成で実現できます。
/mnt/btrfs にすでにマウントされている Btrfs の上に複数のサブボリュームを作成するには、次のようにします。
btrfs subvolume create /mnt/btrfs/subvolumen1
btrfs subvolume create /mnt/btrfs/subvolumen2
btrfs subvolume create /mnt/btrfs/subvolumen3
これらのサブボリュームは /mnt/btrfs のディレクトリとして表示されますが、btrfs コマンドで一覧表示すると、ID と内部パスが表示されます。
btrfs subvolume list /mnt/btrfs
ID(例えば、subvolume1の場合は256)を取得したら、そのサブボリュームのみを別のパスにマウントできます。
mount -o subvolid=256 /dev/sdb /mnt/subvol1
この方法を用いると、そのサブボリューム上のデータに/mnt/btrfs/subvolume1 と /mnt/subvol1 の両方から同時にアクセスできますが、内容は同じです。これは、従来のパーティショニングに頼ることなく、/、/home、/var、または特定のデータセットを分離するのに非常に便利です。
サブボリューム設計: 実用的な例 (Arch、Debian、NAS)
デスクトップコンピュータの典型的な構造は次のようになるでしょう。
- @ /home または /var/lib/docker のないルート (/) の場合。
- @家 あなたの個人データを /home に送信します。
- @var または、@var-log、@var-cache などの特定のサブボリューム。
- @スナップショット スナップショットを日付順に保存します。
これにより、システムスナップショット用のsnapper 、Timeshift、btrbkなどのツールが、システム(サブボリューム@)のみのスナップショットを作成してアップデートをロールバックできる一方、ユーザー文書(@home内)は別のロジックで保護または同期されます。
SynologyやQNAPのNASでは、実際にはBtrfsサブボリューム上に共有フォルダが作成され、スナップショットレプリケーションによってそれらのフォルダのスナップショットを作成したり、クローンを作成したり、別のNASに複製したりすることが可能になります。基本的な考え方は同じですが、グラフィカルインターフェースで操作できるようになっています。
サブボリュームスナップショット: 数秒でロールバックとコピー
Btrfs のスナップショットは、別のサブボリュームのスナップショットとして作成されたサブボリュームです。/mnt/btrfs/subvolume1 のスナップショットを別のサブボリュームに作成するには、snapshot_sub1 を使用します。
btrfs subvolume snapshot \
/mnt/btrfs/subvolumen1 \
/mnt/btrfs/subvolumen1_snapshot
その後、`btrfs subvolume list`を実行すると、このスナップショットの新しいIDとパスが表示されます。それ以降、両者は論理的に独立しており、内部的にはブロックを共有しているものの、変更されるまでは一方への変更は他方に影響を与えません。
これは、迅速なバックアップ(例えば、システムアップグレード前)だけでなく、ラボ、テスト、開発環境などにも使用されます。スナップショットの復元は通常、スナップショットをマウントして新しいデフォルトのサブボリュームとして使用するか、データをコピーし直すかのいずれかの方法で行います。
RAID で複数のディスクに Btrfs を使用する
Btrfsでは、マルチディスク管理はファイルシステムから直接行われます。ボリュームを作成する際に、データとメタデータ用に個別のプロファイルを定義できます。例えば、 3台以上のデバイスがある場合、データはRAID 5、メタデータはRAID 1といった具合です。
mkfs.btrfs -d raid5 -m raid1 /dev/sdb /dev/sdc /dev/sdd
このタイプのプロファイルは、データに対してストライピングとパリティ(読み取り速度と耐障害性の向上)を提供し、メタデータに対して強力な冗長性を提供しますが、その代償としてディスク容量が若干増加します。しかし、BtrfsのRAID 5/6には過去に重大なバグが存在したため、重要な環境では、多くの管理者が依然としてRAID 1/10を好んで使用しています。
最初にRAID1プールを作成し、後でその領域をより有効活用したい場合は、バランシング機能を使用してプロファイルをオンザフライで変換できます。
btrfs balance start -dconvert=raid5 -mconvert=raid1 /srv
同様に、デバイスの追加または削除は`btrfs device add/remove` コマンドで行い、その後、負荷分散によってチャンクが再配置されます。`btrfs filesystem show` コマンドは、プール内の各ディスクの状態、サイズ、および使用状況の概要を提供します。
スペース管理: Btrfs で du と df が「嘘」になる理由
Btrfsの最も紛らわしい点の1つは、従来のdfやduツールが実際のデータ量を正確に反映していないことです。チャンクレベルのRAID、COW、スナップショット、圧縮といった要素が混在しているため、「1 MiBの書き込み=1 MiBの使用」という前提は成り立ちません。
Btrfsでは、ストレージ領域は大きなチャンク単位で割り当てられ、通常はデータ用に1 GiB、メタデータ用に256 MiBが割り当てられます。各チャンクには、シングル、RAID 1、RAID 10などのプロファイルが割り当てられます。チャンク内では、1 MiBが書き込まれると1 MiBが使用されることになりますが、複数のチャンクとブロックコピーが結合される方法により、この単純な計算は難しくなります。
さらに、COW(Copy-On-Write)とスナップショットの場合、ファイルを削除してもそのブロックが解放されるとは限りません。それらのブロックが別のスナップショットやクローン参照リンクと共有されている場合、それらへの参照がなくなるまでスペースを占有し続けます。そのため、「ファイルを削除してもスペースが戻ってこない」と感じるのです。
このため、Btrfsには「btrfs filesystem df <path>」のようにプロファイルごとのデータ、メタデータ、システムの使用状況の内訳を表示するコマンドや、「btrfs filesystem show <device>」のように各ディスクのどの部分が予約され、生データとして使用されているかを表示するコマンドなど、特定のコマンドが用意されています。
日常使用におけるサブボリュームとスナップショットのベストプラクティス
例えば、単一のSSDにBtrfsを使用したArch Linuxをインストールする場合、強く推奨される戦略は次のとおりです。
- ルート パーティションに一意の Btrfs を作成します。
- / (システム)、/home、/var/log、場合によっては /var/lib/libvirt または /var/lib/docker に個別のサブボリュームを定義します。
- 各サブボリュームを適切な圧縮オプション (zstd または lzo) でマウントし、必要に応じて、多数の小さなファイルを含む負荷に対して自動デフラグを実行します。
- Snapper、Timeshift、またはbtrbkを使用して システムサブボリュームのスナップショットを自動化する アップデート前とアップデート後。
複数のSSDを搭載した物理マシンでは、 RAID 1/10と論理サブボリュームを備えた単一のマルチデバイスBtrfsアレイ、または複数の独立したBtrfsアレイのいずれかを選択できます。サブボリュームに関しては、大きな違いはありません。サブボリュームは、存在するBtrfsアレイ内の論理エンティティとして扱われます。重要なのは、スナップショットを作成して個別に復元したいデータを最初から定義することです。
フルバックアップに関してですが、スナップショットは外部バックアップではないことに注意してください。SnapperやTimeshiftは通常、ローカルスナップショット(主にシステム)に使用され、すべてのデータ(/homeを含む)の真のバックアップには、borg、restic、rsync、リモートbtrbk、またはNAS独自のスナップショット/レプリケーションソリューションなどのツールを使用するのが最適です。
Btrfsの基本的な管理と便利なコマンド
Btrfs CLI はやや冗長に感じるかもしれませんが、固有のプレフィックスを使用してサブコマンドを省略することができます。たとえば、あいまいさがない場合は、「btrfs filesystem defragment /」の代わりに「btrfs fi de /」を使用できます。
頻繁に使用する基本的なコマンドをいくつかご紹介します。
- mkfs.btrfs: RAID オプションとラベルを使用してファイル システムを作成します。
- btrfs ファイルシステムの表示/df: デバイス、使用状況、プロファイルを表示します。
- btrfsデバイスの追加/削除: プールにディスクを追加または削除します。
- btrfsバランス開始: データのバランスを再調整し、RAID プロファイルを変換します。
- btrfs スクラブの開始/ステータス: チェックサムを使用してブロックを検証および修復します。
- btrfsサブボリュームの作成/一覧表示/削除/スナップショット: サブボリュームとスナップショットを管理します。
- btrfsチェック: ファイル システムをオフラインで確認します (注意して)。
また、従来のfsckをBtrfsに毎回起動時に渡すべきではないことも覚えておくことが重要です。fstabでは、不適切な自動チェックを避けるために、Btrfsエントリの最後のフィールドを0にする必要があります。
この一連の概念とコマンドにより、Btrfsは「奇妙なブラックボックス」ではなくなり、サブボリュームを使用してシステムを論理的に整理したり、真に役立つスナップショットを活用したり、これらすべてを冗長性と圧縮と組み合わせたりできる、非常に柔軟なツールになります。これは、シンプルなノートパソコンでも、複数のディスクのプールでも可能です。
バイトの世界とテクノロジー全般についての情熱的なライター。私は執筆を通じて自分の知識を共有するのが大好きです。このブログでは、ガジェット、ソフトウェア、ハードウェア、技術トレンドなどについて最も興味深いことをすべて紹介します。私の目標は、シンプルで楽しい方法でデジタル世界をナビゲートできるよう支援することです。
