俺#

新潟市でIT業を営むおっさんのブログ。

LinuxのソフトウェアRAIDを使ってみる

http://www.novac.co.jp/products/hardware/nv-hd/nv-hs401u/index.html
http://www.wdc.com/jp/products/products.asp?driveid=338&language=jp
http://vinelinux.org/

自宅にSubversionのサーバが欲しくなった。高信頼かつ容量のあるストレージが必要なので、USB接続の外付けケースとLinuxソフトウェアRAIDを使って構築することにした。ついでにサーバ機そのものも更新。

500GBのHDD4台とNOVACの「4台はい〜る」USB接続HDDケース。HDDは回転数を落として電力を節約してくれるウェスタンデジタルのやつで、4台で3万円ちょい。安っ。ケースはスチール筐体でファンも静かだし良い感じ。付属のガイドレールがちょっと安っぽいけど、予備がついてたのはエライと思った。予備のHDDをレール付きでスタンバイできる。

ケースにHDDを差し込んだところ。ケースには任意の台数を結合して1台に見せる機能があるけど、OS側でRAIDを構築するの全てのディスクが別々に見えるモードで使う。

Windowsで認識されてるかチェック。問題なさげ。

これが新しいサーバ機。新しいとは言っても、CPUはSocketASempron 2600+だったりする訳だが。我が家ではこれは新しいほうなんですよーだ。

OSはVineLinux4.2に決定。イマドキのLinuxは起動ドライブのRAID化も無線LANもサクっと設定できてラクチン。起動ディスクは40GBのSATA HDD2台をRAID1(/及び/boot)とRAID0(swap)の混合で設定してみた。swapがRAID0だと片方HDDが死んだ時にswapを使わないように設定しないと起動しないかも...と後から思ったけど、なんとかなるでしょう(^^;

いよいよUSB接続のHDDでRAID5を構成する。手順は判ってしまえば簡単。

・既に「/dev/md0」「/dev/md1」「/dev/md2」のRAIDドライブが存在する。
・USBのHDDは「/dev/sdc」「/dev/sdd」「/dev/sde」「/dev/sdf」として認識されている。

というのが以下の例の前提。

1)fdiskでパーティションを作る。

[root@fuga root]# fdisk /dev/sdc
コマンド (m でヘルプ): n
コマンドアクション
e 拡張
p 基本領域 (1-4)
p
領域番号 (1-4): 1
最初 シリンダ (1-60801, default 1):
Using default value 1
終点 シリンダ または +サイズ または +サイズM または +サイズK (1-60801, default 60801):
Using default value 60801

コマンド (m でヘルプ): t
Selected partition 1
16進数コード (L コマンドでコードリスト表示): fd
領域のシステムタイプを 1 から fd (Linux raid 自動検出) に変更しました

コマンド (m でヘルプ): w
領域テーブルは交換されました!

ioctl() を呼び出して領域テーブルを再読込みします。
ディスクを同期させます。
[root@fuga root]#

4ドライブとも行う。システムタイプをfdにするのがRAIDを組むときのポイント。今回は全領域を使用したけど、パーティションを分割すれば一部だけ非RAIDにするとか、半分がRAID1で半分がRAID0とか自由にできるわけですな。分割する場合、RAIDで組み合わせるパーティション同士のシリンダ数を合わせれば良いはず。

2)デバイススペシャルファイルを作る

[root@fuga root]# file /dev/md0
/dev/md0: block special (9/0)
[root@fuga root]# file /dev/md1
/dev/md1: block special (9/1)
[root@fuga root]# file /dev/md2
/dev/md2: block special (9/2)
[root@fuga root]# file /dev/md3
/dev/md3: cannot open (/dev/md3)
[root@fuga root]# mknod /dev/md3 b 9 3
[root@fuga root]#

/dev/md3が存在しなかったので。メジャー番号とマイナー番号についてはどのような理由で上記の値になってるのか理解してないけど、上記の様に「既存のスペシャルファイルの中を見てそれに倣えばOK」と海外の掲示板に書いてあったのでそうしてみた。とりあえずは、うまく動いてるみたい(^^;

3)RAIDの構築を開始する

[root@fuga root]# mdadm --create /dev/md3 --level=5 --raid-devices=4 --force /dev/sdc1 /dev/sdd1 /dev/sde1 /dev/sdf1
[root@fuga root]#

すぐ終わるけど、バックグラウンドで頑張り始めただけなので「終わった」とか思わないように。

4)構築状態を確認する

方法その1:

[root@fuga root]# cat /proc/mdstat
Personalities : [raid0] [raid1] [raid5] [raid4]
md3 : active raid5 sdf1[3] sde1[2] sdd1[1] sdc1[0]
1465151808 blocks level 5, 64k chunk, algorithm 2 [4/4] [UUUU]
[>....................] resync = 0.3% (1804208/488383936) finish=1085.1min speed=7472K/sec

md1 : active raid0 sdb2[0] sda2[1]
2104320 blocks 256k chunks

md2 : active raid1 sdb3[0] sda3[1]
37921344 blocks [2/2] [UU]

md0 : active raid1 sdb1[0] sda1[1]
104320 blocks [2/2] [UU]

unused devices:
[root@fuga root]#

方法その2:

[root@fuga root]# mdadm -D /dev/md3
/dev/md3:
Version : 00.90.03
Creation Time : Sat Apr 5 23:30:12 2008
Raid Level : raid5
Array Size : 1465151808 (1397.28 GiB 1500.32 GB)
Device Size : 488383936 (465.76 GiB 500.11 GB)
Raid Devices : 4
Total Devices : 4
Preferred Minor : 3
Persistence : Superblock is persistent

Update Time : Sat Apr 5 23:30:12 2008
State : clean, resyncing
Active Devices : 4
Working Devices : 4
Failed Devices : 0
Spare Devices : 0

Layout : left-symmetric
Chunk Size : 64K

Rebuild Status : 0% complete

UUID : 13a7deba:e2437e40:de0ec659:b884c81e
Events : 0.1

Number Major Minor RaidDevice State
0 8 33 0 active sync /dev/sdc1
1 8 49 1 active sync /dev/sdd1
2 8 65 2 active sync /dev/sde1
3 8 81 3 active sync /dev/sdf1
[root@fuga root]#

あと1085.1分かかるって。一瞬ケタが違うかと思った。18時間ですか...orz。els氏曰く「そんなもんじゃない?」とのこと。USB接続だし、容量もでかいからなぁ。

5)ファイルシステムを作成する

[root@fuga root]# mkfs -t ext3 /dev/md3
mke2fs 1.38 (30-Jun-2005)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
183156736 inodes, 366287952 blocks
18314397 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=369098752
11179 block groups
32768 blocks per group, 32768 fragments per group
16384 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968,
102400000, 214990848

Writing inode tables: 340/11179

これもそれなりに時間がかかる。「340/11179」の部分は、カウントアップがリニアではない&十数秒に1回更新なので「固まった!」とか思わないように。

8)/etc/mdadm.confを更新(作成)する

[root@fuga raid]# echo "DEVICE partitions" > /etc/mdadm.conf
[root@fuga raid]# echo "MAILADDR メールアドレス" >> /etc/mdadm.conf
[root@fuga raid]# mdadm -D --scan >> /etc/mdadm.conf
[root@fuga raid]# more /etc/mdadm.conf
DEVICE partitions
MAILADDR メールアドレス
ARRAY /dev/md0 level=raid1 num-devices=2 UUID=d815f676:8d77522a:6b926474:d5302f42
ARRAY /dev/md2 level=raid1 num-devices=2 UUID=a18ffba5:94e6745b:8a444883:d13e45c0
ARRAY /dev/md1 level=raid0 num-devices=2 UUID=885acefa:a81b0f6b:94489d4b:3b74ea63
ARRAY /dev/md3 level=raid5 num-devices=4 UUID=13a7deba:e2437e40:de0ec659:b884c81e
[root@fuga raid]#

「MAILADDR」を指定しておくとRAIDに異常は発生した時にメールが飛んでくる。重要機能なのでpostfixの設定をしたら試してみたい。起動ドライブがRAIDでない場合は「mdadm.conf」は存在しないかもしれないけど、上書きしちゃうので手順は同じですな。

7)マウントする

[root@fuga root]# mkdir /mnt/raid
[root@fuga root]# mount /dev/md3 /mnt/raid/
[root@fuga root]# df
・ユ・。・、・・キ・ケ・ニ・・ 1K-・ヨ・?テ・ッ サネヘム カ�ュ サネヘム% ・゙・ヲ・�ネーフテヨ
/dev/md2 37326072 1975860 33454148 6% /
/dev/md0 101018 8916 86886 10% /boot
none 777300 0 777300 0% /dev/shm
/dev/md3 1442161020 209056 1368694376 1% /mnt/raid
[root@fuga root]#

文字化け失礼。VineはデフォルトがEUC-JPなんだけど、ターミナルの設定がUTF-8のままで作業してた。ついに/mnt/raidに1.5TBの巨大な領域が登場しましたよ。うわわーい。

8)/etc/fstabに行を追加したくなる

/dev/md3 /mnt/raid ext3 defaults 0 2

起動時に自動的にマウントさせるために上記を書きたくなるところだけど、USB接続デバイスの場合は不可なのだった。ブート時に「RAIDの検出」→「USBデバイスの検出」の順に処理が行われるので、「/dev/md3が使えねえョ!」とか言われてしまう。fstabには手をつけず、/etc/rc.localに以下を記述してあげるのが良い。

/sbin/mdadm --assemble --scan
/bin/mount -t ext3 /dev/md3 /mnt/raid/

/mnt/raid/○○とかをSambaで共有させたので、再起動時にSambaが起動しなくなるというトラブルを期待したのだが、Sambaは公開ディレクトリが存在しなくてもゴネることなく起動してくれるようだ。

異常通知メールの試験もしたいので、postfix等の設定が終わったらRAIDの再構築手順を整理する予定。

[追記]

Linux2.6のスペシャルファイルのメジャー番号、マイナー番号について。

http://i-red.info/docs/jfp/devices.txt

バイスによって全部決め打ちなのね。/dev/md3は「9」「3」で正しいらしい。mdは「meta disk」の略か。ナルホドねぇ。