作成日:2003/01/27
RAIDとは| 利用する目的| Windows 2000,XPでの作成手順| Linuxでの作成手順| FreeBSDでの作成手順| その他のOSでの作成手順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製品以上が必要だ。
Win2K, XPなどでソフトウェアRAIDを利用するには、コントロールパネルの管理ツール→コンピュータの管理→ディスクの管理で行う。注意しなければならないのはRAID構成にする場合、ベーシックディスクの場合ダイナミックディスクにアップグレードしなければならないのだが、いったんダイナミックディスクにすると戻せないこと、ほかのOSとデュアルブートして共有している場合などはそれぞれが対応しているか注意すること。 作成方法だが、ミラーの場合はマスターとなるボリュームを右クリックしミラーの追加を選択する。そのほかの場合はベースとなる空き領域を右クリックしてボリュームの作成を選択する。作成し終わったら管理画面のレイアウトの表示がシンプルからストライプ、スパン、ミラー、RAID-5のいずれかに替わり画面下部のボリューム表示も色分けされる。またこれらはdiskpartコマンドでも実行できるので同一設定を複数台に行うときなどはスクリプトを作成すると良いだろう。
![]() |
Windows 2000ではスパン、ストライプボリュームを利用するにはダイナミックディスクにする必要があるため、まずダイナミックディスクにアップデートをする。上記はまだベーシックディスクのまま。
![]() |
RAIDに追加するディスクを右クリックしボリューム作成を選択すると、上記画面で作成するボリュームの種類が選べる
![]() |
スパン、ストライプ、ミラーなら2台以上。RAID5の場合は3台以上を選択する。
![]() |
サイズやほかのボリュームセットを構成するパーティションを選択し終わるとウィザードの完了。
![]() |
バックグラウンドでRAIDのボリュームの構築が実行され、完了するとレイアウトが作成したボリュームによりストライプ、スパン、ミラー、RAID-5のどれかが表示される。
ディストリビューションによっては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では"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
このページの内容について筆者はいっさい保証しない。参考に当たっては自己責任でかならず確認の上作業するように。