次のものは、どの 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 に含めたいパーティションをつくります。
ここから先はモードに特化した内容になります。
では、まず少なくとも 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 に記述など、他のデバイスと同様の事ができます。
ほぼ同じサイズの 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 をフォーマットやマウント、ぐちゃぐちゃ乱用する事もできるようになりました。
ほぼ同じサイズの 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 もかなり光っているはずですが。
再構築プロセスは透過的なので、ミラーが再構築中だとしてもデバイスを使うことができます。
再構築の進行中にデバイスをフォーマットしてみてください。ちゃんと動作するはずです。また、再構築の進行中であってもマウントして使うことができます。もちろん再構築中にディスクが壊れたりしたら、そりゃあ運が悪いとしか言いようがありませんが。
注意! 私自身はこの設定ではテストしてません。以下の設定はあくまで予想であり、実際に走らせたことはありません。
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 のためのオプション セクションを見てください。
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
これらを初期設定ファイルに入れて何回もリブートするよりも、もうちょっと先に読み進んで、自動検出機能を使った方がいいでしょう。
古き良き時代「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 という単語は辞書で引くと、頑固な、持続性がある、不断の、と言った意味を持つ形容詞です。うまい訳語が思いつきませんでしたので、英語表記のままにしてあります)
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」を意味することになります。
データはアレイ中のディスクに「ほとんど」並列に書き込まれます。実際には chunk-size
バイトのデータが順次、各ディスクに書かれるわけです。
4 KB の Chunk サイズを指定して 3 台のディスクに 16 KB を書く場合、RAID-0 システムではディスク 0, 1, 2 に 4 KB を、残りの 4 KB をディスク 0 に書くことになります。
32 KB の chunk-size は大部分のアレイで適切な値でしょうが、最適の値はドライブの数やファイルシステムの内容、その他の色々な要因に非常に依存します。最高のパフォーマンスを得るためには実験をして模索する必要があるでしょう。
書き込みについては chunk-size はアレイに影響しません。全てのデータはとにかく全てのディスクに書かれなければならないからです。しかし読み込みの場合、chunk-size でアレイのディスクから連続的にどれくらいのデータを読むかを指定します。アレイ中の全てのアクティブなディスクが同じ情報を持つので、RAID-0 のように並列に読み込めるわけです。
RAID-4 アレイへの書き込み時には、パリティディスク上でパリティ情報も更新されなければなりません。chunk-size はパリティブロックのサイズとなります。RAID-4 アレイに 1 バイトを書き込もうとすると、N-1 台のディスクから chunk-size
バイトのデータを読み込みパリティ情報を計算し、chunk-size
バイトのデータがパリティディスクに書かれることになります。
RAID-0 の場合と同様、chunk-size は読み込み性能に影響します。RAID-4 からの読み込み方はほぼ同じだからです。
RAID-5 では、chunk-size は RAID-4 の場合と完全に同じ意味を持ちます。
RAID-5 のための合理的な chunk-size は 128 KB ですが、いつものように実験して模索したいかもしれませんね。
また mke2fs のためのオプション セクションも見てください。これは RAID-5 の性能に影響を及ぼします。
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 にすべきです。小さいファイルをたくさん置くなら別ですが
自動検出は、カーネルがブート時に普通のパーティションの検出後、RAIDデバイスを自動的に検出できるようにします。
これには必要なものがいくつかあります。
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 には用をなしません。その行は削ってしまいましょう、それですべてうまくいきます。
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
ファイルシステムを載せたディスクが死んでも、いつでもフロッピーからブートすることができます。
システムを RAID 上でブートするには、ルートファイルシステム( / )が RAID デバイス上でマウントされなければなりません。これを実現する 2 つの方法を以下に示します。現在のディストリビューション(少なくとも私が知っている)は RAID デバイス上にインストールすることをサポートしていませんから、方法としては普通の(RAID ではない)パーティションにインストールを行ない、インストールが終了した後に RAID でないルートファイルシステムの内容を新しい RAID デバイスに移動します。
この方法では、これから構成しようとしている RAID とは別に予備のディスクを用意し、その上にシステムをインストールします。
mke2fs
を使う)、/mnt/newroot にマウントします。cd / find . -xdev | cpio -pm /mnt/newroot
/mnt/newroot/etc/fstab
ファイルを修正します(/dev/md?
をルートデバイスにします)。/boot
ファイルシステムをアンマウントして、その代わりにブートデバイスを /mnt/newroot/boot
にマウントします。これは次のステップで LILO をうまく走らせるために必要です。/mnt/newroot/etc/lilo.conf
を修正します。ブートデバイスはまだ普通のディスク(RAID でないデバイス)でなければなりませんが、ルートデバイスは新しい RAID を示している必要があります。その作業が終わったら、
lilo -r /mnt/newrootを実行します。LILO はエラーなしで完了しなければなりません。
この作業を IDE ディスクでしているならば、BIOS で全てのディスクを「auto-detect」タイプに設定してください。そうすれば BIOS がディスクの 1台を見つけられないような時でもマシンはブートすることができるでしょう。
この方法は、failed-disk 命令の使える raidtools とパッチを使う必要があります。これは 2.2.10 以降のすべてのカーネルのための raidtools とパッチとなるでしょう。
この方法は RAID レベル 1 以上のみで使用することができます。意図的に故障とマークされたディスク上にシステムをインストールし、それからデグレードモードで走ることになる RAID にコピーし、最後に不要になった「インストールディスク」の古いシステムを消去して RAID を構築し、非デグレードモードで動作させます。
(訳注:デグレードモード "degraded mode" というのは、冗長性のある RAID の一部が故障しているが、データの完全性は保たれている状態のことです)
raidtab
ファイルのルートデバイスを failed-disk
として RAID をセットアップします。raidtab
には failed-disk
を最初のディスクとして置いてはいけません。RAID を始動する時に問題になります。RAID を構築し、ファイルシステムを作ります。raidtab
ファイルを修正し、failed-disk
とされていたディスクを普通の RAID ディスクとします。次に raidhotadd コマンドでそのディスクを RAID に組み込みます。
ルートファイルシステムをマウントすることができるカーネルのために、ルートファイルシステムが置かれるデバイスの全てのサポートはカーネルに組み込まれていなければなりません。したがって、RAID デバイス上でルートファイルシステムをマウントするためには、カーネルに RAID サポートが組み込まれていなければなりません。
カーネルから RAID デバイスが見えることを確認する普通の方法は、単に全ての必要な RAID サポートを組み込んでカーネルをコンパイルすることです。RAID サポートをローダブルモジュールではなく、カーネルに組みこんでいることを確認してください。カーネルはモジュールのロードを(ルートファイルシステムから)ルートファイルシステムがマウントされる前に行なうことはできません。
しかし RedHat 6.0 からはモジュールとして新しい RAID サポートを持つカーネルが含まれていますから、ここではどのように標準の RedHat 6.0 カーネルで RAID 上からシステムをブートさせるかについて記述します。
ブートさせるためには、LILO に RAM ディスクを使うように指示する必要があります。「ルートパーティションをマウントするのに必要な全てのカーネルモジュールを含んでいる RAM ディスクをつくれ」という mkinitrd
コマンドを使います。
このようにします。
mkinitrd --with=<module> <ramdisk name> <kernel>具体的には、このようになります。
mkinitrd --with=raid5 raid-ramdisk 2.2.5-22
これにより、カーネルがルートデバイスをマウントするために必要な RAID モジュールがブート時に存在することが保証されます。
決して、決して、決して、稼働している 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 ファイルの中のアレイに関する記述の下の方へ動かしてみてください。