The Software-RAID HOWTO Jakob OEstergaard (jakob@ostenfeld.dk) v. 0.90.6 31st of October 1999 笠井 宗 (kasai@tairon.co.jp) v.1.0 04 December 1999 この HOWTO では、Linux で Software RAID を使う方法について記述します。 まずは ftp://ftp.fi.kernel.org/pub/linux/daemons/raid/alpha から入手可 能な RAIDパッチを入手する必要があります。HOWTO の原文は http://osten- feld.dk/~jakob/Software-RAID.HOWTO/ にあります。 ______________________________________________________________________ 目次 1. イントロダクション 1.1 Disclaimer/放棄声明 1.2 必要条件 2. なぜ RAID なのか? 2.1 専門的事項 2.2 用語 2.3 RAID レベル 2.3.1 予備ディスク 2.4 RAIDでのスワッピング 3. ハードウェアの問題 3.1 IDE 構成 3.2 ホットスワップ 3.2.1 IDE ドライブのホットスワップ 3.2.2 SCSI ドライブのホットスワップ 3.2.3 SCA によるホットスワップ 4. RAID セットアップ 4.1 一般的なセットアップ 4.2 リニアモード 4.3 RAID-0 4.4 RAID-1 4.5 RAID-4 4.6 RAID-5 4.7 The Persistent Superblock 4.8 Chunk サイズ 4.8.1 RAID-0 4.8.2 RAID-1 4.8.3 RAID-4 4.8.4 RAID-5 4.9 mke2fsのためのオプション 4.10 自動検出 4.11 RAID でブート 4.12 RAID 上のルートファイルシステム 4.12.1 方法 1 4.12.2 方法 2 4.13 RAID でブートするシステムを作る 4.13.1 モジュールを使用して RAID でブート 4.14 落し穴 5. テスト 5.1 ドライブの故障をシミュレーションする 5.2 データの破壊をシミュレーションする 6. 再構築 6.1 複数ディスクの故障からの回復 7. パフォーマンス 7.1 RAID-0 7.2 TCQ による RAID-0 7.3 RAID-5 7.4 RAID-10 8. クレジット ______________________________________________________________________ 1. イントロダクション この howto は Jakob OEstergaard によるものです。著者と Ingo Molnar (mingo@chiara.csoma.elte.hu) -- RAID 開発者のうちの 1 人 --、 Linux- RAID メーリングリスト(linux-raid@vger.rutgers.edu) と他の人々との間で 交わされた多くの電子メールに基づくものです。 Software-RAID HOWTO がすでに存在するにもかかわらず、この HOWTO が書か れたのにはわけがあります。それは古い HOWTO では、普通のカーネルに既に ある旧式の Software RAID についてしか書かれていないからです。この HOWTO は、より最近開発された新しいスタイルの RAID の使い方について記述 してあります。新しいスタイルの RAID には旧式の RAID にはない、多くの機 能があります。 標準の 2.2.X カーネルは、この HOWTO で記述される新しい RAID を直接サポ ートしていませんから、パッチが必要になります。標準の 2.2.X カーネルで の RAID サポートはバグが多く、新しいスタイルの RAID ソフトウェアにある 重要ないくつかの機能が欠けています。 この執筆時点では 2.4 のカーネルが出る時には(希望的観測によると 今年 1999 年のクリスマス頃)、新しいスタイルの RAID が組み込まれそうです。 しかしそれまでは、安定版カーネルに手でパッチを当てる必要があります。 Alan Cox の手による -ac カーネルを使いたいかもしれませんね。それらの 内、いくつかは新しいRAIDが含まれています。それなら、カーネルにパッチを 当てる手間がはぶけます。 あなたが既に RAID について知っているなら、この HOWTO の情報にはつまら ないものもあるかもしれませんが、そういう所は読み飛ばしてしまってくださ い。 1.1. Disclaimer/放棄声明 無保証− RAID は私には安定しているように見えますし、他の多くの人々にとっても安 定しているようですが、うまく動作しないかもしれません。あなたが全てのデ ータを失い、仕事を失い、トラックにはねられるような事になったとしても、 それは私や開発者の責任ではありません。RAID ソフトウェアやこの情報は、 あなた自身の責任(at your own risk)で利用してください。ソフトウェアに もこの情報にも一切の保証はありません。実験の前に、全てのあなたのデータ をバックアップするように!転ばぬ先の杖です。 断っておきますが、私自身は Software RAID の安定性に関する問題にあった ことは一度もありません。ごく少数のマシンでしか私は使っていませんが、何 の問題も起きていませんし、不可思議なクラッシュがおきたり、不安定だとい う人も見たことがありません。 1.2. 必要条件 この HOWTO では、最近の 2.2.x か 2.0.x カーネルに対応した raid0145 パッチを当てたものと、raidtools のバージョン 0.90 を使っていると仮定し ます。どちらも ftp://ftp.fi.kernel.org/pub/linux/daemons/raid/alpha で 見つけられます。RAID パッチ、raidtools パッケージ、カーネルは、きちん と対応しているバージョンを使ってください。RAID パッチが最新のカーネル に利用できないならば、古いカーネルを使うように。 (訳注:日本国内からは ftp://ftp.jp.kernel.org/pub/linux/daemons/raid/alpha/ が利用できます。 翻訳時点での最新版は、以下の通りです) RAID パッチ raid0145-19990824-2.0.37.gz raid0145-19990824-2.2.11.gz raidtools raidtools-19990824-0.90.tar.gz 2. なぜ RAID なのか? RAID を使うと良いことがたくさんあります。例えば、複数のディスクをより 大きく「仮想的な」デバイスに結合する能力、パフォーマンス向上、そして冗 長性です。 2.1. 専門的事項 Linux RAID は、ほとんどのブロック型デバイス上で動作します。使用するハ ードディスクが IDE、SCSI、もしくは両者が混在していようと、それは重要な 事ではありません。ネットワーク越し (Network Block Device - NBD) でうま くいったという報告さえあります。 ドライブに対するバスの速度は充分に速い必要があります。各ドライブが 10 MB/s の能力があり、バス幅が 40 MB/s しかないような場合 は、UW(UltraWide) バス 1 本に 14 台の UW-SCSI ドライブを接続するような ことはしない方がよいでしょう。また IDE バスなら、1 本のバスにデバイス は 1 台だけにするべきです。IDE ディスクをマスター/スレーブ構成にする のはパフォーマンスが悪くなります。IDE では1 台以上のドライブがあるバス に対するアクセスは良くありません。最近のマザーボードは、普通は 2 本の IDE バスを持っていますから、よけいなコントローラを買うことなしに 2 台 のディスクで RAID を構成することができます。 RAID レイヤは、ファイルシステムのレイヤとはまったく関係ありません。通 常のブロックデバイスと同様に、RAID デバイスの上にはどんなファイルシス テムでも構築できます。 2.2. 用語 「RAID」という語は「Linux Software RAID」を意味するものとします。この HOWTO では Hardware RAID については扱いません。 装置構成について記述する場合には、ディスクの数とサイズの表記を決めてお くと便利です。文字 N は、ディスクアレイ(予備ディスクを含まない)の中 で、アクティブなディスクの数を示すものとします。文字 S は特に断らない 限り、ディスクアレイの中で最も小さいドライブのサイズとします。文字 P はディスクアレイの中の1台のディスクのパフォーマンスを表し、単位は MB/s とします。このP を使う場合には、すべてのディスクが同等の性能だと仮定し てますが、それは常に正しいとは言えないかもしれません。 「デバイス」と「ディスク」がほぼ同じ意味で使われている点に注意してくだ さい。通常、RAID デバイスを構築するために使われるデバイスはディスクの パーティションであり、必ずしもディスク全体である必要はありません。です が 1 台のディスクの上でいくつかのパーティションを結合して RAID にして も意味をなさないので、デバイスとディスクは単に「異なるディスク上のパー ティション」を意味するものとします。 2.3. RAID レベル Linux RAID パッチでサポートされることを簡単に書いておきます。非常に基 礎的な RAID の情報ですが、Linux における RAID レベルの実装で特別なもの については、多少記述してあります。RAID をよく知っている人はこのセク ションをスキップしてください。なにか問題があったら戻ってくればいいので す :) 現在の Linux 用 RAID パッチがサポートするのは以下の各レベルです− o リニアモード o 複数のディスクが、1 台の物理的なデバイスに結合されるモードです。 ディスクはお互いに「追加される」ので、RAID デバイスに書きこむと、最 初にディスク 0 に、一杯になったら次にディスク 1 に、また一杯になっ たらディスク 2 に、と書き込まれることになります。各ディスクは同じサ イズである必要はありません。サイズはここでは重要ではないのです :) o このレベルには冗長性はありません。1 台のディスクがクラッシュする と、おそらく全てのデータを失う可能性があります。ですがファイルシス テムからデータの大きなかたまりが抜け落ちるわけですから、運良く残っ た部分から若干のデータを回復できることも可能性としてはあります。 o 読み書きのパフォーマンスは単独の read/write では向上しませんが、複 数のユーザーがデバイスを使う場合、あなたが第 1 のディスクにアクセス している瞬間に、他の誰かが第 2 のディスクにアクセスしているというこ とが起こり得ます。そのような場合、パフォーマンスは向上します。 o RAID-0 o 「ストライプ」モードとも呼ばれます。リニアモードと似ていますが、読 み書きが複数のデバイスに並列に行われるところが違います。各々のデバ イスはほぼ同じサイズである必要があります。全てのアクセスが並列に実 行されるので、複数のデバイスは全て同じように使われます。1 つのデバ イスが他より飛び抜けて大きい場合、その特別のスペースは RAID デバイ スとして使われますが、デバイスの終わりの方にアクセスするときには、 このより大きいディスクだけにアクセスすることになり、当然パフォーマ ンスは悪化します。 o リニアモードと同様、このレベルにも冗長性はありません。リニアモード と違うのは、1 台のドライブが故障した場合でもあっても、一切のデータ を救うことができないということです。RAID-0 からドライブを取り外すと すると RAID デバイスのある部分の連続的なブロックが欠落するというわ けではなく、デバイスの至る所が小さい穴だらけになるといった感じで しょうか。多分 e2fsck はそのようなデバイスからほとんど何も回復する ことはできないでしょう。 o 読み書きのパフォーマンスは向上します、読み書きはデバイス上で並列に 実行されるからです。これが、通常 RAID-0 を走らせることの主な理由で す。バスが充分に速ければ、パフォーマンスは N * P MB/s に近くなりま す。 o RAID-1 o これは実際に冗長性を持つ最初のモードです。RAID-1 は 2 台以上のディ スクがあれば利用できます。予備のディスクを用意しておくこともできま す。このモードは、1 台のディスクを他のディスクで正確にミラーするわ けです。もちろん各ディスクは同じサイズでなければなりません。1 台の ディスクが他より大きいとしても、RAID デバイスは最も小さいディスクと 同じサイズになってしまいます。 o N-1 台までのディスクが取り外されても(または故障しても)、データはま だすべて完全です。利用できる予備ディスクがあり、システム(SCSI ドラ イバーや IDE チップセットなど)が生き残っている場合、ドライブ故障の 発見後、直ちにミラーの再構築が予備ディスクのうちの 1 台で始まりま す。 o 読み込みのパフォーマンスは N * P に近い値になりますが、書きこみはデ バイスが 1 台の場合と同等以下になります。読み込みは並列動作できます が、書きこみでは CPU が N 回データを送らなければならないからです(N 個のデータの同一のコピーが各ディスクに送られなければならないので す)。 o RAID-4 o この RAID レベルは、あまり使われません。3 台以上のディスクがあれば 使うことができます。情報を完全にミラーする代わりに、1 台のドライブ にパリティ情報を保って、他のディスクには RAID-0 のような方法でデー タを書くわけです。1 台のディスクがパリティ情報のために予約されるた め、アレイのサイズは (N - 1) * S となります。S は最も小さいもののサ イズです。RAID-1 の場合のように、ディスクのサイズは同等であるべきで す。さもないと上の (N - 1) * S の公式に従い、アレイで最も小さいドラ イブのサイズである S によって足を引っ張られることになります。 o 1 台のドライブが故障しただけならパリティ情報が使われ、全てのデータ を再現できます。2 台のドライブが故障すると、全てのデータが失われま す。 o このレベルがあまり使われないのは、パリティ情報が 1 台のドライブに集 中してしまうからです。他のディスクのうちの 1 台に書きこみが起こるた びに、この情報は更新されなければならないのです。つまりパリティディ スクが他より充分速くないと、ボトルネックになってしまいます。たまた ま多くの遅いディスクと非常に速いディスクを持っているようなら、この RAID レベルは役に立つかもしれません。 o RAID-5 o より多くの物理ディスクを結合してさらに冗長性を持たせたいとき、これ はおそらく最も役に立つ RAID モードです。RAID-5 は 3 台以上のディス クで使うことができます。予備のディスクを用意しておくこともできま す。結果として RAID-5 デバイスサイズは RAID-4 と同様に (N - 1) * S となります。RAID-5 と RAID-4 の間の大きな違いは、パリティ情報が各ド ライブに均一に分散されるということです。ですから RAID-4 のボトル ネック問題を回避することができます。 o 1 台のディスクが故障してもパリティ情報のおかげで、全てのデータは完 全です。予備ディスクが利用できるなら、デバイス故障の直後に再構築が 始まります。2 台のディスクが同時に故障してしまうと全てのデータが消 失します。RAID-5 は 1 台のディスク故障を乗り切ることができますが 2 台以上は無理です。 o 通常、読み書き両方ともにパフォーマンスは向上しますが、どの程度かを 予測することは困難です。 2.3.1. 予備ディスク 予備ディスクは、アクティブなディスクのうちの 1 台が故障するまで RAID に参加しないディスクです。デバイス故障が発見されるとそのデバイスは「不 良」とマークされ、利用できる最初の予備ディスクの上で直ちに再構築が始ま ります。 つまり RAID-5 に予備ディスクを装備すると、安全性が格段に向上することに なります。1 台のディスクが故障したとしても予備ディスクによって冗長性が 維持されていれば、そのまま動作し続けることになってもしばらくの間なら許 容できるでしょう。 ただしシステムがディスククラッシュを確実に乗り切るという保証はありませ ん。RAID レイヤはデバイス故障をうまく処理しなければなりませんが、SCSI ドライバがエラー発生時に飛んでしまったり、IDE チップセットが固まってし まったり、他にも似たようなことがいろいろ起こる可能性があります。 2.4. RAIDでのスワッピング swap の パフォーマンス向上のために RAID を使う必要はありません。fstab ファイルにおいて複数のスワップパーティションに同じ優先度を与えると、カ ーネル自身がスワップをストライプにすることができるからです。 そのための fstab の記述は− /dev/sda2 swap swap defaults,pri=1 0 0 /dev/sdb2 swap swap defaults,pri=1 0 0 /dev/sdc2 swap swap defaults,pri=1 0 0 /dev/sdd2 swap swap defaults,pri=1 0 0 /dev/sde2 swap swap defaults,pri=1 0 0 /dev/sdf2 swap swap defaults,pri=1 0 0 /dev/sdg2 swap swap defaults,pri=1 0 0 これはスワップを 7 台の SCSI デバイスで並列にする設定です。RAID の必要 はありません。これはもう長い間カーネルの機能としてあるものですから。 スワップに RAID を使うもう一つの理由は、高い可用性です。ブートのために 例えば RAID-1 デバイスにシステムをセットアップすれば、システムはディス ク・クラッシュを乗り切ることができます。しかしスワップが不良デバイスだ としたら、まず間違いなくまずいことになります。RAID-1 デバイスをスワッ プにすればこの問題を解決してくれます。 最新の RAID パッチでは RAID 上でのスワッピングは安全なはずです。以前は デッドロックの可能性があったため、RAID 上でのスワップは安全とは言えま せんでしたが、現在では修正されたはずです。 RAID デバイス上のファイルシステムで、スワップ・ファイルの中で RAID を 構成することができます。あるいは RAID デバイスをスワップパーティション として構成することもできます。例によって、RAID デバイスは単なるブロッ クデバイスなのですから。 3. ハードウェアの問題 このセクションでは、ソフトウェア RAID を走らせる場合のハードウェアに関 して述べていきます。 3.1. IDE 構成 IDE ディスク上に RAID を走らせることは、非常に現実的なことです。優れた 性能も得られます。実際、新たに RAID システムを構成する場合に、IDE ドラ イブとコントローラの今日の価格には一考の価値があります。 o 物理的安定性− IDE ドライブは、伝統的に SCSI ドライブより品質が低い ようでした。今日でさえ IDE ドライブの保証期間は概ね一年であるの に、SCSI ドライブについては 3 〜 5 年です。こういうことを言うのは フェアではないんですが、IDE ドライブは作りがお粗末で、あるブランド の IDE ドライブは SCSI ドライブより故障しやすいようです。しかし他の ブランドでは、SCSI も IDE も完全に同一のメカニズムを使っています。 要するに−遅かれ早かれディスクはすべて壊れます、それについては覚悟 しておかなければなりません。 o データ完全性− 以前は、IDE ではバスに送られるデータが実際にディスク に書かれたデータと、同じものであるだろうことを保証する方法がありま せんでした。パリティやチェックサムなどが欠落していたのです。Ultra- DMA では、IDE ドライブが受けるデータにはチェックサムが付くので、デ ータが壊れることはまずないでしょう。 o 性能− IDE の性能についてここで徹底的に書くつもりはありません。簡単 に書くと− o IDE ドライブは速い(12 MB/s 以上) o IDE は SCSI より CPU オーバーヘッドが多い(だれがそんな事を気にす る?) o IDE バス 1 本あたり 1台の IDE ドライブとすること。スレーブディスク は性能を台無しにします。 o 障害時に生き続ける− 通常 IDE ドライバは、故障した IDE デバイスが あっても死んでしまうことはありません。RAID レイヤはディスクを故障と マークして、RAID レベル 1 以上を利用しているのであれば、メンテナン スのために停止するまでマシンはきちんと動き続けるはずです。 IDE バス 1 本につき IDE ディスク 1 台だけにすることは、非常に重要で す。2 台のディスクをつなぐと性能を台無しにするだけでなく、1 台のディス クが故障すると、バス自体が故障したようになり、結局 2 台とも故障したの と同じ事になります。故障に強い RAID 構成(RAID レベル1,4,5)では、1 台 のディスクの故障は救えますが、2 台のディスクが故障(1 台のディスクの故 障のためにバス上の 2 台のディスクが使えない)すると、RAID アレイ全体が 使えなくなります。また、バス上のマスター・ドライブが故障すると、スレー ブまたは IDE コントローラが混乱するかもしれません。1 本のバスには 1 台 のドライブ。これがルールです。 PCI IDE コントローラには安いヤツがあります。80 ドルも出せば 2 本か 4 本の IDE バスが手に入ります。SCSI ディスクに対し IDE ディスクは非常に 安価ですので、典型的なシステムに付けることができる(多くても) 8 台程度 のディスクで良いなら、IDE ディスクアレイは本当に素晴らしい解だと言える でしょう(もちろん IDE コントローラのための PCI スロットの空が必要で す)。 3.2. ホットスワップ これはしばらくの間 Linux カーネル・リストのホットな話題でした。ドライ ブのホットスワップはある程度までサポートされていますが、まだ簡単なこと ではありません。 3.2.1. IDE ドライブのホットスワップ IDE は基本的にホットスワップできません。IDE ドライバがモジュール(2.2 シリーズのカーネルで可能)としてコンパイルされていて、ドライブの交換後 に再ロードすればうまく動くかもしれません。しかし IDE コントローラが揚 げ物になるかもしれませんので、素直に電源を切ってドライブを取り替えた方 がダウンタイムは短くて済むでしょう。 ハードウェアを破壊するかもしれないという電気的な問題を除くと、主な問題 はディスクが交換されたあとに IDE バスを再スキャンしなければならないと いうことです。現在の IDE ドライバではできません。新しいディスクが古い ものと 100% 同じ(ジオメトリなど)ならバスを再スキャンせずに動くかもしれ ませんが、まぁやめた方がいいでしょう。 3.2.2. SCSI ドライブのホットスワップ 普通の SCSI ハードウェアもホットスワップには対応してません。しかしうま く動作するかもしれません。SCSI ドライバがバスの再スキャン、デバイスの 取り外し、追加をサポートしていれば、ホットスワップできるかもしれませ ん。しかし普通の SCSI バスではシステムに火が入っている間、多分デバイス を引っこ抜いてはいけないはずですが、うまく動作する可能性もあります(し かしハードウェアがこんがり焼き上がって終わってしまうかもしれません)。 ディスクが死んでも SCSI レイヤ は生き残るはずですが、まだ全ての SCSI ドライバがこの状況に対応しているわけではありません。1 台のディスクがお かしくなっただけで SCSI ドライバが死ぬことになると、システム全体が道連 れになります、そんなんじゃホットプラグに興味はありません。 3.2.3. SCA によるホットスワップ SCA を使えばホットプラグデバイスになるでしょう。しかし、私にはこれを試 用するためのハードウェアがないですし、他に使っているという話も聞かな かったので、これについて述べることはできません。 これで遊びたいのであれば、SCSI と RAID の内部構造についての知識が必要 です。実際にやってみることができないのでここで書くわけにはいきません が、その代わりに 2、3 の手がかりを与えることができます− o linux/drivers/scsi/scsi.c の remove-single-device を grep o raidhotremove と raidhotadd に注目してください 全ての SCSI ドライバがデバイスの追加と削除をサポートするというわけでは ありません。カーネルの 2.2 シリーズでは、少なくとも Adaptec 2940 と Symbios NCR53c8xx ドライバがこれをサポートするようです。これについて補 足してくれる人がいれば感謝します... 4. RAID セットアップ 4.1. 一般的なセットアップ 次のものは、どの RAID レベルでも必要とするものです− o カーネル。安定版の 2.2.X または最新の 2.0.X. がいいでしょう。 o RAID パッチ。最近のカーネルに利用できるパッチが、大抵の場合ありま す。 o RAID tools o 忍耐、ピザ、お気に入りのカフェイン飲料 これら全てのソフトウェアは 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」を意味することになります。 4.8.1. RAID-0 データはアレイ中のディスクに「ほとんど」並列に書き込まれます。実際には chunk-size バイトのデータが順次、各ディスクに書かれるわけです。 4 KB の Chunk サイズを指定して 3 台のディスクに 16 KB を書く場 合、RAID-0 システムではディスク 0, 1, 2 に 4 KB を、残りの 4 KB をディ スク 0 に書くことになります。 32 KB の chunk-size は大部分のアレイで適切な値でしょうが、最適の値はド ライブの数やファイルシステムの内容、その他の色々な要因に非常に依存しま す。最高のパフォーマンスを得るためには実験をして模索する必要があるで しょう。 4.8.2. RAID-1 書き込みについては chunk-size はアレイに影響しません。全てのデータはと にかく全てのディスクに書かれなければならないからです。しかし読み込みの 場合、chunk-size でアレイのディスクから連続的にどれくらいのデータを読 むかを指定します。アレイ中の全てのアクティブなディスクが同じ情報を持つ ので、RAID-0 のように並列に読み込めるわけです。 4.8.3. RAID-4 RAID-4 アレイへの書き込み時には、パリティディスク上でパリティ情報も更 新されなければなりません。chunk-size はパリティブロックのサイズとなり ます。RAID-4 アレイに 1 バイトを書き込もうとすると、N-1 台のディスクか ら chunk-size バイトのデータを読み込みパリティ情報を計算し、chunk-size バイトのデータがパリティディスクに書かれることになります。 RAID-0 の場合と同様、chunk-size は読み込み性能に影響します。RAID-4 か らの読み込み方はほぼ同じだからです。 4.8.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 Oct 22 00:51:59 malthe kernel: (read) sdc1's sb offset: 6199872 Oct 22 00:51:59 malthe kernel: bind Oct 22 00:51:59 malthe kernel: (read) sdd1's sb offset: 6199872 Oct 22 00:51:59 malthe kernel: bind Oct 22 00:51:59 malthe kernel: (read) sde1's sb offset: 6199872 Oct 22 00:51:59 malthe kernel: bind Oct 22 00:51:59 malthe kernel: (read) sdf1's sb offset: 6205376 Oct 22 00:51:59 malthe kernel: bind Oct 22 00:51:59 malthe kernel: (read) sdg1's sb offset: 6205376 Oct 22 00:51:59 malthe kernel: bind Oct 22 00:51:59 malthe kernel: autorunning md0 Oct 22 00:51:59 malthe kernel: running: 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 デバイスに移動します。 4.12.1. 方法 1 この方法では、これから構成しようとしている RAID とは別に予備のディスク を用意し、その上にシステムをインストールします。 o 最初は、普通のシステムを予備ディスク上にインストールします。 o カーネル、パッチ、raidtools を用意し、新しい RAID 対応カーネルでシ ステムをブートします。RAID サポートはモジュールとしてロードするので なく、カーネルに組み込みます。 o 次に、ルートファイルシステムとして使う予定の RAID を設定、構築を行 ないます。これはこの文書のどこかに記述してあるように、ごく普通の方 法で行ないます。 o RAID がブート時にきちんと動作することを確認するためにシステムをリブ ートしてみます。動くはずです。 o 新しいアレイにファイルシステムを作り(mke2fs を使う)、/mnt/newroot にマウントします。 o 新しいルートファイルシステム(アレイ)に、現在のルートファイルシス テム(予備ディスク)の内容をコピーします。いろいろ方法はあります が、たとえば、このようにします。 cd / find . -xdev | cpio -pm /mnt/newroot o ルートファイルシステムとして正しいデバイスを使うために /mnt/newroot/etc/fstab ファイルを修正します(/dev/md? をルートデバ イスにします)。 o 現在の /boot ファイルシステムをアンマウントして、その代わりにブート デバイスを /mnt/newroot/boot にマウントします。これは次のステップで LILO をうまく走らせるために必要です。 o 正しいデバイスを指すように /mnt/newroot/etc/lilo.conf を修正しま す。ブートデバイスはまだ普通のディスク(RAID でないデバイス)でなけ ればなりませんが、ルートデバイスは新しい RAID を示している必要があ ります。その作業が終わったら、 lilo -r /mnt/newroot o システムを再起動します、すべてが予定通り立ち上がるのを確認してくだ さい :) この作業を IDE ディスクでしているならば、BIOS で全てのディスクを 「auto-detect」タイプに設定してください。そうすれば BIOS がディスクの 1台を見つけられないような時でもマシンはブートすることができるでしょ う。 4.12.2. 方法 2 この方法は、failed-disk 命令の使える raidtools とパッチを使う必要があ ります。これは 2.2.10 以降のすべてのカーネルのための raidtools とパッ チとなるでしょう。 この方法は RAID レベル 1 以上のみで使用することができます。意図的に故 障とマークされたディスク上にシステムをインストールし、それからデグレー ドモードで走ることになる RAID にコピーし、最後に不要になった「インスト ールディスク」の古いシステムを消去して RAID を構築し、非デグレードモー ドで動作させます。 (訳注:デグレードモード "degraded mode" というのは、冗長性のある RAID の一部が故障しているが、データの完全性は保たれている状態のことです) o 最初は、普通のシステムを 1 台のディスク(後で RAID に組み込まれま す)上にインストールします。このディスク(またはパーティション)が 最も小さいものでないことが重要です。さもないと後で RAID に加えるこ とができなくなります! o カーネル、パッチ、raidtools などを入手してきましょう。必要な RAID サポートを組み込んだ新しいカーネルで、システムがブートするようにし ます。 o raidtab ファイルのルートデバイスを failed-disk として RAID をセット アップします。raidtab には failed-disk を最初のディスクとして置いて はいけません。RAID を始動する時に問題になります。RAID を構築し、 ファイルシステムを作ります。 o リブートしてみて、予定通り RAID が立ち上がることを確認します。 o 前のセクションにおいて記述されてるのと同様のやり方で、システムファ イルをコピーして、ルートデバイスとして RAID を使うようにシステムを 再設定します。 o システムが RAID からうまくブートしたら、raidtab ファイルを修正 し、failed-disk とされていたディスクを普通の RAID ディスクとしま す。次に raidhotadd コマンドでそのディスクを RAID に組み込みます。 o デグレードモードじゃない(まともな)RAID からブートすることができる システムができているはずです。 4.13. RAID でブートするシステムを作る ルートファイルシステムをマウントすることができるカーネルのために、ルー トファイルシステムが置かれるデバイスの全てのサポートはカーネルに組み込 まれていなければなりません。したがって、RAID デバイス上でルートファイ ルシステムをマウントするためには、カーネルに RAID サポートが組み込まれ ていなければなりません。 カーネルから RAID デバイスが見えることを確認する普通の方法は、単に全て の必要な RAID サポートを組み込んでカーネルをコンパイルすることで す。RAID サポートをローダブルモジュールではなく、カーネルに組みこんで いることを確認してください。カーネルはモジュールのロードを(ルートファ イルシステムから)ルートファイルシステムがマウントされる前に行なうこと はできません。 しかし RedHat 6.0 からはモジュールとして新しい RAID サポートを持つカー ネルが含まれていますから、ここではどのように標準の RedHat 6.0 カーネル で RAID 上からシステムをブートさせるかについて記述します。 4.13.1. モジュールを使用して RAID でブート ブートさせるためには、LILO に RAM ディスクを使うように指示する必要があ ります。「ルートパーティションをマウントするのに必要な全てのカーネルモ ジュールを含んでいる RAM ディスクをつくれ」という mkinitrd コマンドを 使います。 このようにします。 mkinitrd --with= 具体的には、このようになります。 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 ファイルの中のアレイに関する記述の 下の方へ動かしてみてください。 5. テスト フォールトトレランスを得るために RAID を使う予定があり、またそれが本当 に動作するかどうかを調べるために設定をテストしたいかもしれませんね。で は、どのようにディスク故障をシミュレーションしたらよいでしょうか? はっきり言って、正常動作しているディスクで故障をシミュレーションするの は無理な話です。ドライブが死んだら何が起こるかを知ることはできません。 電気的にバスを乗っ取って、バス上の全てのドライブをアクセス不能にするか もしれません。私はこれまでそういうことが起こったことは聞いたことがあり ません。ドライブは SCSI/IDE レイヤに読込み・書込みのエラーを報告するか もしれません。そうしてくれれば RAID レイヤは状況を素直に扱うことができ るのです。ま、だいたいは期待通りに動いてくれると思います。 5.1. ドライブの故障をシミュレーションする ドライブ故障をシミュレーションしたいのなら、ドライブを外すことです。そ の場合は必ず電源を落としてからにしてください。ディスク数を減らしてデー タが生き残るかどうかについて調べたいならば、システムを停止してディスク を抜き、再起動すれば良いのです。 syslog と /proc/mdstat で RAID がどうなっているかを見ます。うまく動い ていますか? ディスク故障を乗り切るには、RAID-{1,4,5} を走らせていなければなりませ ん。デバイスが見つからないとき、リニアモードと RAID-0 は完全に破綻しま す。 ディスクを再接続(もちろん電源が落ちている状態で接続するのを忘れずに) した場合は、raidhotadd 命令で再び「新しい」デバイスを RAID に加えるこ とができます。 5.2. データの破壊をシミュレーションする RAID(ハードでもソフトでも)では、書き込み時にエラーが返らないと成功と みなされます。したがって、ディスクがエラーを返すことなくデータが壊れた ら、結局、データは破壊されるわけです。もちろんこれは起こりそうにないこ とですが、皆無ではありません。そして結果としてファイルシステムをも破壊 することになるのです。 RAID はメディア上のデータ破壊に対する保護は想定していません。したがっ て RAID システムがどうするのかを見ようとして、ディスクに故意に不正なデ ータを書き込む(例えば dd を使って)ようなことは意味のないことで す。RAID レイヤは破壊を検出しないでしょうが(RAID のスーパーブロックを 破壊しない限り)、RAID デバイス上のファイルシステムは破壊されます。 これは当然のことです。RAID はデータの完全性に対する保証ではありませ ん。ディスクが死んだ時にデータを守ってくれるものです(もちろん RAID レ ベル 1 以上)。 6. 再構築 この HOWTO を読み進んできたなら、デグレード RAID の再構築について、す でにかなりよいアイデアがあるはずです。簡単にまとめると− o システムの電源を落とす o 壊れたディスクを交換する o システムの電源を再投入する o アレイにディスクを元通りに挿入するために raidhotadd /dev/mdX /dev/sdX コマンドを使用する o 自動再構築を見てる間はコーヒーでもどうぞ ということになりましょうか。 さて、冗長分よりも多くのディスクが故障したことにより RAID が使えなくな るという事態は、普通に起こりうることです。たくさんのディスクが同じバス につながっていると、実際に起こることがあります。1台のディスククラッ シュがバスに影響を及ぼすのです。他のディスクが正常な状態でもバスがダウ ンしているので RAID レイヤに到達できず、故障とマークされるのです。1台 のディスクを冗長とする RAID-5 の上で 2台以上のディスク故障は致命的で す。 以下のセクションは Martin Bene が私に説明してくれたことであって、前述 の恐ろしいシナリオからの回復方法を記述します。それには /etc/raidtab に failed-disk の記述をする必要がありますので、カーネル 2.2.10 以降でない と動作しません。 6.1. 複数ディスクの故障からの回復 シナリオは、以下の通りです。 o コントローラが死んで、同時に 2 台のディスクがオフラインになる o 1 台のディスクが死ぬと、scsi バス上のすべてのディスクが認識されなく なる o ケーブルがはずれる... 要するに− たびたび起こる複数ディスクの一時的な故障によって RAID ス ーパーブロックの sync がうまくいかなくなり、もはや RAID アレイを初 期化できなくなった状態です。 残された道は、mkraid --force によって RAID スーパーブロックを書き直す ことです。 これがうまく動作するためには最新の /etc/raidtab が必要で、オリジナルと ぴったりマッチするデバイスと順序を守らないとうまくいきません。 アレイを始動しようとした時の syslog を見ると、各スーパーブロックのイベ ントカウントが見られます。通常、最も低いイベントカウントのディスク(つ まり最も古いもの)を除いておくのがベストです。 failed-disk なしに mkraid するとリカバリスレッドがすぐに起動し、パリ ティブロックの再構築が始まります。−いま必要なものじゃないですね。 failed-disk ありなら、正確にどのディスクをアクティブにしたいかについて 指定することができ、おそらく最善の結果のために異なる組み合わせを試して みることができます。この手順を試す間は、ファイルシステムはリードオンリ ーでマウントするようにすべきです。この方法で、私の知っている少なくとも 2 人はうまくいきました。 7. パフォーマンス このセクションでは Software RAID を使っている現実のシステムから、たく さんのベンチマークを並べてみました。 ベンチマークは かわいい プログラムで、マシンの物理メモリの 2 倍以上の サイズのファイルを使います。 ベンチマークは 1 つの大きなファイルの入出力バンド幅を計測するだけで す。大規模な read/write における最大の I/O スループットに興味があるな らば、知っている価値のある素晴らしいものです。しかしそのような数字はア レイがニューススプール、ウェブサーバ、その他、実用された場合にどの程度 のパフォーマンスが出るだろうかについては、まったく役に立たないもので す。ベンチマークの数字は「人工的な」プログラムを実行した結果であるとい うことに留意すべきです。現実のほとんどのプログラムと同じような動きをす るものではないため、これらの数字は見るのには良いけれども、現実の世界で は道具として使えるものではありません。 今のところ、私自身のマシンの結果だけです。構成は− o デュアル Pentium Pro 150 MHz o 256 MB RAM (60 MHz EDO) o IBM UltraStar 9ES 4.5 GB(SCSI U2W) × 3 o Adaptec 2940U2W o IBM UltraStar 9ES 4.5 GB(SCSI UW) × 1 o Adaptec 2940 UW o Kernel 2.2.7 + RAID パッチ 3台の U2W ディスクは U2W コントローラにぶら下がり、UW ディスクは UW コ ントローラにぶら下がっています。 このシステム上では RAID 使用の如何にかかわらず、30 MB/s 以上を SCSI バ スに強引に通すことは不可能なようです。私の推測によると、システムがかな り古いのでメモリバンド幅が SCSI コントローラの能力を制限しているようで す。 7.1. RAID-0 Read は連続したブロックの入力であり、Write は連続したブロックの出力で す。ファイルサイズは全てのテストで 1 GB でした。テストはシングルユーザ ーモードで行いました。SCSI ドライバは TCQ(Tagged Command Queueing)を 使わない設定にしました。 |Chunk size | Block size | Read KB/s | Write KB/s | | | | | | |4k | 1k | 19712 | 18035 | |4k | 4k | 34048 | 27061 | |8k | 1k | 19301 | 18091 | |8k | 4k | 33920 | 27118 | |16k | 1k | 19330 | 18179 | |16k | 2k | 28161 | 23682 | |16k | 4k | 33990 | 27229 | |32k | 1k | 19251 | 18194 | |32k | 4k | 34071 | 26976 | 上記より、RAID chunk-size を変えても性能に大きな差は出ないようです。し かし ext2fs ブロックサイズは可能な限り大きい方が良いようです。IA-32 で は 4 KB です(例えばページサイズなど)。 7.2. TCQ による RAID-0 今度は SCSI ドライバを、TCQ(Tagged Command Queueing)を使うように設定 し、キューの深さを 8 としてます。それ以外は前と同じです。 |Chunk size | Block size | Read KB/s | Write KB/s | | | | | | |32k | 4k | 33617 | 27215 | これ以上のテストはしてません。TCQ によって書込性能がわずかに向上します が、全体としては大した違いはないと言えるでしょう。 7.3. RAID-5 アレイを RAID-5 モードで構成し、同様なテストを行ないました。 |Chunk size | Block size | Read KB/s | Write KB/s | | | | | | |8k | 1k | 11090 | 6874 | |8k | 4k | 13474 | 12229 | |32k | 1k | 11442 | 8291 | |32k | 2k | 16089 | 10926 | |32k | 4k | 18724 | 12627 | chunk-size とブロックサイズの両方が実際の差を作るようです。 7.4. RAID-10 RAID-10 は「ミラー化ストライプ」、あるいは 2 つの RAID-0 アレイの RAID-1 アレイです。chunk-size は RAID-1 アレイと 2 つの RAID-0 アレイ の chunk-size です。非常に意味のある設定だと思いますが、chunk-size を 変えた場合にどうなるかというテストはしませんでした。 |Chunk size | Block size | Read KB/s | Write KB/s | | | | | | |32k | 1k | 13753 | 11580 | |32k | 4k | 23432 | 22249 | これ以上のテストはしていません。ファイルサイズは 900 MB でした。実は 4 つのパーティションはそれぞれ 500 MB で、この設定(2つの 1000 MB のアレ イの RAID-1)では 1 G のファイルのためのスペースがなかったものですか ら。 8. クレジット 以下の人々が、この文書の作成に貢献してくださいました。 o Ingo Molnar o Jim Warren o Louis Mandelstam o Allan Noah o Yasunori Taniike o Martin Bene o The Linux-RAID mailing list people o 忘れちゃった方は、ごめんなさい :) 訂正、提案、等ありましたら著者まで送ってください。それが、この HOWTO を改善できる唯一の方法です。 訳注:以下の人々が、日本語訳について指摘、アドバイスを下さいました。特 に、早川さんには当初、JF への中継役をかって出てくださいました。ありが とうございました。 o 早川仁@Asahiネット o 武井伸光