Software RAIDによるHDDの性能・信頼性向上

作成日:2003/01/27

RAIDとは| 利用する目的| Windows 2000,XPでの作成手順| Linuxでの作成手順| FreeBSDでの作成手順| その他のOSでの作成手順

RAIDとは

RAIDとはRedudant Arrays of inexpensive Disksの略で、安価なディスク装置を複数並列に利用することにより耐障害性と性能を向上させる技術を言う。カリフォルニア大学バークレイ校で1987年に発表された論文『A Case for Redundant Arrays of Inexpensive Disks』がその起源だ。現在は汎用的なディスクを使うのが一般的なため安価を意味するInexpensiveの代わりに、独立した個別のディスクを使うことから、Independentが用いられる事が多い。RAIDにはレベルがあり、通常レベル0,1,5が利用されそのほかは理論的には意味があっても実用的で無いのでほとんど用いられない。

それぞれのレベルの特性は以下のとおり。なおRAIDレベル1をRAID1のように略す場合もある。

他にRAIDではないが、リニアRAIDあるいはJBOD(Just a Bunch Of Disk)、Windowsではスパンニングと呼ばれる複数台のディスクを単純に連結する方法もある。信頼性はRAIDレベル0と変わらないが読み書きは分散されないため性能向上はない。ただRAIDは同様量のディスク・パーテションに対して設定できるがリニアRAIDでは容量の違うディスク・パーテションに対して利用できる。このため単純にディスク容量を増やしたい場合などに利用できる。

利用する目的

それぞれの利用シーンは、サービス停止が許されず、頻繁にデータ更新があり、そのためのコスト増が許される場合はレベル1を、ある程度の信頼性は必要だが重要なデータはあまり無いか、ほとんど更新がなく読み出しが主体で、コストをかけられないサーバではレベル5が利用されることが多い。レベル0は信頼性よりも入出力性能を重視するワークステーションなどに用いられる。レベル1以外は見かけの容量が増えるため、信頼性のほか大容量ディスクの代替としても利用される。

このような特徴を持つRAIDだが、その実現にはソフトウェアRAIDとハードウェアRAIDがあり、同じRAIDレベルでも性能や使い勝手などが違う。ハードウェアRAIDの場合は専用のDAC(Disk Array Controler)が必要だが、ホットスワップ(障害が発生したディスクをシステムが稼働状態で入れ替える事が出来ること)が可能でCPUに負荷がかからず、OSから見ると単独のディスクに見えるため利用できるOS等の環境に左右されない。ただしOSによってはドライバなどが提供されておらず利用できない場合があるため注意が必要だ。

ソフトウェアRAIDはOSまたはドライバでRAIDを実現するため、CPU負荷が増え、起動ドライブに出来ない場合があったり、ホットスワップに対応出来なかったりする。しかしパソコンで利用することを考えると、HDDの追加だけで実現できるソフトウェアRAIDが良いだろう。ただしWin9XではソフトウェアRAIDはサポートされず、Win2K Pro, WinXP HomeなどではRAIDレベル0(Windowsではストライプボリューム)またはスパンニングボリュームのみで冗長構成による信頼性向上はできない。レベル1または5を利用するにはServer製品以上が必要だ。

Windows 2000,XP での作成手順

Win2K, XPなどでソフトウェアRAIDを利用するには、コントロールパネルの管理ツール→コンピュータの管理→ディスクの管理で行う。注意しなければならないのはRAID構成にする場合、ベーシックディスクの場合ダイナミックディスクにアップグレードしなければならないのだが、いったんダイナミックディスクにすると戻せないこと、ほかのOSとデュアルブートして共有している場合などはそれぞれが対応しているか注意すること。 作成方法だが、ミラーの場合はマスターとなるボリュームを右クリックしミラーの追加を選択する。そのほかの場合はベースとなる空き領域を右クリックしてボリュームの作成を選択する。作成し終わったら管理画面のレイアウトの表示がシンプルからストライプ、スパン、ミラー、RAID-5のいずれかに替わり画面下部のボリューム表示も色分けされる。またこれらはdiskpartコマンドでも実行できるので同一設定を複数台に行うときなどはスクリプトを作成すると良いだろう。

HDDを追加してディスクの管理を起動する

Windows 2000ではスパン、ストライプボリュームを利用するにはダイナミックディスクにする必要があるため、まずダイナミックディスクにアップデートをする。上記はまだベーシックディスクのまま。

作成するボリュームの種類を選択する

RAIDに追加するディスクを右クリックしボリューム作成を選択すると、上記画面で作成するボリュームの種類が選べる

ボリュームを構成するディスクの選択

スパン、ストライプ、ミラーなら2台以上。RAID5の場合は3台以上を選択する。

ボリューム作成ウィザードの完了

サイズやほかのボリュームセットを構成するパーティションを選択し終わるとウィザードの完了。

作成後のディスク管理画面

バックグラウンドでRAIDのボリュームの構築が実行され、完了するとレイアウトが作成したボリュームによりストライプ、スパン、ミラー、RAID-5のどれかが表示される。

Linuxでの作成手順

ディストリビューションによってはKernelをmdデバイスをサポートするようにコンフィグレーションし、 リビルドする必要がある。またraidtoolsがインストールされていなければrpmパッケージなどでインストールする。

まず空きディスクを接続しLinuxを立ち上げ、fdiskでパーティションを作成する。ここでは新規にRAID1を作成するため2台(sdb,sdc)追加する。また、RAIDを自動検出させるため、パーティションのIDを"fd"に設定する。

# /sbin/fdisk /dev/sdb
デバイスは正常な DOS 領域テーブルも、Sun, SGI や OSF ディスクラベルも
含んでいません
新たに DOS ディスクラベルを作成します。あなたが書き込みを決定するまで、変更は
メモリ内だけに残します。その後はもちろん以前の内容は修復不可能になります。

コマンド (m でヘルプ): n
コマンドアクション
   e   拡張
   p   基本領域 (1-4)
p
領域番号 (1-4): 1
最初 シリンダ (1-512, 初期値 1): [return]
初期値 1 を使います
終点 シリンダ または +サイズ または +サイズM または +サイズK (1-512, 初期値 512): [return]
初期値 512 を使います

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

コマンド (m でヘルプ): p

ディスク /dev/sdc: ヘッド 64, セクタ 32, シリンダ 512
ユニット = シリンダ数 of 2048 * 512 バイト

 デバイス ブート   始点      終点  ブロック   ID  システム
/dev/sdb1             1       512    524272   fd  Linux raid 自動検出

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

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

同様の手順でsdcにもパーティションを作成する。当然ながら同じサイズにすること。

RAIDで使用するパーティションの設定ファイル"/etc/raidtab"を以下のとおり作成する。

# cat /etc/raidtab
raiddev /dev/md0
	raid-level	1
	nr-raid-disks	2
	persistent-superblock 1
	chunk-size	32
	device	/dev/sdb1
	raid-disk	0
	device	/dev/sdc1
	raid-disk	1

RAID5の場合は "nr-raid-disks"を3以上とし、パリティ設定を "parity-algorithm left-symmetric"と記述する。"raidtab"を書き終え誤りがないか確認できればいよいよraidの構築だ。以下のように入力する。

# /sbin/mkraid /dev/md0
handling MD device /dev/md0
analyzing super-block
disk 0: /dev/sdb1, 524272kB, raid superblock at 524160kB
disk 1: /dev/sdc1, 524272kB, raid superblock at 524160kB

これまでの手順に誤りがなければ、上記のようにすんなり構築できるはず。この段階でシステムはmdデバイスを認識する。"/proc/mdstat"を見てみると次のようになっている。

# cat /proc/mdstat
Personalities : [raid1] 
read_ahead 1024 sectors
md0 : active raid1 sdc1[1] sdb1[0]
      524160 blocks [2/2] [UU]
      
unused devices: 

RAIDが構築できたので、ファイルシステムを作成する。ファイルシステムにはジャーナル対応のものが良い。ここではReiserfsを作成している。

# /sbin/mkreiserfs /dev/md0

<-------------mkreiserfs, 2001------------->
reiserfsprogs 3.x.0j

===================================================================
LEAF NODE (8211) contains level=1, nr_items=2, free_space=3932 rdkey
-------------------------------------------------------------------------------
|###|type|ilen|f/sp| loc|fmt|fsck|                   key                      |
|   |    |    |e/cn|    |   |need|                                            |
-------------------------------------------------------------------------------
|  0|1 2 0x0 SD, len 44, entry count 0, fsck need 0, format new|
(NEW SD), mode drwxr-xr-x, size 48, nlink 2, mtime 01/27/2003 13:03:40 blocks 8
-------------------------------------------------------------------------------
|  1|1 2 0x1 DIR, len 48, entry count 2, fsck need 0, format old|
###: Name                     length    Object key           Hash     Gen number
  0: ".                        "(  1)                 1 2           0    1, loc 40, state 4 ??
  1: "..                       "(  2)                 0 1           0    2, loc 32, state 4 ??
===================================================================
Creating reiserfs of 3.6 format
Block size 4096 bytes
Block count 131040
Used blocks 8215
Free blocks count 122825
First 16 blocks skipped
Super block is in 16
Bitmap blocks (4) are : 
	17, 32768, 65536, 98304
Journal size 8192 (blocks 18-8210 of file /dev/md0)
Root block 8211
Hash function "r5"
ATTENTION: YOU SHOULD REBOOT AFTER FDISK!
(y/n)	    ALL DATA WILL BE LOST ON '/dev/md0'! y
....20%....40%....60%....80%....100%                        left 0, 2048 /sec
Syncing..

ReiserFS core development sponsored by SuSE Labs (suse.com)

Journaling sponsored by MP3.com.

To learn about the programmers and ReiserFS, please go to
http://www.devlinux.com/namesys

Have fun.

これでマウントできるようになった。必要に応じて"/etc/fstab"に記述を追加し、起動時にマウント出来るようにしておく。

# mkdir /mnt/raid
# mount /dev/md0 /mnt/raid
# df
ファイルシステム    1k-ブロック   使用中      空き 使用% マウント場所
/dev/sda2              3889924   2489296   1203032  68% /
/dev/sda1                46636     12491     31737  29% /boot
/dev/md0                524140     32840    491300   7% /mnt/raid

もしもRAID1を構築しているどちらかのディスクが故障したとすると、 "/proc/mdstat"で以下のようにオンラインのデバイスが[U]、オフラインのデバイスは[_]で表示される。

# cat /proc/mdstat
Personalities : [raid1] 
read_ahead 1024 sectors
md0 : active raid1 sdb1[0]
      524160 blocks [2/1] [U_]
      
unused devices: <none>

RAIDで冗長構成をとっておいたおかげでとりあえず問題なく動いているが、復旧するために停止できるタイミングに一度システムを停止し、故障したディスクを同容量の新しいディスクを接続し起動する。(HOTプラグ対応のマウンタを利用している場合は再起動する必要はない)。ただし起動ドライブがトラブルの場合はSCSI IDやIDEのプライマリ、セカンダリの接続を変更しないとSoftware RAIDの場合起動出来ない。

md: md driver 0.90.0 MAX_MD_DEVS=256, MD_SB_DISKS=27
 [events: 00000004]
md: could not lock sdc1, zero-size? Marking faulty.
md: could not import sdc1, trying to run array nevertheless.
md: autorun ...
md: considering sdb1 ...
md:  adding sdb1 ...
md: created md0
md: bind≶sdb1,1>
md: running: <sdb1>
md: sdb1's event counter: 00000004
md0: former device sdc1 is unavailable, removing from array!
md: RAID level 1 does not need chunksize! Continuing anyway.
md: raid1 personality registered as nr 3
md0: max total readahead window set to 124k
md0: 1 data-disks, max readahead per data-disk: 124k
raid1: device sdb1 operational as mirror 0
raid1: md0, not all disks are operational -- trying to recover array
raid1: raid set md0 active with 1 out of 2 mirrors
md: updating md0 RAID superblock on device
md: sdb1 [events: 00000005]<6>(write) sdb1's sb offset: 524160
md: recovery thread got woken up ...
md0: no spare disk to reconstruct array! -- continuing in degraded mode
md: recovery thread finished ...
md: ... autorun DONE.

新しく繋いだディスクで再びRAID構成に戻すために"raidhotadd"を実行する。

# raidhotadd /dev/md0 /dev/sdc1

RAIDの再構築がバックグラウンドで始まる。

# cat /proc/mdstat
Personalities : [raid1] 
read_ahead 1024 sectors
md0 : active raid1 sdc1[2] sdb1[0]
      524160 blocks [2/1] [U_]
      [==>..................]  recovery = 12.1% (64048/524160) finish=0.8min speed=9149K/sec
unused devices: <none>

しばらくするとリビルドが終了し冗長構成が回復する。

# cat /proc/mdstat
Personalities : [raid1] 
read_ahead 1024 sectors
md0 : active raid1 sdc1[1] sdb1[0]
      524160 blocks [2/2] [UU]
      
unused devices: <none>

FreeBSDでの作成手順

FreeBSDでは"vinum"という論理ボリュームマネージャで行う。

始めにfdiskでスライス、パーティションを作成し、"disklabel"でfstypeを編集しvinumに変更しvinumで使えるように変更して書き込んでおく。下記ではディスク全体をad?eとしている。

#        size   offset    fstype   [fsize bsize bps/cpg]
  c:  8388513        0    unused        0     0         # (Cyl.    0 - 8321*)
  e:  8388513        0    vinum                         # (Cyl.    0 - 8321*)

vinumでは1つ以上のdrive(パーティション)をsubdiskにまとめ、同じようにsubdiskをplexにまとめ、plexをさらにvolumeにまとめていく論理構造でディスクを管理する。plexの編成には concat(Liner RAID, RAID1)、stripe(RAID0)、raid5(RAID5)のどれかをorganizationとして指定し作成する。これらの構成をファイルに記述する。以下ではRAID1を指定するためのサンプルだ。ミラーリングさせるためconcatを指定するplexが複数ある点に注目すること。Liner RAIDの場合は一つのplexに複数のsubdiskを指定する。なおボリューム作成時に初期化するためのキーワード"setupstate"と"init"についてマニュアルで調べておくことを勧める。

# cat raid1.conf
drive drive-1 device /dev/ad1e
drive drive-2 device /dev/ad3e
volume raid1 setupstate
 plex org concat
  subdisk drive drive-1 length 0
 plex org concat
  subdisk drive drive-2 length 0

上記のように作成した構成設定ファイルをもとにボリュームを作成する。

# vinum create -f raid1.conf 
2 drives:
D drive-1               State: up       Device /dev/ad1e        Avail: 0/4095 MB (0%)
D drive-2               State: up       Device /dev/ad3e        Avail: 0/4095 MB (0%)

1 volumes:
V raid1                 State: up       Plexes:       2 Size:       4095 MB

2 plexes:
P raid1.p0            C State: up       Subdisks:     1 Size:       4095 MB
P raid1.p1            C State: up       Subdisks:     1 Size:       4095 MB

2 subdisks:
S raid1.p0.s0           State: up       PO:        0  B Size:       4095 MB
S raid1.p1.s0           State: up       PO:        0  B Size:       4095 MB

RAIDボリュームが作成できたら、"newfs -v"でファイルシステムを作成し、tunefsをしておく。vinumで作成したボリュームは"/dev/vinum"配下にvolume, plex, subdiskがvolume.p0.s0のように『ボリューム名 + .p + プレックス番号 + .s + サブディスク番号』という名前で作成される

# newfs -v /dev/vinum/raid1 
Warning: Block size and bytes per inode restrict cylinders per group to 22.
Warning: 298 sector(s) in last cylinder unallocated
/dev/vinum/raid1:       8388310 sectors in 2048 cylinders of 1 tracks, 4096 sectors
        4095.9MB in 94 cyl groups (22 c/g, 44.00MB/g, 10816 i/g)
super-block backups (for fsck -b #) at:
 32, 90144, 180256, 270368, 360480, 450592, 540704, 630816, 720928, 811040,
 901152, 991264, 1081376, 1171488, 1261600, 1351712, 1441824, 1531936, 1622048,
 1712160, 1802272, 1892384, 1982496, 2072608, 2162720, 2252832, 2342944,
 2433056, 2523168, 2613280, 2703392, 2793504, 2883616, 2973728, 3063840,
 3153952, 3244064, 3334176, 3424288, 3514400, 3604512, 3694624, 3784736,
 3874848, 3964960, 4055072, 4145184, 4235296, 4325408, 4415520, 4505632,
 4595744, 4685856, 4775968, 4866080, 4956192, 5046304, 5136416, 5226528,
 5316640, 5406752, 5496864, 5586976, 5677088, 5767200, 5857312, 5947424,
 6037536, 6127648, 6217760, 6307872, 6397984, 6488096, 6578208, 6668320,
 6758432, 6848544, 6938656, 7028768, 7118880, 7208992, 7299104, 7389216,
 7479328, 7569440, 7659552, 7749664, 7839776, 7929888, 8020000, 8110112,
 8200224, 8290336, 8380448

# tunefs -n enable /dev/vinum/raid1 
tunefs: soft updates set

あとはマウントして正常動作を確認後"/etc/fstab"に追加し、起動時にvinumが有効になるように"/etc/rc.conf"にstart_vinum="YES"を追加する。これで再起動後も使えるようになる。起動シーケンスとvinumボリュームが有効になるタイミングに注意すること。

# mkdir /mnt/raid1
# mount /dev/vinum/raid1 /mnt/raid1
# mount
/dev/ad0s1a on / (ufs, local)
/dev/ad0s1f on /tmp (ufs, local, soft-updates)
/dev/ad0s1g on /usr (ufs, local, soft-updates)
/dev/ad0s1e on /var (ufs, local, soft-updates)
procfs on /proc (procfs, local)
/dev/vinum/raid1 on /mnt/raid1 (ufs, local, soft-updates)
# df 
Filesystem       1K-blocks   Used   Avail Capacity  Mounted on
/dev/ad0s1a         128990  34694   83978    29%    /
/dev/ad0s1f         257998   3090  234270     1%    /tmp
/dev/ad0s1g        3305318 619290 2421604    20%    /usr
/dev/ad0s1e         257998   4454  232906     2%    /var
procfs                   4      4       0   100%    /proc
/dev/vinum/raid1   4065545      1 3740301     0%    /mnt/raid1

正常に利用できることが確認できたら、"/etc/rc.conf"に以下の1行を追加する。

start_vinum="YES"

もし、ディスク障害発生すると、"vinum l"が以下のような表示になる。

# vinum l
1 drives:
D drive-2               State: up       Device /dev/ad3e        Avail: 0/4095 MB (0%)
D drive-1               State: referenced       Device  Avail: 0/0 MB

1 volumes:
V raid1                 State: up       Plexes:       2 Size:       4095 MB

2 plexes:
P raid1.p0            C State: faulty   Subdisks:     1 Size:       4095 MB
P raid1.p1            C State: up       Subdisks:     1 Size:       4095 MB

2 subdisks:
S raid1.p0.s0           State: crashed  PO:        0  B Size:       4095 MB
S raid1.p1.s0           State: up       PO:        0  B Size:       4095 MB

RAID1なので、ディスク障害発生でも問題なく利用できている

# df
Filesystem       1K-blocks   Used   Avail Capacity  Mounted on
/dev/ad0s1a         128990  34694   83978    29%    /
/dev/ad0s1f         257998   3090  234270     1%    /tmp
/dev/ad0s1g        3305318 619294 2421600    20%    /usr
/dev/ad0s1e         257998   4464  232896     2%    /var
procfs                   4      4       0   100%    /proc
/dev/vinum/raid1   4065545    163 3740139     0%    /mnt/raid1

このままだと冗長性が無いので、復旧作業を行う。まずミラーされるディスクと同一か、 無ければ性能が同じ程度で、同様量以上のディスクを障害発生したディスクと交換する。

交換したディスクにディスクラベルを書き込む。

# disklabel ad3 >/tmp/disklabel.ad3
# disklabel -BR ad1 /tmp/disklabel.ad3

ディスクラベルを書き込んだら、vinumで障害が発生したドライブの登録を削除し、登録し直す。

# vinum
vinum -> rm drive-1
vinum -> l
1 drives:
D drive-2               State: up       Device /dev/ad1e        Avail: 0/4095 MB (0%)

1 volumes:
V raid1                 State: up       Plexes:       2 Size:       4095 MB

2 plexes:
P raid1.p0            C State: flaky    Subdisks:     1 Size:       4095 MB
P raid1.p1            C State: up       Subdisks:     1 Size:       4095 MB

2 subdisks:
S raid1.p0.s0           State: reborn   PO:        0  B Size:       4095 MB
S raid1.p1.s0           State: up       PO:        0  B Size:       4095 MB

vinum -> create

"create"コマンドを入力すると、viエディタに変わるので、登録するドライブを以下のように入力し保存する。

drive drive-1 device /dev/ad3e

ドライブの登録が終われば以下のように"start"コマンドで活性化するとミラーの再構築が始まる。

vinum -> start raid1.p0.s0
Reviving raid1.p0.s0 in the background
vinum[231]: reviving raid1.p0.s0
vinum -> l
2 drives:
D drive-1               State: up       Device /dev/ad1e        Avail: 0/4095 MB (0%)
D drive-2               State: up       Device /dev/ad3e        Avail: 0/4095 MB (0%)

1 volumes:
V raid1                 State: up       Plexes:       2 Size:       4095 MB

2 plexes:
P raid1.p0            C State: faulty   Subdisks:     1 Size:       4095 MB
P raid1.p1            C State: up       Subdisks:     1 Size:       4095 MB

2 subdisks:
S raid1.p0.s0           State: R 16%    PO:        0  B Size:       4095 MB
S raid1.p1.s0           State: up       PO:        0  B Size:       4095 MB
vinum -> 
以下のメッセージが表示されれば復旧完了だ。なお再構築中はvinumコマンドから抜けてしまってもかまわない。 その場合は"/var/log/message"を確認するか、"vinum l"で状況を確認しよう。
 vinum[231]: raid1.p0.s0 is up

その他の場合

FreeBSDではほかに"ccd"(ConCatenated Disk driver)がある。NetBSDでは"RAIDFrame"を利用する。これらのキーワードで調べて欲しい。

注意

このページの内容について筆者はいっさい保証しない。参考に当たっては自己責任でかならず確認の上作業するように。


前へ| 次へ
コンピュータの部屋
トップページ