linuxのmdadmで作ったRAID5を壊したり直したり。

うちのサーバーのHDDを増設するタイミングでソフトウェアRAIDとか試してみようかと思ったりして。 という訳で色々実験。の、記録です。

ZFSを試した時の記事(重複排除編データ圧縮編)も御覧ください。

インストール

仮想環境のubuntuでテストします。

というわけで、apt-getで

$ sudo apt-get install mdadm

以上。

HDDを準備する

仮想ディスク一本だけ使ってテストします。ちゃんと何本も用意してもいいのだけれど、面倒くさいじゃん? 作ったのは1GBのHDD。どんだけレガシーなんだか。

とりあえずパーティションを切ります。 今回はRAID5を試すので、最低3つ必要。という訳で3つに分けます。

で、分けたもののパーティションタイプをLinux raid 自動検出とやらに変更します。

$ sudo fdisk /dev/sdb
コマンド (m でヘルプ): t
パーティション番号 (1-4): 1
16進数コード (L コマンドでコードリスト表示): fd
パーティションのシステムタイプを 1 から fd (Linux raid 自動検出) に変更しました

こんな感じで設定できます。 他のパーティションにも同じ設定をしてください。

RAID5を構築する。

$ sudo mdadm --create /dev/md1 --level=5 --raid-devices=3 /dev/sdb1 /dev/sdb2 /dev/sdb3

作っていいですか? みたいなことを聞かれるので、yって答えれば完成。 これだけで作れちゃう。簡単。

$ sudo mdadm --detail /dev/md1

ってやると、構築したRAIDについての情報を見る事ができます。

完成した/dev/md1ってのは

$ sudo mkfs.ext4 /dev/md1

みたいにしてファイルシステムを作れば、あとは普通にマウントして使えます。

試してみる

いつも通り

$ sudo mount /dev/md1 /mnt/test/
こんな感じでマウント。

3台のディスクで作ったなら、2台分の容量になっているはず。

``` shell
$ sudo echo "hello, raid" > /mnt/test/test.txt

書き込めることを確認しときましょう。

故障をシミュレーションしてみる。

$ sudo mdadm --fail /dev/md1 /dev/sdb1

のようにすると、故障をシミュレーションできるらしい。

$ sudo mdadm --detail /dev/md1

- 省略 - 

Number   Major   Minor   RaidDevice State
   0       0        0        0      removed
   1       8       18        1      active sync   /dev/sdb2
   3       8       19        2      active sync   /dev/sdb3

   0       8       17        -      faulty spare   /dev/sdb1

おー、一台壊れてる。

$ sudo cat /mnt/test/test.txt
hello, raid

でもちゃんと見れる。素晴らしい。

で、修理。

$ sudo mdadm --remove /dev/md1 /dev/sdb1
mdadm: hot removed /dev/sdb1 from /dev/md1

切断して、ディスクを交換。

$ sudo mdadm --add /dev/md1 /dev/sdb1
mdadm: added /dev/sdb1

ディスクをRAIDに組み込む。

確認。

$ sudo mdadm --detail /dev/md1

- 省略 -

Number   Major   Minor   RaidDevice State
   4       8       17        0      active sync   /dev/sdb1
   1       8       18        1      active sync   /dev/sdb2
   3       8       19        2      active sync   /dev/sdb3

おお、直った。

手が滑った。

$ sudo rm /dev/sdb1

おっと。

確認してみる。

# mdadm --detail /dev/md1

- 省略 -

Number   Major   Minor   RaidDevice State
   4       8       17        0      active sync
   1       8       18        1      active sync   /dev/sdb2
   3       8       19        2      active sync   /dev/sdb3
   5       8       20        3      active sync   /dev/sdb4

おや? なんだこれ。

$ sudo mdadm --monitor --syslog --oneshot /dev/md1 --mail=root

うん、特に何も起こらない。

消した場合だけじゃなくて、乱数で埋めちゃった場合でも同じような状況みたい。 もっと悪いことに、乱数だの0だので埋めた場合は--detailしても見た目が変わらない。 モニターもちゃんと動いてないっぽい。 よく分からない。postfixの設定が適当すぎたのが原因かな?

ま、諦めて再構築しようか。

$ sudo mdadm --remove /dev/md1 /dev/sdb1
mdadm: cannot find /dev/sdb1: No such file or directory

おや?

$ sudo mdadm --remove /dev/md1 sdb1
mdadm: hot remove failed for sdb1: Device or resource busy

おやおや?

$ sudo mdadm --fail /dev/md1 sdb1
mdadm: set sdb1 faulty in /dev/md1
$ sudo mdadm --remove /dev/md1 sdb1
mdadm: hot removed sdb1 from /dev/md1

お、消せた。

$ sudo mdadm --detail /dev/md1

- 省略 -

Number   Major   Minor   RaidDevice State
   0       0        0        0      removed
   1       8       18        1      active sync   /dev/sdb2
   3       8       19        2      active sync   /dev/sdb3
   5       8       20        3      active sync   /dev/sdb4

消えた消えた。

ディスクを追加する

なんと一度作ったものにあとからディスクを追加したり出来るらしい。

$ sudo mdadm --add /dev/md1 /dev/sdb4
mdadm: added /dev/sdb4

新しいディスクを追加して

$ sudo mdadm --detail /dev/md1

- 省略 -

Number   Major   Minor   RaidDevice State
   4       8       17        0      active sync   /dev/sdb1
   1       8       18        1      active sync   /dev/sdb2
   3       8       19        2      active sync   /dev/sdb3

   5       8       20        -      spare   /dev/sdb4

スペアになってる。

構成を変更して

$ sudo mdadm --grow
mdadm: Need to backup 3072K of critical section..

アンマウントして、ファイルシステムをリサイズ

$ sudo umount /mnt/test/
$ sudo resize2fs -f /dev/md1
resize2fs 1.42.8 (20-Jun-2013)
Resizing the filesystem on /dev/md1 to 35328 (1k) blocks.
The filesystem on /dev/md1 is now 35328 blocks long.
$ sudo mount /dev/md1 /mnt/test/

dfコマンドとかで確認してみると、容量が増えているのが分かるはず。

ちなみに、resize2fsするときにPlease run 'e2fsck -f /dev/md1' first.って怒られた場合は、素直に

$ sudo  e2fsck -f /dev/md1

ってやってからやり直せば問題ないようです。


テストするためにpostfixが必須ってのが頂けないけれど、それに目をつむれば悪くない感じ。色々簡単っぽいし。 シェルスクリプトだけでテスト出来るようになればいいんだけれどねー・・・。諦めてpostfixの設定をしろってことなのだろうか。

参考: