次のページ 前のページ 目次へ

4. RAID セットアップ

4.1 一般的なセットアップ

次のものは、どの RAID レベルでも必要とするものです−

これら全てのソフトウェアは ftp://ftp.fi.kernel.org/pub/linux で見つけられます。RAID tools とパッチは daemons/raid/alpha サブディレクトリにあります。カーネルは kernel サブディレクトリで見つけられます。

カーネルにパッチを当て、使いたいレベルの RAID サポートを含めるように構成します。そしてコンパイルし、インストールを行ないます。

次に、RAID tools を展開して設定し、コンパイル、インストールを行ないます。(訳注:configure, make, make install だけで私の場合は OK でした)

この時点でリブートすると /proc/mdstat というファイルが確認できるはずです。そのファイルはあなたの「お友達」だということを憶えておいてください。cat /proc/mdstat を実行して内容を確認してみると、登録されている RAID の特性がわかります(例えば RAID モード)。まだ RAID デバイスは存在しないはずです。

RAID に含めたいパーティションをつくります。

ここから先はモードに特化した内容になります。

4.2 リニアモード

では、まず少なくとも 2 つのパーティションを用意します。それぞれは同じ大きさである必要はありません(ただ、できれば同じに)。それらをお互いにくっつけたいわけです。

/etc/raidtab ファイルを設定します。私は raidtab にリニアモードで 2 台のディスクで動作させるための設定を行ないました。内容は以下の通りです−

raiddev /dev/md0
        raid-level      linear
        nr-raid-disks   2
        persistent-superblock 1
        device          /dev/sdb6
        raid-disk       0
        device          /dev/sdc5
        raid-disk       1
予備ディスクはここではサポートされません。ディスクが死んだら、アレイも道連れになります。予備ディスクに置く情報はありません。

では、アレイを作りましょう。コマンドを打ち込みます。

  mkraid /dev/md0

これでアレイを初期化して persistent superblock を書き、アレイを始動します。

/proc/mdstat を見てください。アレイが走っている様子が分かります。

これでファイルシステムを作成することができます。マウントや fstab に記述など、他のデバイスと同様の事ができます。

4.3 RAID-0

ほぼ同じサイズの 2 台以上のデバイスを用意します。それらの容量の結合や、並列にアクセスすることによって性能向上も図るわけです。

/etc/raidtab ファイルを設定します。以下はその一例です−

raiddev /dev/md0
        raid-level      0
        nr-raid-disks   2
        persistent-superblock 1
        chunk-size     4
        device          /dev/sdb6
        raid-disk       0
        device          /dev/sdc5
        raid-disk       1
リニアモードと同様に、予備ディスクはサポートされません。RAID-0 には冗長性がないので、ディスクが死ぬとアレイも道連れになります。

アレイを初期化するために以下のコマンドを打ち込みます。

  mkraid /dev/md0
スーパーブロックを初期化し、RAID デバイスを始動するわけです。何が起こっているのかは /proc/mdstat を見てください。デバイスが動いていることが分かるはずです。

これで /dev/md0 をフォーマットやマウント、ぐちゃぐちゃ乱用する事もできるようになりました。

4.4 RAID-1

ほぼ同じサイズの 2 台のデバイスを用意します、お互いにミラーしたいわけです。できればもう 1 台デバイスを用意しましょう。それを待機用の予備ディスクとします。予備ディスクはアクティブなデバイスが壊れた時に、自動的にミラーを補ってくれます。

/etc/raidtab ファイルを設定します−

raiddev /dev/md0
        raid-level      1
        nr-raid-disks   2
        nr-spare-disks  0
        chunk-size     4
        persistent-superblock 1
        device          /dev/sdb6
        raid-disk       0
        device          /dev/sdc5
        raid-disk       1
予備ディスクがある場合、次のような指定を行ないデバイスを追加することができます。
        device          /dev/sdd5
        spare-disk      0
この場合は nr-spare-disks エントリを 1 に設定するのを忘れないように。

さて、RAID を初期化する用意が整いました。ミラーは 2 台のデバイスの内容まで含めて同期するように構築しなければなりません(デバイスはまだフォーマットされてないので、大した問題ではないんですが)。

ミラーの初期化を開始するコマンドを打ち込みます。

  mkraid /dev/md0

/proc/mdstat ファイルをチェックしましょう。/dev/md0 デバイスのミラーの再構築が始まった事を示しており、構築作業の終了予定時刻を知ることができます。

再構築はアイドル中の I/O バンド幅を使ってなされますから、システムは以前とあまり変わらず機敏に動作し続けるはずです。ディスク LED もかなり光っているはずですが。

再構築プロセスは透過的なので、ミラーが再構築中だとしてもデバイスを使うことができます。

再構築の進行中にデバイスをフォーマットしてみてください。ちゃんと動作するはずです。また、再構築の進行中であってもマウントして使うことができます。もちろん再構築中にディスクが壊れたりしたら、そりゃあ運が悪いとしか言いようがありませんが。

4.5 RAID-4

注意! 私自身はこの設定ではテストしてません。以下の設定はあくまで予想であり、実際に走らせたことはありません。

3 台以上のほぼ同じサイズのデバイスを用意します。1 つだけが飛び抜けて速いのがいいですね。これらを結合して 1 つの大きなデバイスとし、冗長性も持たせたいわけです。

/etc/raidtab ファイルを設定します−

raiddev /dev/md0
        raid-level      4
        nr-raid-disks   4
        nr-spare-disks  0
        persistent-superblock 1
        chunk-size      32
        device          /dev/sdb1
        raid-disk       0
        device          /dev/sdc1
        raid-disk       1
        device          /dev/sdd1
        raid-disk       2
        device          /dev/sde1
        raid-disk       3
予備ディスクがあれば同様に入れてください。以下のように−
        device         /dev/sdf1
        spare-disk     0

これでアレイの初期化ができます。いつも通り、次のコマンドを打ち込んでください。

   mkraid /dev/md0

デバイスをフォーマットする前に mke2fs のためのオプション セクションを見てください。

4.6 RAID-5

3 台以上のほぼ同じサイズのデバイスを用意します。これらを結合し、冗長性も併せ持った状態で使うわけです。予備ディスクもあった方がいいでしょう。このディスクは他のデバイスが故障するまでは使われません。

N 台のデバイスを使うとして、最も小さいもののサイズを S とすると、アレイのサイズは (N - 1) * S となります。この「失われた」スペースが、パリティ(冗長性)情報のために使われるわけです。どのディスクが故障しても全てのデータは完全なままです。しかし 2 台のディスクが故障してしまったら、全てのデータが消失することになります。

/etc/raidtab ファイルを設定します−

raiddev /dev/md0
        raid-level      5
        nr-raid-disks   7
        nr-spare-disks  0
        persistent-superblock 1
        parity-algorithm        left-symmetric
        chunk-size      32
        device          /dev/sda3
        raid-disk       0
        device          /dev/sdb1
        raid-disk       1
        device          /dev/sdc1
        raid-disk       2
        device          /dev/sdd1
        raid-disk       3
        device          /dev/sde1
        raid-disk       4
        device          /dev/sdf1
        raid-disk       5
        device          /dev/sdg1
        raid-disk       6
予備ディスクがある場合は同様に−
        device         /dev/sdh1
        spare-disk     0
などとするわけです。

chunk-size の 32 KB という値は、このサイズの普通のファイルシステムのためのデフォルトとしては適切な値でしょう。上記の raidtab で設定されたアレイのサイズは 6 × 6 GB = 36 GB となります(つまり (N - 1) * S = (7 - 1) * 6 = 36 ってことです)。ファイルシステムは ext2 でブロック・サイズは 4 KB としました。ファイルシステムが非常に大きいか、非常に大きいファイルを収容するなら、アレイの chunk-size とファイルシステムのブロックサイズの両方を変えてみると良いでしょう。

さぁ、おしゃべりは充分でしょう。raidtab を設定しましたから、動かして見ましょう。以下のコマンドを打ち込みます。

  mkraid /dev/md0
何が起こるか見てください。うまくいけばアレイの再構築を開始するため、ディスクは猛烈に動き始めます。何が起こっているのかは /proc/mdstat を見てください。

デバイスの作成がうまくいけば、再構築プロセスの始まりです。再構築のこのフェーズでは、アレイはまだ完全とはいえませんが、完全に機能してくれます。フォーマットもできますし、普通に使うことができます(もちろんデバイスが故障したらいけません)。

デバイスをフォーマットする前に mke2fs のためのオプション セクションを見てください。

RAID デバイスが動作していれば、停止や再開をするのに以下のコマンドを使うことができます。

  raidstop /dev/md0
あるいは
  raidstart /dev/md0

これらを初期設定ファイルに入れて何回もリブートするよりも、もうちょっと先に読み進んで、自動検出機能を使った方がいいでしょう。

4.7 The Persistent Superblock

古き良き時代「Good Old Days」(TM)では、raidtools は /etc/raidtab を読み込んでアレイを初期化していました。しかしこれは /etc/raidtab ファイルが存在するファイルシステムがマウントされていることが前提となります。RAID からブートしたいなどという場合は、これはよろしくないでしょう。

更に RAID デバイス上のファイルシステムをマウントするときの、古いアプローチは少々複雑でした。通常のように /etc/fstab に書いておけば良いのではなく、初期化スクリプトでマウントしなければならなかったのです。

persistent superblock はこれらの問題を解決してくれます。/etc/raidtab 中の persistent-superblock オプション付きでアレイを初期化すると、特別なスーパーブロックがアレイに参加している全てのディスクの先頭部分に書きこまれます。これによりカーネルは、RAIDデバイスの構成を直接ディスクから読めるようになります。普通の構成ファイルだったらいつでも読めるわけじゃありません。

でも /etc/raidtab ファイルはそのままにしておきましょう。後でアレイを再構築する際に必要になるかもしれません。

システムのブート時に RAID デバイスを自動検出したければ、persistent superblock は必須です。これについては自動検出セクションで述べることにします。

(訳注:persistent という単語は辞書で引くと、頑固な、持続性がある、不断の、と言った意味を持つ形容詞です。うまい訳語が思いつきませんでしたので、英語表記のままにしてあります)

4.8 Chunk サイズ

chunk-sizeについて説明することは価値があるでしょう。複数のディスクに対して、完全に同時に書きこむことはできません。2 台のディスクがあり 1 バイトのデータを書きたいとすると、それぞれのディスクに 4 ビットずつ書く必要があります。実際には偶数番目のビットはディスク 0 へ、奇数番目はディスク 1 へと書く必要がありますが、ハードウェアはそんなことをサポートしてはくれません。その代わりに Chunk サイズを設定します。これはデバイスに書き込むことができる最小の「アトミックな」データ量として定義されます。(訳注:Chunk = 「かたまり」とでも訳せば良いでしょうか)ディスク 2 台の RAID-0 のケースで、4 KB の Chunk サイズ による 16 KB の書込を想定すると、1 番目と 3 番目の Chunk は最初のディスクへ、2 番目と 4 番目の Chunk は第二のディスクに書き込まれることになります。このように大量の書き込みに対しては、かなり大きい Chunk を指定することによってオーバーヘッドを減らせるかもしれませんが、小さいファイルの多いアレイでは Chunk サイズを小さくした方が良いかもしれません。

Chunk サイズはリニアモードを除く全ての RAID レベルで指定することができます。

最適のパフォーマンスを求めるなら、アレイ上のファイルシステムのブロックサイズと同様に、いろんな値での実験が必要となるでしょう。

/etc/raidtab 中の chunk-size オプションに対する引数は、キロバイト単位の chunk サイズを指定します。「4」は「4 KB」を意味することになります。

RAID-0

データはアレイ中のディスクに「ほとんど」並列に書き込まれます。実際には chunk-size バイトのデータが順次、各ディスクに書かれるわけです。

4 KB の Chunk サイズを指定して 3 台のディスクに 16 KB を書く場合、RAID-0 システムではディスク 0, 1, 2 に 4 KB を、残りの 4 KB をディスク 0 に書くことになります。

32 KB の chunk-size は大部分のアレイで適切な値でしょうが、最適の値はドライブの数やファイルシステムの内容、その他の色々な要因に非常に依存します。最高のパフォーマンスを得るためには実験をして模索する必要があるでしょう。

RAID-1

書き込みについては chunk-size はアレイに影響しません。全てのデータはとにかく全てのディスクに書かれなければならないからです。しかし読み込みの場合、chunk-size でアレイのディスクから連続的にどれくらいのデータを読むかを指定します。アレイ中の全てのアクティブなディスクが同じ情報を持つので、RAID-0 のように並列に読み込めるわけです。

RAID-4

RAID-4 アレイへの書き込み時には、パリティディスク上でパリティ情報も更新されなければなりません。chunk-size はパリティブロックのサイズとなります。RAID-4 アレイに 1 バイトを書き込もうとすると、N-1 台のディスクから chunk-size バイトのデータを読み込みパリティ情報を計算し、chunk-size バイトのデータがパリティディスクに書かれることになります。

RAID-0 の場合と同様、chunk-size は読み込み性能に影響します。RAID-4 からの読み込み方はほぼ同じだからです。

RAID-5

RAID-5 では、chunk-size は RAID-4 の場合と完全に同じ意味を持ちます。

RAID-5 のための合理的な chunk-size は 128 KB ですが、いつものように実験して模索したいかもしれませんね。

また mke2fs のためのオプション セクションも見てください。これは RAID-5 の性能に影響を及ぼします。

4.9 mke2fsのためのオプション

mke2fs で RAID-4 や raid-5 のデバイスをフォーマットする時に利用できる、特別なオプションがあります。-R stride=nn オプションによって、mke2fs は RAID デバイス上に ext2 の特殊なデータ構造をうまく置くことができます。

chunk-sizeが 32 KB なら、その 32 KB の連続したデータは 1 台のディスクの上に置かれます。4 KB のブロックサイズで ext2 ファイルシステムを構築したいならば、1 つのアレイの Chunkの中に 8 つのファイルシステムブロックがあると理解できます。ファイルシステムを作成する時に mke2fs ユーティリティにこの情報を渡すことができます。

  mke2fs -b 4096 -R stride=8 /dev/md0

RAID-{4,5}のパフォーマンスはこのオプションに非常に影響されます。stride オプションが他の RAID レベルの場合にどのような影響を及ぼすかの確信がありません。誰かこれに関する情報があれば私まで送ってください。

ext2fs のブロックサイズは、ファイルシステムのパフォーマンスに非常に影響します。数百メガバイト以上のどんなファイルシステム上でも、ブロックサイズは 4 KB にすべきです。小さいファイルをたくさん置くなら別ですが

4.10 自動検出

自動検出は、カーネルがブート時に普通のパーティションの検出後、RAIDデバイスを自動的に検出できるようにします。

これには必要なものがいくつかあります。

  1. カーネルに自動検出サポートが必要ですので、これをチェックします。
  2. persistent-superblock を使って RAID デバイスを作成します。
  3. RAID で使われるデバイスのパーティションタイプを、0xFD(fdiskを使ってタイプを「fd」にする)にセットします。

NOTE: パーティションタイプを変える前に、RAID が動いていないことを確認してください。デバイスを止めるには raidstop /dev/md0 を使ってください。

上記 1, 2, 3 を設定すれば自動検出の設定は終わりです。リブートしてみてください。システムが立ち上がるとき、cat /proc/mdstat で RAID が走っている様子がわかります。

ブートの間、このような感じのメッセージが表示されます−

 Oct 22 00:51:59 malthe kernel: SCSI device sdg: hdwr sector= 512
  bytes. Sectors= 12657717 [6180 MB] [6.2 GB]
 Oct 22 00:51:59 malthe kernel: Partition check:
 Oct 22 00:51:59 malthe kernel:  sda: sda1 sda2 sda3 sda4
 Oct 22 00:51:59 malthe kernel:  sdb: sdb1 sdb2
 Oct 22 00:51:59 malthe kernel:  sdc: sdc1 sdc2
 Oct 22 00:51:59 malthe kernel:  sdd: sdd1 sdd2
 Oct 22 00:51:59 malthe kernel:  sde: sde1 sde2
 Oct 22 00:51:59 malthe kernel:  sdf: sdf1 sdf2
 Oct 22 00:51:59 malthe kernel:  sdg: sdg1 sdg2
 Oct 22 00:51:59 malthe kernel: autodetecting RAID arrays
 Oct 22 00:51:59 malthe kernel: (read) sdb1's sb offset: 6199872
 Oct 22 00:51:59 malthe kernel: bind<sdb1,1>
 Oct 22 00:51:59 malthe kernel: (read) sdc1's sb offset: 6199872
 Oct 22 00:51:59 malthe kernel: bind<sdc1,2>
 Oct 22 00:51:59 malthe kernel: (read) sdd1's sb offset: 6199872
 Oct 22 00:51:59 malthe kernel: bind<sdd1,3>
 Oct 22 00:51:59 malthe kernel: (read) sde1's sb offset: 6199872
 Oct 22 00:51:59 malthe kernel: bind<sde1,4>
 Oct 22 00:51:59 malthe kernel: (read) sdf1's sb offset: 6205376
 Oct 22 00:51:59 malthe kernel: bind<sdf1,5>
 Oct 22 00:51:59 malthe kernel: (read) sdg1's sb offset: 6205376
 Oct 22 00:51:59 malthe kernel: bind<sdg1,6>
 Oct 22 00:51:59 malthe kernel: autorunning md0
 Oct 22 00:51:59 malthe kernel: running: <sdg1><sdf1><sde1><sdd1><sdc1><sdb1>
 Oct 22 00:51:59 malthe kernel: now!
 Oct 22 00:51:59 malthe kernel: md: md0: raid array is not clean --
  starting background reconstruction 
これは正常にシャットダウンされなかった(例えばマシンがクラッシュした)RAID-5 アレイの自動検出時に出力されたものです。再構築は自動的に始まります。このデバイスをこの状態のままマウントしても完全に安全です。というのも再構築は透過的で、全てのデータが一貫 (consistent) しているからです(一貫性がないのはパリティ情報だけですが、デバイスが故障するまでは必要ありません)。

自動始動したデバイスはシャットダウン時にも自動停止します。初期化スクリプトについて心配する必要はありません。/dev/md デバイスは /dev/sd や /dev/hd デバイスと同じように使えます。

簡単ですね。

raidstart/raidstop コマンドの使い方を知るために初期化スクリプトを覗いてみるのもいいでしょう。これらは標準的な RedHat の初期化スクリプトには、たいてい含まれています。これらが使われるのは旧式な RAID のためなので、自動検出付きの新しい RAID には用をなしません。その行は削ってしまいましょう、それですべてうまくいきます。

4.11 RAID でブート

RAID デバイス上のルートファイルシステムにシステムをセットアップするにはいくつかの方法があります。 今のところ、RedHat Linux 6.1 のグラフィカル・インストールだけが、RAID デバイスへの直接インストールを提供しているにすぎません。 ですから、やりたければ少しひねる必要がありますが、ちゃんと可能なことです。

最新の公式な lilo ディストリビューション(バージョン 21 )では RAID デバイスを扱いません、ですからブート時にカーネルを RAID デバイスからロードすることはできません。このバージョンを使っている場合は /boot ファイルシステムは RAID でないデバイスの上に置かなければならないことになります。システムが確実にブートする方法は RAID デバイス中のすべてのドライブ上に同じように /boot パーティションを作り、BIOS が利用できる(例えば一番目の)ドライブから常にデータをロードするように設定することです。そのためにはシステム中の故障したディスクからブートしようとしてはいけません。

redhat 6.1 では、RAID-1 で /boot を扱うことができる lilo 21 へのパッチが利用できるようになりました。 他のレベルでは働きません、注意してください。RAID-1 (ミラーリング) だけがサポートされる RAID レベルです。 このパッチ (lilo.raid1) は、redhat のどのミラーでも dist/redhat-6.1/SRPMS/SRPMS/lilo-0.21-10.src.rpm で見つかるでしょう。 このパッチを適用された LILO は、 lilo.conf の中で boot=/dev/md0 という命令を受け付けるようになり、ミラーを構成するどちらのディスクからでもブートできるようにしてくれます。

システムが確実にブートすることができるもう一つの方法は、全てのセットアップが終了した時点でブート・フロッピーを作ることです。/boot ファイルシステムを載せたディスクが死んでも、いつでもフロッピーからブートすることができます。

4.12 RAID 上のルートファイルシステム

システムを RAID 上でブートするには、ルートファイルシステム( / )が RAID デバイス上でマウントされなければなりません。これを実現する 2 つの方法を以下に示します。現在のディストリビューション(少なくとも私が知っている)は RAID デバイス上にインストールすることをサポートしていませんから、方法としては普通の(RAID ではない)パーティションにインストールを行ない、インストールが終了した後に RAID でないルートファイルシステムの内容を新しい RAID デバイスに移動します。

方法 1

この方法では、これから構成しようとしている RAID とは別に予備のディスクを用意し、その上にシステムをインストールします。

この作業を IDE ディスクでしているならば、BIOS で全てのディスクを「auto-detect」タイプに設定してください。そうすれば BIOS がディスクの 1台を見つけられないような時でもマシンはブートすることができるでしょう。

方法 2

この方法は、failed-disk 命令の使える raidtools とパッチを使う必要があります。これは 2.2.10 以降のすべてのカーネルのための raidtools とパッチとなるでしょう。

この方法は RAID レベル 1 以上のみで使用することができます。意図的に故障とマークされたディスク上にシステムをインストールし、それからデグレードモードで走ることになる RAID にコピーし、最後に不要になった「インストールディスク」の古いシステムを消去して RAID を構築し、非デグレードモードで動作させます。

(訳注:デグレードモード "degraded mode" というのは、冗長性のある RAID の一部が故障しているが、データの完全性は保たれている状態のことです)

4.13 RAID でブートするシステムを作る

ルートファイルシステムをマウントすることができるカーネルのために、ルートファイルシステムが置かれるデバイスの全てのサポートはカーネルに組み込まれていなければなりません。したがって、RAID デバイス上でルートファイルシステムをマウントするためには、カーネルに RAID サポートが組み込まれていなければなりません。

カーネルから RAID デバイスが見えることを確認する普通の方法は、単に全ての必要な RAID サポートを組み込んでカーネルをコンパイルすることです。RAID サポートをローダブルモジュールではなく、カーネル組みこんでいることを確認してください。カーネルはモジュールのロードを(ルートファイルシステムから)ルートファイルシステムがマウントされる前に行なうことはできません。

しかし RedHat 6.0 からはモジュールとして新しい RAID サポートを持つカーネルが含まれていますから、ここではどのように標準の RedHat 6.0 カーネルで RAID 上からシステムをブートさせるかについて記述します。

モジュールを使用して RAID でブート

ブートさせるためには、LILO に RAM ディスクを使うように指示する必要があります。「ルートパーティションをマウントするのに必要な全てのカーネルモジュールを含んでいる RAM ディスクをつくれ」という mkinitrd コマンドを使います。

このようにします。

 mkinitrd --with=<module> <ramdisk name> <kernel>
具体的には、このようになります。
 mkinitrd --with=raid5 raid-ramdisk 2.2.5-22

これにより、カーネルがルートデバイスをマウントするために必要な RAID モジュールがブート時に存在することが保証されます。

4.14 落し穴

決して、決して、決して、稼働している RAID の一部であるディスクのパーティションの切り直しをしてはいけません。RAID の一部であるディスク上のパーティションテーブルを変更する必要があるのなら、最初にアレイを止めます。その後にパーティションを切り直すのです。

非常に多くのディスクをバス上に付けることは簡単です。普通の Fast-Wide SCSI バスは 10 MB/s をサポートできますが、これは今日ではほとんどのディスク単独での性能よりも少ない値です。そんなバスにディスクを 6 台置いても期待したパフォーマンスは出ません。

SCSI バスがバス上のディスクの能力でほとんど満杯になるようなら、SCSI コントローラを複数にすることが、性能向上の唯一の方法となります。2 台の古い SCSI ディスク(1台のコントローラ上で 2台のディスクを走らせることでなくて)で、2 枚の 2940 を使っても性能向上は見られません。

persistent-superblock オプションを忘れた場合、停止させた後はうまく起動しなくなるかもしれません。raidtab でオプションを正しくセットしなおして、アレイを再構成してください。

RAID-5 でディスクが外され、再挿入後に再構築が失敗する場合、それは raidtab の中のデバイスの順序のためかもしれません。最初の「device...」と「raid-disk...」のペアを raidtab ファイルの中のアレイに関する記述の下の方へ動かしてみてください。


次のページ 前のページ 目次へ