2008/05/22(木)Linuxでmdadmを使ったソフトウェアRAIDの構築・管理メモ

Linux(Ubuntu 10.04 LTS Server)で mdadm を使用してソフトウェアRAIDを構築・管理する方法について述べます。特に既に稼働中のLinuxにHDDを追加してあとからRAID1を構築する方法を述べます。

概念

LinuxのソフトウェアRAIDは、複数の実体デバイス(/dev/sda?等)をまとめあげて、1つの仮想デバイス(/dev/md?)として見せる仕組みです。

  • /dev/sda? 等の実体デバイスは、パーティーションタイプを0xfd(Linux raid 自動検出)にする。
  • パーティーションを単位としてRAID化するため、極端な話、同一デバイス内でもRAIDにできる。*1

*1 : もちろん、意味はほとんどない

デバイスの作成

※この項はUbuntu8.04時代のものです。最近のLinuxでは不要なので読み飛ばしてください。

mknod でデバイスを作成します。

# mknod /dev/md0 b 9 0
# mknod /dev/md1 b 9 1
# mknod /dev/md2 b 9 2

b はブロック型デバイスを示します。9はデバイスドライバ番号ですが、RAIDの場合は"9"になります。0, 1 といった数字はマイナーデバイス番号なのですが、パーティーション番号(に相当するもの)と同じ値を指定してください。

RAIDの作成

最初から構築するのならさほど難しくないので、既に動作中のLinuxをRAIDに移行することを考えます。

現在動作中のHDDをsda、新規追加しミラー化するHDDをsdbとします。この場合、sdb単独でRAIDを構築し、そこにsdaからデータをコピー(cp -Rp)してから、sdaの領域を開放し、sdaのパーティションを切り直してRAIDアレイに追加するという手順を取ります。

まず /dev/sdb にパーティションを構築してください。

  • / /usr /var など、実パーティションに対応するよう(任意に)決定します。
  • パーティションタイプはすべて 0xfd にしてください。

sdb単独でRAIDを構成します。デバイス1個ではRAIDの構築に失敗するため、正常なディスクと壊れたディスクの2台によるRAIDという指定を行います。なお、sda1/sdb1をmd1に対応させたいので、md0は使用しないで構成しました。

# mdadm --create /dev/md1 --level=1 --raid-devices=2 missing /dev/sdb1
# mdadm --create /dev/md2 --level=1 --raid-devices=2 missing /dev/sdb2
# mdadm --create /dev/md3 --level=1 --raid-devices=2 missing /dev/sdb3

構築したRAIDの設定を保存しておきます。

# mdadm --detail --scan >> /etc/mdadm/mdadm.conf

ファイルシステムを作成します。

# mkfs.ext3 -f /dev/md?
# mkfs.ext3 -f /dev/md?
# mkswap /dev/md?

ここまで終わると、md? をファイルシステムとしてマウントできるようになります。

旧システムからコピーする場合は、シングルユーザモードに落ちて適当に mount し cp するとよいでしょう。あとはHDDを入れ替える要領で fstab は適切に書き換えてください。fstab変更後にgrubを更新します。Ubuntu/Debianの場合は次のコマンドです。

# update-grub

無事コピーし、RAIDデバイスにより起動できるようになったら、sdaの領域を開放し、sdaのパーティションを切り直します。/dev/sdb のパーティションとまったく同じように切るとよいでしょう(0xfdにするのを忘れず)。

その後、新しいドライブをRAIDに参加させます。

# mdadm --add /dev/md1 /dev/sda1
# mdadm --add /dev/md2 /dev/sda2
:

fstabなどを適切に設定します。UUIDを使う場合は次の方法で調べます。

blkid /dev/sda1
ls -l /dev/disk/by-uuid

まだ再起動させてはいけません。

GRUBの設定(Ubuntu/Debianの場合)

起動デバイス情報が書き換わっているので、grubを再設定する必要があります。GRUBはおそらく /dev/sda のみにインストールされる設定になっているのでこれを変更します。

# dpkg-reconfigure grub-pc

ここで、/dev/sda /dev/sdbの両方にインストールするよう設定してください。設定が終わると自動で2つのディスクに grub がインストールされます。

mdadm.confとinitramfsの設定

Linux2.6以降では、mdadm --create /dev/md* で指定したのと同じデバイス番号で認識するとは限りません。また標準では /dev/md/* にエイリアスが作られここから参照することを推奨されます。

RAIDデバイスを/dev/md*として扱いたい場合これでは面倒なので、mdadm.confに情報を記録します。既に示した

# mdadm --detail --scan>>/etc/mdadm/mdadm.conf

が、そのための措置それです。mdadm.confは必ず手動で確認し、現在の構成と一致しているか確認してください。


mdadm.confにARRAYの設定が1つでもある場合、記述されたARRAYに構成情報と一致しないデバイスやそもそも記述されないデバイスはカーネル起動時にRAIDデバイスとして認識しません。ARRAYの設定が1つもない場合は、パーティションタイプfdになっているデバイスはすべて認識されます。

mdadm.conf はinitramfsに含まれますので、mdadm.confを書き換えたら initrd.img を更新します。Ubuntu/Debianでは次のコマンドです。

# update-initramfs -u

RAIDの構成情報を変更した場合(mdadm --detail -sで表示されるUUIDが変更された場合)は、必ずmdadm.confを適切に書き換えinitrdを再生成することを忘れないでください。initramfs内のmdadm.confには既にARRAYの記述があるので、構成情報が異なる新たなRAIDデバイスを認識しなくなります。


また、この種のややこしい問題を避けたければmdadmにはARRAYの情報を書かないことです。mdデバイス名の変わることもありますが、すべてをUUIDやLABELで処理すれば問題はありませんし、それで済むならその方が良いかもしれません。


※initramfsで認識したRAIDデバイスは「Begin: Mounting root file system...」よりも前に、通常のファイルシステムの/etc/mdadm/mdadm.confを参照して認識したデバイスはこの表示より後に出力されます。initramfs等の詳細はLinux起動シーケンスについての記事を参考にしてください。

RAIDの管理

  • 状態の確認
    # cat /proc/mdstat
    # mdadm --detail --scan
    # mdadm --detail -s
    # mdadm --detail /dev/md1
    
  • RADIデバイスの作成
    # mdadm --create /dev/md1 --level=1 --raid-devices=2 missing /dev/sdb1
    # mdadm --create /dev/md1 -l1 -n2 missing /dev/sdb1
    
  • RAIDからデバイスを切り離し(非アクティブに)
    # mdadm --fail /dev/md1 /dev/sda1
    # mdadm -f /dev/md1 /dev/sda1
    
  • RAIDからデバイスを取り除く(--fail後のみ実行可能)
    # mdadm --remove /dev/md1 /dev/sda1
    # mdadm -r /dev/md1 /dev/sda1
    
  • RAIDにデバイスを加える
    # mdadm --add /dev/md1 /dev/sdb1
    
  • アクティブなデバイス数の変更(RAID0, RAID1のみ)
    # mdadm --grow /dev/md1 --raid-devices=2
    
  • RAIDの停止(削除)
    # mdadm --stop /dev/md1
    # mdadm -S /dev/md1
    

参考になるサイト