
重要: 本ガイドは主に個人・小規模サーバ用途を想定しています。Btrfsの一部機能はディストリビューションやカーネルのバージョンによって挙動が異なるため、本番環境では事前にテストを行ってください。
この記事の範囲と主要検索意図
- 主要意図: Linuxで複数ドライブをBtrfsでプール化/ミラーリングする具体手順を知りたい人向け
- 関連バリエーション: Btrfs RAID設定、ドライブ追加・削除、/etc/fstab設定、障害時の復旧手順
主要ポイント(要約)
- Btrfsはファイルシステムの機能でストレージプールやRAIDプロファイルを提供する。ext4やLVM+mdadmとは設計が異なる。
- 新規作成、既存ファイルシステムの変換、ドライブ追加や削除、障害時の対処までコマンド例を提示。
- /etc/fstabの最適なマウントオプションや、SSD向けのチューニング例も含む。
Btrfsとは
Btrfs(B-tree filesystem、通称 “Butter FS” や “Better FS”)は、スナップショット、サブボリューム、チェックサム、ストレージプーリング、複数デバイスのサポートなど、従来は別ソフトで提供されていた機能をファイルシステム層で統合することを目標とした次世代的なファイルシステムです。
定義(1行): Btrfsは、複数デバイスの結合・RAIDプロファイルの適用・スナップショットをネイティブで提供するLinux向けのファイルシステムです。
注意点: 一部の高度な機能はカーネルやbtrfs-progsのバージョン依存で、ディストリビューションによって安定度が異なります。単一のドライブで極端に安定性を重視するならext4を選ぶケースがあります。
事前確認(チェックリスト)
- 重要データはバックアップ済みか(必須)。
- カーネルとbtrfs-progsのバージョンを確認:
uname -rとbtrfs --versionを実行。 - 対象ドライブ名を間違えない(例: /dev/sdaはOS/ブート用になっていることが多い)。
- ドライブのパーティション構成を確認:
lsblk -f、fdisk -lまたはblkid。
ハードウェア構成の例
この記事では例として以下の構成を使います(実環境の名前は置き換えてください)。
- /dev/sda: OSおよびブートローダ(ここでは操作しない)
- /dev/sdb: 1TB
- /dev/sdc: 1TB
- /dev/sdd: 500GB
- /dev/sde: 500GB
合計: 3TBの物理容量(ただしRAIDプロファイルにより使用可能容量は変わる)。
Btrfsファイルシステムの作成(基本)
- デバイスを初期化してBtrfsを作る(例: /dev/sdb)。
sudo mkfs.btrfs /dev/sdb- 最初のデバイスをマウントする(作業用マウントポイント: /mnt)。
sudo mount /dev/sdb /mnt- 追加のデバイスを初期化して、既存のファイルシステムに追加する。
sudo mkfs.btrfs /dev/sdc
sudo mkfs.btrfs /dev/sdd
sudo mkfs.btrfs /dev/sde
sudo btrfs device add /dev/sdc /mnt
sudo btrfs device add /dev/sdd /mnt
sudo btrfs device add /dev/sde /mnt- 既存データがあるならバランス(dataとmetadataの再配置)を行う。
sudo btrfs filesystem balance /mntこれで物理ドライブが結合され、1つの大きなBtrfsファイルシステムとして扱えます。
一度に複数ドライブで作成する方法
最初から全デバイスを指定して作成すると簡潔です(ただし各デバイスが空である必要があります)。例: 単純に分散させる「single」プロファイルを使うパターン。
sudo mkfs.btrfs -d single /dev/sdb /dev/sdc /dev/sdd /dev/sde-d オプションの意味: dataの配置プロファイルを指定します。-m で metadata のプロファイルを指定可能です。
データプロファイルの選択(概要)
- single: データを分散(RAID0ライク)する。デバイスサイズが異なる場合に使いやすい。
- raid0: ストライピング(同サイズのデバイスで有効)。高速だが冗長性なし。
- raid1: ミラーリング。冗長化することでドライブ障害からの保護が可能(可用容量は最小ドライブ容量に依存)。
- raid10: RAID0+RAID1の組合せ。複数台でのミラー/ストライプ構成。
例: 最初からRAID1で作る
sudo mkfs.btrfs -d raid1 -m raid1 /dev/sdb /dev/sdc /dev/sdd /dev/sde注意: RAID1で4台のうち2台の容量が小さい場合、可用容量は最小容量に依存します。上記例では500GBがミラーの制約になる可能性があります(実際の割り当てはBtrfsのアルゴリズムに依存)。
既存BtrfsのRAID設定を変換する(変換コマンド)
既にBtrfsで作成済みのファイルシステムを別のRAID構成に変更できます。まずマウントします(パーティションがある場合は /dev/sdb1 のように指定)。
sudo mount /dev/sdb1 /mntデータとメタデータの両方をraid1に変換する例:
sudo btrfs balance start -dconvert=raid1 -mconvert=raid1 /mnt- -dconvert: dataの変換先
- -mconvert: metadataの変換先(metadataだけで良ければ省略可)
注意: 変換はI/Oと時間がかかります。変換中に十分な空き領域が必要な場合があります。
障害発生時の対応(ドライブ故障の一般手順)
ドライブが故障した場合、まずはマウントをdegradedモードで行い、欠損デバイスを削除してファイルシステム整合性を保ちます。
- 劣化(degraded)でマウントする
sudo mount -o degraded /dev/sdb /mnt- 欠損デバイスを削除する
sudo btrfs device delete missing /mnt重要: RAID1やRAID10のような冗長構成でない場合、故障ドライブ上のデータは失われます。事前のバックアップが唯一の保険です。
復旧後は、新しいディスクを追加してリバランスを行い、冗長性を回復させます。
sudo btrfs device add /dev/sdf /mnt
sudo btrfs filesystem balance /mntデバイスを削除したい場合(安全な取り外し)
既存のBtrfsからデバイスを外すには:
sudo btrfs device delete /dev/sdc /mntこの操作は、削除対象デバイス上のデータを他デバイスへ移動するため時間がかかります。空き容量が不足すると失敗します。
自動マウント(/etc/fstab)の設定例
永続的にマウントするため、/etc/fstabにエントリを追加します。デバイスを複数指定することでマウント時に全デバイスを認識させられます。
基本例(HDD向け):
/dev/sdb /mnt btrfs device=/dev/sdb,device=/dev/sdc,device=/dev/sdd,device=/dev/sde 0 0SSD向けチューニング付き例:
/dev/sdb /mnt btrfs device=/dev/sdb,device=/dev/sdc,device=/dev/sdd,device=/dev/sde,noatime,compress=lzo,ssd,discard,space_cache,autodefrag,inode_cache 0 0注: 上記の/dev/sdbなどのデバイス名はシステム再起動やデバイスの入れ替えで変わる可能性があります。UUIDやLABELを使う方法も検討してください。例: UUID=xxxx /mnt btrfs ...。
マウントオプションの解説と推奨値
- compress=zlib / compress=lzo: 圧縮を有効にして容量とIOを節約します。zlibは高圧縮で速度は中、lzoは高速で圧縮率は中程度。SSDではlzoが一般的。
- autodefrag: 小さなランダム書き込みが多い場合に有効。ただし大きなファイル転送には余計な負荷になることがある。
- noatime: ファイルアクセス時刻の更新を抑え、IOを減らす。
- ssd: SSD特有の最適化フラグ。
- discard: TRIMを有効にする(SSD)。オンラインでのパフォーマンス影響を評価のこと。
- space_cache / nospace_cache: 古いbtrfsではspace_cacheを切り替えて使用。最近のバージョンでは
space_cache=v2が推奨されることがある。
推奨(HDDの大規模ストレージ):
compress-force=zlib,autodefrag,nospace_cache推奨(SSD):
noatime,compress=lzo,ssd,discard,space_cache,autodefrag,inode_cache容量計算の考え方(簡易ガイド)
物理容量: 1TB + 1TB + 500GB + 500GB = 3TB
- single(分散): 合計3TBが理論上は利用可能(冗長性なし)
- raid0(ストライプ): 合計3TB、冗長性なし(故障で全データ喪失)
- raid1(ミラー): 対象デバイスごとのミラーリングになるため、最小デバイス容量が制約になる。上記構成だと可用容量はおおむね500GB程度(Btrfsの割り当てルールに依存)。
- raid10: ミラーの組×ストライプで、例では理論上1.5TB前後の可用容量になることが多い。
注: BtrfsのRAIDアルゴリズムはデバイスの混在やチャンク割り当てにより実効値が複雑になるため、正確な数値は環境でbtrfs filesystem df /mnt等を確認してください。
いつBtrfsが向かないか(反例・限界)
- 最高の安定性や成熟度を最優先する大規模プロダクション環境(特に金融や医療などの厳密なSLAがある場合)は、検討が必要。ZFSや成熟したmdadm+LVMの組み合わせが選ばれる場合がある。
- 単一ドライブで単純に安定性を重視するだけならext4がより無難。
- 特定のワークロード(高頻度のメタデータ書き込みやデフラグが頻繁に発生するケース)では、適切なマウントオプションと運用が必要。
代替アプローチと比較(簡易)
- mdadm + LVM: 物理ボリュームの管理を細かく行いたい場合に強力。成熟度が高く商用サポートが豊富。
- ZFS: データ整合性、スナップショット、圧縮性能に優れるが、ライセンスやメモリ要件が重い。
- ext4 + LVM: シンプルで安定だが、BtrfsのようなサブボリュームやネイティブRAIDは持たない。
選び方のヒューリスティック: 実稼働の重要度(高)=ZFS/mdadm優先、柔軟性と機能を手軽に試したい=Btrfsが便利。
運用のためのSOP(標準作業手順書): デバイス追加の流れ
- 新しいディスクを物理的に取り付ける。
lsblkでデバイス名を確認。- 新ディスクを初期化(必要ならパーティション作成)
- 単純デバイスなら
sudo mkfs.btrfs /dev/sdf。
- 単純デバイスなら
- 既存マウントポイントへ追加:
sudo btrfs device add /dev/sdf /mnt。 - バランスを実行:
sudo btrfs filesystem balance /mnt。 btrfs filesystem df /mntでデータ/メタの状況を確認。- /etc/fstabを必要に応じて更新(UUIDを利用すること推奨)。
受け入れ基準:
- 追加後に
btrfs device list /mntで新デバイスが表示されること。 btrfs filesystem df /mntで空きが増えた/再分配が成功していること。
インシデントランブック(故障検知から回復まで)
- アラート/ログでディスク故障を検知(例: dmesgやsmartctl)。
- 直ちに該当デバイスをマークする:
sudo btrfs device delete missing /mnt(まずは劣化マウントでテスト)。 - 障害要因の診断(ケーブル/電源/コントローラなど)。
- 代替ディスクを用意して追加:
sudo btrfs device add /dev/sdf /mnt。 - データの再分配(バランス)と整合性確認:
sudo btrfs filesystem balance /mnt、btrfs scrub start /mnt。 - 完了後、監視アラートをリセットし、運用ログを残す。
注意: scrubはデータ整合性の検査を行うので時間がかかる。定期実行をスケジュールするとよい。
ロール別チェックリスト
システム管理者:
- バックアップ戦略があるか確認
- btrfs-progsとカーネルの互換性確認
- 定期的なscrubとbalanceのスケジュール化
デスクトップ/パワーユーザー:
- 重要なファイルはクラウド/外部にバックアップ
- SSDならcompress=lzo, noatimeなどを検討
開発者:
- テスト環境でBtrfsのRAID変換やsnapshotsを試してから本番へ適用
1行用語集
- バランス: Btrfsがチャンクを再配置してデバイス間でデータを均等化する処理。
- scrub: チェックサムに基づいてデータ整合性を検査する処理。
- チャンク: Btrfsがデータ/メタデータを割り当てる単位。
トラブルシューティングのよくあるケース
- マウントできない:
dmesgを見てブロックデバイスエラーを確認。degradedオプションでのマウントを試す。 - device delete が失敗する: ほかのデバイスに移動するための空き容量が不足している可能性。不要ファイルを削除して空きを作るか、新デバイスを追加してから再試行。
- パフォーマンスが悪い: マウントオプション(圧縮、autodefrag等)を調整。
iotopやiostatでI/Oボトルネックを特定。
運用ヒント(小ネタ)
- UUIDを使ったfstabエントリはデバイス名変動に安全。
- 定期的に
scrubを実行して早期に劣化を検知する。例:sudo btrfs scrub start -Bd /mnt(ブロックしないデタッチモードなどオプション確認)。 - 大きなバランスはサーバ負荷を高めるため、夜間バッチでスケジュールする。
まとめ
Btrfsは複数ドライブを1つのプールとして扱いながら、ミラーリングや分散配置をファイルシステム層で柔軟に設定できる非常に強力なツールです。初期設定や変換、障害対応には注意が必要ですが、正しい運用手順とバックアップポリシーを用意すれば個人用途や小規模サーバには実用的です。
最後に、実運用で使う前に必ずステージング環境でコマンド(mkfs.btrfs、device add/delete、balance、scrubなど)を試し、期待する動作や容量割り当てを確認してください。
お試しになった結果や質問があればコメントで共有してください。
Image Credit: William Hook