これは備忘録であり解説ではありません

ハードディスクをがっつりつける

いつものようにIDEにハードディスクを載せてDebian etchをインストールした 後、手元にあったSATA HDDを4つほど載せてみた。160GBが2つと320GBが2つで ある。せっかくなのでraid6を作ろうと考え、さっそくやってみた。

RAID6とは

raid6はraid5の欠点を補うためにさらにパリティを二重に取る。それでraid5 よりもさらに安全となる。raid5は2つ故障するとアウトである。そのため2つ 同時に故障する状態にならないようにスペアディスクを用意する。1つ故障し た瞬間にスペアディスクを使うために再構築が自動的に始まる。ただし、自分 の経験としてはスペアディスクを使っての自動構築の場面に出くわしたことが ないので本当に動いてくれるのか?と思ってはいるが。

ハードディスクがまったく同時に2つ死ぬということは、あまり考えたくもな いし、たぶん、そうそうないだろう(と、信じたい)。しかし、しかし、 raid5で故障時、リカバリー途中にあと1つが故障するとアウトで状況でもう一 個死ぬというのは、なんとなくありえそうだ。 なぜならばコンピュータは人が困るという状況を感知して、自動的に壊れるメ カニズムを持っているのである。 なぜならば、初期故障は別として、似たような環境におかれている似たような ハードウェア(機械)は、似たような頃に似たような理由が原因で故障する、 というのはありがちだからだ。もちろんHDDだけが特別ということはないはず である。

その点raid6は2つ同時に故障しても、まだ生き残ることができる。障害を 起こしていても動いている間にせっせとバックアップを取り、新しいハードディ スクにチェンジしていく時間が稼げる(ホントかな?)。

Debian GNU/Linux etchで採用しているカーネルはraid6をサポートしているの でraid5 + スペアディスクよりも、raid6を当然使う。

作業

パーティションの準備

160GBと320GBのHDDが混在しているので、すべての領域をraid6とすることはで きない。raid6とするため160GBの領域をそろえる。320GBで余った部分もraid1 として利用する。端数が出るか、それはswapで使うことにする。

パーティションをどう割るか

partitionの割り振りはこんな感じである。

HDDRaid6Raid1swap
sda 160GBsda1(160GB) sda2(あまり)
sdb 160GBsdb1(160GB) sdb2(あまり)
sdc 320GBsdc1(160GB)sdc2 (160GB)sdc3(あまり)
sdd 320GBsdd1(160GB)sdd2 (160GB)sdd3(あまり)

パーティション結果

参考
fd  linux auto raid
82  linux swap
83  linux file system

# fdisk -l /dev/sd[abcd]

Disk /dev/sda: 164.6 GB, 164696555520 bytes
255 heads, 63 sectors/track, 20023 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1               1       19453   156256191   fd  Linux raid autodetect
/dev/sda2           19454       20023     4578525   82  Linux swap / Solaris

Disk /dev/sdb: 164.6 GB, 164696555520 bytes
255 heads, 63 sectors/track, 20023 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1               1       19453   156256191   fd  Linux raid autodetect
/dev/sdb2           19454       20023     4578525   82  Linux swap / Solaris

Disk /dev/sdc: 320.0 GB, 320072933376 bytes
255 heads, 63 sectors/track, 38913 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

   Device Boot      Start         End      Blocks   Id  System
/dev/sdc1               1       19453   156256191   fd  Linux raid autodetect
/dev/sdc2           19454       38906   156256222+  fd  Linux raid autodetect
/dev/sdc3           38907       38913       56227+  82  Linux swap / Solaris

Disk /dev/sdd: 320.0 GB, 320072933376 bytes
255 heads, 63 sectors/track, 38913 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

   Device Boot      Start         End      Blocks   Id  System
/dev/sdd1               1       19453   156256191   fd  Linux raid autodetect
/dev/sdd2           19454       38906   156256222+  fd  Linux raid autodetect
/dev/sdd3           38907       38913       56227+  82  Linux swap / Solaris

swap

まずswapの方から片付ける。swapは備えあれば憂いなし。容量は無いよりあっ た方がいい。しかも、速ければ速いほど良い。実は複数のswapエリアがあれば raid0のように並列化して高速に使える技がある。これだけいっぱいのハード ディスクが使えるなら、相当に高速化しそうだ。

swapに使っている領域はプライオリティ値が0に近い順番に使われていく。た とえば-1と-2であれば先に-1が使われる。1と2であれば1が先に使われる。プ ライオリティが同じ場合だと並列に使われる。つまりraid0のように並列化さ れswapのディスクへの読み書きが高速化される。

swapの作り方

mkswapを使いフォーマットする。

# mkswap /dev/sda2
Setting up swapspace version 1, size = 4688404 kB
no label, UUID=ce79d1b5-1010-4923-badb-8ebb76d0968e

# mkswap /dev/sdb2
Setting up swapspace version 1, size = 4688404 kB
no label, UUID=89cb4d9b-1b91-4e89-a044-174c3437596c

# mkswap /dev/sdc3
Setting up swapspace version 1, size = 57569 kB
no label, UUID=20cc4afc-f751-487a-b478-6e1072e31eef

# mkswap /dev/sdd3
Setting up swapspace version 1, size = 57569 kB
no label, UUID=ea64dc69-c54d-4590-906a-1a955756adf3

fstabへ追加

UUIDを使って追加した。
##
# /dev/sda2
UUID=ce79d1b5-1010-4923-badb-8ebb76d0968e   none  swap    sw,pri=1   0    0
# /dev/sdb2
UUID=89cb4d9b-1b91-4e89-a044-174c3437596c   none  swap    sw,pri=1   0    0
# /dev/sdc3
UUID=20cc4afc-f751-487a-b478-6e1072e31eef   none  swap    sw,pri=1   0    0
# /dev/sdd3
UUID=ea64dc69-c54d-4590-906a-1a955756adf3   none  swap    sw,pri=1   0    0

尚、以前にswapに使っていた/dev/hda3も同じプライオリティに設定した。
#  cat /proc/swaps 
Filename                       Type            Size    Used    Priority
/dev/hda3                      partition       5221116 0       1
/dev/sda2                      partition       4578516 0       1
/dev/sdb2                      partition       4578516 0       1
/dev/sdc3                      partition       56216   0       1
/dev/sdd3                      partition       56216   0       1

ちなみに、このマシンは4GBのメモリを積んでいるので、約14.4Gのサイズとい うのは、極端に大きいswapサイズというわけではない。

RAID6化

さてraid6化である。慣れているmdadmを使って行った。今、googleてみたが、 LinuxのSoftware RAIDでraid6を使っているよ、というのは見つからなかった ので、あまりまだやられていないらしい。安定しているのかなぁ、なんて書い ているページが多かったが、raid5のちょっとした応用だからraid5が安定して いるならraid6も問題ないでしょう。たぶん。

raid456モジュールをカーネルへロード

raidはデフォルトでは入っていなかったのでモジュールraid456をロードする。 /etc/modulesにも書いておく。ロード後、確認のために lsmod | grep raid とかやって入っているのかどうか調べておくと心の平穏が保てるのではないか と思う。
# modprobe raid456

mdadmのインストール

さてmdadmを使って作成。このインストールがびっくり。この先を読んでから 覚悟してインストールすること。

# apt-get install mdadm

何も考えずインストールしたら、いきなりinitrd.imgを作り始める。うぉーー、 びっくり。/bootの下に以前のものは.bakというファイルとしてバックアップ が取られていた。それを手動で元の名前にmvする。なんですかー、これは。 なんかオレ悪いことした?

raid化する

ここから先は簡単。単純に指定するだけ。

# mdadm --verbose --create  /dev/md0 --level=raid6  --raid-devices=4 /dev/sd[abcd]1
# mdadm --verbose --create  /dev/md1 --level=raid1  --raid-devices=2 /dev/sd[cd]2

しばらく待つと、結果はこの通り。md0に約312GBのraid6が、md1に約156GBの raid1が作成される。

# cat /proc/mdstat 
Personalities : [raid6] [raid5] [raid4] [raid1] 
md1 : active raid1 sdd2[1] sdc2[0]
      156256128 blocks [2/2] [UU]
      
md0 : active raid6 sdd1[3] sdc1[2] sdb1[1] sda1[0]
      312512128 blocks level 6, 64k chunk, algorithm 2 [4/4] [UUUU]
      
unused devices: 

マウントする

jfsが好みのファイルシステムなので、jfsを使ってフォーマットし、試しにマ ウントしてみる。
# mkfs -t jfs /dev/md0
mkfs.jfs version 1.1.11, 05-Jun-2006
Warning!  All data on device /dev/md0 will be lost!
Continue? (Y/N) y
/

Format completed successfully.
312512128 kilobytes total disk space.
# 
ext3などと違い、すぐプロンプトが返ってくるけど、びっくりしないように。 テストに/mnt/tを作り、そこにマウントしてみる。
# mkdir /mnt/t
# mount -t jfs /dev/md0  /mnt/t
# df
Filesystem           1K-ブロック    使用   使用可 使用% マウント位置
/dev/hda1             11686052   3154420   8531632  27% /
tmpfs                  1995148         0   1995148   0% /lib/init/rw
udev                     10240       108     10132   2% /dev
tmpfs                  1995148         0   1995148   0% /dev/shm
/dev/hda2             63437900   1294496  62143404   3% /home
/dev/md0             312469616     38312 312431304   1% /mnt/t
というわけでraid6化完了と。

mdadm.confの編集

/etc/mdadm/mdadm.confを編集する。これでブート時にmd0とmd1をraidデバイスに してくれる。mdadm.confに以下の情報を加える。

# mdadm --detail --scan
ARRAY /dev/md0 level=raid6 num-devices=4 UUID=5dd10094:c97d2c60:7b0c3db2:91db08b7
ARRAY /dev/md1 level=raid1 num-devices=2 UUID=e0c70df2:b6c02340:7b0c3db2:91db08b7

パフォーマンス

どれくらいのパフォーマンスが出るかhdparmを使って試してみた。尚、継って いるハードディスクはすべてATA-7である。ほぼ予想通りの速度が出ている。
# hdparm -t /dev/md0
Password:

/dev/md0:
 Timing buffered disk reads:  400 MB in  3.00 seconds = 133.14 MB/sec

# hdparm -t /dev/md1

/dev/md1:
 Timing buffered disk reads:  196 MB in  3.03 seconds =  64.78 MB/sec
比較対象として、他のマシンで使っているSATAハードディスクで速度を計って みる。尚、こちらはちょっとだけ古いATA-6である。
# hdparm -t /dev/sda
/dev/sda:
 Timing buffered disk reads:  174 MB in  3.00 seconds =  57.95 MB/sec

ATA Version is:   6

パフォーマンスの結論

予想通りのパフォーマンスが出ており、満足な速度といえる。

googleで見つけて読んだ人へ

過信は禁物である

最後にいっておくけれども、 ここで故障してはいけないという最悪の状況で必ず壊れるようなメカニズムが秘密裡に組み込まれているので 似たような環境に置かれた似たようなハードウェ アが似たような理由が原因で故障をおこすのはありがちなことである。決して二重の パリティがあるからといって過信しないように。バックアップは必ず取るよう に。

PS.
raid6を構成しているHDDがクラッシュし、交換する話は こっちに書いてあります。


目次へ

すずきひろのぶ Hironobu SUZUKI < hironobu -at- h2np -dot- net >

$Id: raid6.html,v 1.3 2007/09/09 09:28:24 hironobu Exp hironobu $