bokumin.org

Github

btrfsとOpenSUSEでRAIDを構築する(RAID1 RAID0 RAID10)

Simple RAID Configuration with btrfs on openSUSE

 

はじめに

 

btrfsファイルシステムを使ったRAIDを構築する方法について、備忘録として残します。
この方法は、従来のmdadmを使ったRAID構成と比べてかなり簡単に、制約なども少なく実現できるので参考になれば幸いです。
今回はRAID1をメインに、最後に、RAID0・RAID10(1+0)についても触れていきます。
※安全のため、バックアップを行ってから作業を進めるようにしてください。

簡単なRAIDの説明は以下で確認ができます。

 

RAID0 RAID1 RAID10とは

 

RAID0 (ストライピング)
2台以上のHDDがあれば作成が可能。冗長性はないが、容量効率100%(500GB×2台なら1TB)で読み書き速度が向上する。片方が壊れたら動かなくはなるが、一時作業用や、動画編集などの作業領域に割り当てる用途なら有効なRAIDレベル

RAID1(ミラーリング)
複数のディスクに同じデータを書き込むという方式。読み込みは複数のディスクから行うため、若干速度が向上するが、容量効率が50%なのと、両方のディスクに書き込むため、単体よりも書込み速度が遅いというデメリットがある。

RAID10(RAID1+0)
RAID1とRAID0の組み合わせ。最低4台以上のディスクが必要だが、お互いの短所を補ったような構成になっている(冗長性+高速)。容量効率はRAID1と同じ50%だが、データの安全性を保ちながら高速な読み書きができる。

 

 

実行環境

 

  • OS: openSUSE Tumbleweed (Kernel 6.17.0-2-default)
  • ストレージ: Seagate ST500LM000-1EJ162 × 2台 (各465.8GB)

 

HDD2台の構成はこんな感じです。sdaは既にbtrfsで作成したルートディレクトリで、稼働中のものです。
sdbは空のHDDで、これからRAIDを組むために設置しました。

 

bokucipi@Tomoko:~> lsblk
NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
sda      8:0    0 465.8G  0 disk 
├─sda1   8:1    0     8M  0 part 
└─sda2   8:2    0 465.8G  0 part /usr/local
                                 /srv
                                 /root
                                 /opt
                                 /boot/grub2/i386-pc
                                 /boot/grub2/x86_64-efi
                                 /.snapshots
                                 /
sdb      8:16   0 465.8G  0 disk 

 

RAID1構築手順

 

現在稼働中のsdaに、sdbを追加する形でRAID1を構成していきます。
まず、稼働中のシステムディスク(sda)の構成を確認します。

 

sudo fdisk -l /dev/sda
Device     Start       End   Sectors   Size Type
/dev/sda1   2048     18431     16384     8M BIOS boot
/dev/sda2  18432 976773134 976754703 465.8G Linux filesystem

 

私の環境では、ブートパーティションとbtrfsルート領域といった構成になっています。

 

次に、新しいディスク(sdb)に同じパーティション構成を作成していきます。
ブートパーティションの作成は必須ではありません。起動も冗長化したい場合は、以下の手順を実行してください。起動の冗長化が不要な場合は、sdb全体を1つのパーティションにして構いません。

 

sudo fdisk /dev/sdb
# fdiskでの操作

g          # GPTパーティションテーブルを作成
n          # パーティション1を作成
[Enter]    # パーティション番号 (1)
[Enter]    # 開始セクタ (デフォルト)
+8M        # サイズ 8MB
t          # タイプ変更
4          # BIOS boot

n          # パーティション2を作成
[Enter]    # パーティション番号 (2)
[Enter]    # 開始セクタ (デフォルト)
[Enter]    # 終了セクタ (ディスク全体)

w          # 書き込んで終了

 

パーティション作成後、lsblkなどで確認します。

 

lsblk
NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
sda      8:0    0 465.8G  0 disk 
├─sda1   8:1    0     8M  0 part 
└─sda2   8:2    0 465.8G  0 part /usr/local
                                 /srv
                                 /root
                                 /opt
                                 /boot/grub2/i386-pc
                                 /boot/grub2/x86_64-efi
                                 /.snapshots
                                 /
sdb      8:16   0 465.8G  0 disk 
├─sdb1   8:17   0     8M  0 part 
└─sdb2   8:18   0 465.8G  0 part 

 

sdaと同じになっていますので、次にbtrfsファイルシステムをディスクに追加していきます。

 

sudo btrfs device add /dev/sdb2 /

 

データ(sda2)とメタデータ(sdb2)をRAID1に変換します。

 

sudo btrfs balance start -dconvert=raid1 -mconvert=raid1 /

 

-dconvertはデータ、-mconvertはメタデータとなっています。それぞれRAID1に配置します。
この処理には少し時間がかかりますが、システムは通常通り使用可能なので、topコマンドなどでちょくちょく確認しつつ見守りましょう。

 

無事にコマンドが終了したら、確認作業を行っていきます。

 

sudo btrfs filesystem usage /
Overall:
    Device size:                 931.51GiB
    Device allocated:            168.06GiB
    Device unallocated:          763.44GiB
    Device missing:                  0.00B
    Device slack:                  3.50KiB
    Used:                        164.31GiB
    Free (estimated):            383.38GiB      (min: 383.38GiB)
    Free (statfs, df):           383.38GiB
    Data ratio:                       2.00
    Metadata ratio:                   2.00
    Global reserve:              223.58MiB      (used: 0.00B)
    Multiple profiles:                  no

Data,RAID1: Size:78.00GiB, Used:76.34GiB (97.88%)
   /dev/sda2      78.00GiB
   /dev/sdb2      78.00GiB

Metadata,RAID1: Size:6.00GiB, Used:5.81GiB (96.89%)
   /dev/sda2       6.00GiB
   /dev/sdb2       6.00GiB

System,RAID1: Size:32.00MiB, Used:16.00KiB (0.05%)
   /dev/sda2      32.00MiB
   /dev/sdb2      32.00MiB

Unallocated:
   /dev/sda2     381.72GiB
   /dev/sdb2     381.72GiB

 

データ、メタデータ、システムがRAID1になっていることを確認してください。
次にエラーがないか、デバイスの統計情報も確認していきます

 

sudo btrfs device stats /
[/dev/sda2].write_io_errs    0
[/dev/sda2].read_io_errs     0
[/dev/sda2].flush_io_errs    0
[/dev/sda2].corruption_errs  0
[/dev/sda2].generation_errs  0
[/dev/sdb2].write_io_errs    0
[/dev/sdb2].read_io_errs     0
[/dev/sdb2].flush_io_errs    0
[/dev/sdb2].corruption_errs  0
[/dev/sdb2].generation_errs  0

 

すべてのエラーカウンタが0の場合、正常です。RAID1の作成が完了です。

 

両方のディスクから起動可能にする

 

RAID1を構築する理由の一つは、一方のディスクが故障してももう片方から起動できるようにすることです。両方のディスクにGRUBをインストールして、どちらからも起動できるようにします。

 

sudo grub2-install /dev/sda
sudo grub2-install /dev/sdb
sudo grub2-mkconfig -o /boot/grub2/grub.cfg

 

一度PCの電源を切って、sdaを取り外し、sdbだけでも起動ができるかなどチェックをしてみてください。BIOS上で起動順序などの設定が必要になるかもしれません。

 

RAID0・RAID10(1+0)構成手順

 

btrfsはその他のRAIDレベルにも対応しています。2025年現在、推奨されているRAID0・RAID10のRAIDレベルについての構成手順について触れていきます。

 

RAID0(ストライピング)

 

今回は動画編集作業に使っている/media/movie(sdc)に、sddを追加するという想定でRAID0を作成していきます。
※RAID0の場合、起動の冗長化は意味がありません(1台故障で全データ消失するため)。そのため、sddにはブートパーティションを作成せず、全体をデータ用に使います。

 

# sddにパーティションを作成
sudo fdisk /dev/sdd

# fdisk
g          # GPTパーティションテーブル作成
n          # 新しいパーティション
[Enter]    # パーティション番号 (1)
[Enter]    # 開始セクタ (デフォルト)
[Enter]    # 終了セクタ (ディスク全体)
w          # 書き込んで終了

# sdd1をbtrfsファイルシステムに追加
sudo btrfs device add /dev/sdd1 /media/movie

# RAID0に変換
sudo btrfs balance start -dconvert=raid0 -mconvert=raid0 /media/movie

# 進行状況の確認
sudo btrfs balance status /media/movie

 

RAID10(RAID1+0)

 

sdaとsdbで既にRAID1を構築済みとします。RAID1の構築が済んでいない場合は、この記事の前半を参照してください。
RAID10の場合は、起動を冗長化する場合、それぞれのディスクにブートパーティションを作成したほうがいいので、今回はそのようにしています。つまり、複数台が同時に故障しても(RAID10の許容範囲内なら)起動可能ということです。

 

sudo grub2-install /dev/sdc
sudo grub2-install /dev/sdd
sudo grub2-mkconfig -o /boot/grub2/grub.cfg

 

実際にRAID10を構築していきます。
sdc、sddにsdaと同じパーティション構成を作成します。

 

sudo btrfs device add /dev/sdc2 /
sudo btrfs device add /dev/sdd2 /
sudo btrfs balance start -dconvert=raid10 -mconvert=raid10 /

 

以上、RAID構成の作成方法でした。

 

困った時に

 

バランス処理が途中で止まった場合は以下のコマンドを行います

 

# 再開
sudo btrfs balance resume /

# キャンセル
sudo btrfs balance cancel /

 

ディスクが故障した場合は以下のコマンドを使います(RAID1の場合)

 

# 故障ディスクを削除
sudo btrfs device delete missing /

# 新しいディスクを追加
sudo btrfs device add /dev/sdb2 /

# RAID1に再構成
sudo btrfs balance start -dconvert=raid1 -mconvert=raid1 /

 

おわりに

 

btrfs RAIDは、btrfs自体にRAIDが組み込まれているため、今までbtrfsで使われていた環境などで、後からでも変更可能で、コマンド数行で実装ができるという特徴があります。スナップショットがこれらにも適用されるため、バックアップも容易なので気軽にRAIDを試すことが可能です。
ただ、btrfsのRAID5/6には既知の問題(write hole問題)があり、データ損失のリスクがあります。2025年現在も本番環境での使用は推奨されていないので注意が必要です。

 


個人的には、用途に応じてRAIDレベルを使い分けるのがおすすめです。 例えば、システム領域やドキュメントなど重要なデータはRAID1で冗長性を確保し、動画編集の作業領域など一時的なデータはRAID0で高速化するといった使い方です。btrfsなら同じシステム内で複数のRAIDレベルを共存させられるため、適材適所でRAIDを組み合わせることができます。

 

RAIDを試してみたい方がおられましたら、まずはRAID0やRAID1あたりから始めて、自分の使い方に合った構成を見つけてみてください。以上、btrfsでRAIDを組むのは結構簡単だよというお話でした。参考になれば幸いです。

 

おわり