ファイルサーバとしての拡張2 - SoftwareRAID5でテラバイト -

['05/03/20] 初稿
['05/05/01] アップ
■はじめに
■ストレージ構成再考
 こちらのページにまとめたように,現在の内蔵ディスク の状況は,hdc に接続していた 5A250J0 がディスククラッシュにより交換のやむなきを得て, 現在は WD2500JB に交換したという変更はあるものの,250GB*3の合計750GBの構成に変りは ありません.そしてこれに対応すべく,バックアップ方法を こちらのページに記載したように,IEEE1394a で接続した 250GBディスク4本で取るようにしました.しかし,X4HD-1394 を Linux で使用すると何故か Hot Plug 周りでトラブることがあり,難渋していたのは先のページに記載した通りです.

 その後, MPEG2 ハードエンコードキャプチャカード が 調子良く Linux で動きWebベースで容易に録画予約出来るようになった関係で, ディスク使用量やファイルの出入りも半端でなくなりました.そして何とかディスク容量を 増やしたいと考えたものの,Terminator TU のベイ数の制約からこれ以上ディスクを追 加できず,より大容量の物に交換するにしても,400GBのディスクは依然高値安定.そして それよりも何よりも『内蔵ディスク容量を増やす』ということは『バックアップ手段の再検討』 も必要になってきます

 そのようなわけで,

  • Linuxで安定して利用できるバックアップ先の確保
  • 大容量なストレージエリアの確保
  • 今後の拡張も含めた汎用性の確保

 と,いう3つのニーズを満たすべくストレージ構成再考を行うことにしました.

 実現手段にはいくつかの方法が考えられますが,最も単純なのは『外付けディスクを USB/IEEE1394で数珠繋ぎに沢山接続する』という方法です.しかし,ゴロゴロと机の下に 単体の外付けディスクが転がっているという状況は,想像しただけでゾッと します.ACアダプタがコンセントにタコ足配線になり,少しでも足を少し伸ばしたらディスク を蹴飛ばしてディスクが転倒!そしてクラッシュ!なんてことになりかねません…

 改めて今回要求される事柄を具体的に検討しますと,以下のような感じになります.

  • USB2.0またはIEEE1394aでの外付け
  • 単体ではなく,複数のディスクを物理的・論理的にまとめて接続できるように
  • 多少速度は遅くても良い(MPEG2ファイルの再生ではせいぜい15Mbpsくらい出ればよい)
  • 安定性を高め,耐障害性を持つ物にしたい
  • 複数ディスクを単体として使用するのではなく,フラットな領域として使用したい

■Software RAID
 複数ディスクを使用し,フラットな領域として使用すると共に耐障害性を持たせる方法 としては,RAIDの利用が考えられます.RAIDと言うと,真っ先にエンタープライズ向けの ハードウエア RAID アレイ,またはストライピング等を行って高速アクセス可能にする コンシューマ向けのRAIDチップ/カード(*)(RAID1:ミラーが出来るものも大半ですが)が 想像されます.しかし,前者はコスト的に高いために導入が困難で,後者は今回の用途 には向きません.辛うじて手が届く価格帯に,ミドル〜ハイエンドユーザ向けの RAID5 に対応した RAID カードも販売されてはいますが,現在 TU には PCI の空きスロットは ありません.そのため,この類のカードの導入も選択肢として外れます.

(*)この手のチップ/カードは,ドライバ側でソフト的に処理を行うものも 多く,実際には Software RAID と言っても良い物が大半です.

 ではどういった方法で…と,なるわけですが,Linux には md ドライバというものが 存在し,大抵のディストリビューションでは kernel に内蔵されています.そして md ドライバは特殊なカードを使用せず, ソフト的に RAID アレイを構築できるように なっており,Linux から単体ディスクとして利用できるディスクを束ねて RAID 化する ことが可能になります.

 RAID に関する詳細な解説は割愛させて頂きますが,今回の用途に使用する場合は RAID5 が最も適切であると考えられます.例えば 250GB のディスク3本でRAID5アレイ を構築した場合,実容量 500GB.4本で構築した場合は 750GB のフラットな空間を確保 することが可能となります.そしてディスクの内容は,冗長化して複数ディスクに分散し て記録されるため(RAID5の場合はパリティも記録される),アレイを構成するディスクが 1本がクラッシュした場合でもそのままサービスは停止しません.そして故障したディスク 1本を交換してリビルドを行うことにより,ディスク上のデータそのままで元の耐障害性を 持った構成に戻すことが出来ます.

 その他 md ドライバを使用して Software RAID を構築するメリットを列挙しますと, 以下のようになります.

  • 専用ハードを使用しない
  • 追加コストがかからない
  • メーカーのハード/ドライバの永続的なサポートを期待しなくても良い
  • オープンソースで開発されているため,永続的な(フォーマットの)サポートが望める
  • Linuxが動作する環境であれば,容易に構築が可能
  • トラブル発生時には,別の Linux BOX に接続すればデータサルベージも可能

 RAID5 を利用する場合は,パリティ計算のために XOR 演算を多用するわけですが,昔は 良好な性能を得るために専用演算チップを用いるのが一般的でした.その 関係もあり, 『Software RAID は実用的なスピードで動作しない』と言われていた時代も あったわけですが,最近は滅茶苦茶とも言えるほど CPU の高速化が行われた関係で, XOR 演算を CPU 側で行ったとしても,実用上問題のないレベルにあると言えます.逆に高速 な CPU を搭載している PC であれば,専用のハードウエアで RAID アレイを構築するよりも 高速で動作する場合もあります.

 しかし,IDE 接続などで Software RAID を構築した場合,Hardware RAID では一般的 な Hot Swap が利用できません.Hot Swap とは,故障が発生したディスクを, システムの電源を落とすことなく交換可能な機構です.そのため,IDE ベースの Software RAID の場合,ディスクを交換する場合は本体の電源を落とす必要があり,RAID化 していないディスクよりも耐障害性が高いとは言え,無停止システムというわけには行かな くなります.

 と,まぁ様々なメリット・デメリットがあるわけですが,今回のような用途には Software RAID の導入は非常に魅力的なソリューションと言えます.一方,多少コストを かけても良いので手間を省きたいということであれば,以下のような製品を利用するのも 良いかと思います.

○内蔵用 Hardware IDE RAID
 areca製ARC-5010 5inch ベイ3本を利用すると,IDE ディスク5本を利用した Hot Swap 対応の Hardware RAID を組むことが出来ます.この製品は PC側インターフェイスが IDE となっており,本体側から は巨大な IDE ディスクとして認識されます.国内では 8万円台後半〜10万円程で売られている ようです.なお,同社からはPC側インターフェイスをSCSIにしたARC-6010等もあります.

○RAID5に対応した低価格NAS
 Buffaloから,IDEディスク4本を内蔵するGbE(Giga bit Ethernet)接続のNASが販売 されています( TeraStation ).内部的には組込用 Linux が動作しており,Software RAID により,RAID5 化も可能です. 店頭では10万円を切る価格で売られています.最近はハックも進んでおり,シリアル コンソールを接続してログインしたり,色々と弄ったりも出来るようになってきている ようです.

■IEEE1394a 外付けディスクでSoftware RAID5
 さて,具体的な話に戻しますと,今回は複数台のディスクを USB/IEEE1394a 経由で接続し, Software RAID5 化して運用するという方針 が決まりました.次に行うべきは構成の決定です.

 まずは使用するディスクですが,低発熱,高信頼性,低価格の3点を考慮し, Western Digital 製の WD2500JB にしました.1台辺りの容量は 250GB です. そして必要台数の試算に移るわけですが,最低限,内蔵ディスクのバックアップ のために3台が必要になります.そして RAID5 化するためには冗長化のために 1台余計に必要になりますので,合計4台です.これで実容量 750GB の RAID アレイが構築可能になります.

 しかし,今回は『耐障害性を高める』という方針もありますので,1台はスペア ディスクとして用意し,ホットスタンバイ(*2)にすることにしました.これでディス クが故障したことに気が付かずに放置していても,2台目が壊れるまでは冗長性が 確保されます.と,ここまでで合計ディスク数は5台になりました.

(*2)ホットスタンバイ:
 常に通電状態になっており,利用中のディスクに問題が発生したときには自動的に このディスクが代替ディスクとして使われる

 次に接続形態ですが,単体の外付けディスクを数珠繋ぎで接続するのは何かと 不便なため,出来るだけ1台のケースにまとめて収納したいと考えたわけですが, この手の製品を調べてみますと,4台内蔵タイプの1つ上のグレードは,8台の ディスクを内蔵するタイプが一般的です.そして接続インターフェイスは USB2.0 のものが少なくなり,IEEE1394a のものばかりです.

 具体的な製品としてこのような用途に合致する物を探してみますと, こちらでちらっと触れたように, このような製品 が存在します.先のページでも触れましたが,発売当初は少々トラブルも あったようですが,現在は対策されているだろうと考え,これを導入することにしました. また,リンク先のページでは Century 扱いのものが紹介されていますが,同じ製品 (OEM元が同じでモデルも同じ)である Owltech OWL-EB58P を購入することにしました. OWLTECH 扱いの方を選択したのは,値段と入手性を考えてのことです.

 と,ここまで読み進めておそらく結末の想像が付いたかと思いますが,結局の所, 『繋がるだけ繋げてしまえ』とばかりに8台接続することにしました.WD2500JB の 価格は 2004/12月の時点で 13,790円になっていたため,新規に6台購入.そしてこれまで 外付けケースに入れて使用していた2台を使い回し,内蔵用の合計8台を用意しました. そして故障時の交換用にということで,後日新たに2台調達しました.

 また,沢山のドライブを内蔵するため,冷却に関しても何らかの手を打った方が良いと 考え,ケース本体の他に,マウンターとしての機能もある,Lian Li EX-34B も2台購入 して使用することにしました.

■IEEE1394a 外付けケース
■Owltech OWL-EB58P
OWLTECH OWL-EB58P
2004/11月中旬にフェイスの通販で購入.23,590円也.箱はかなり巨大です.店頭で購入し て担いで帰ろうなどと思ってはいけません :-)
ケースのサイズは180(W)*426(D)*433(H)mm.ATXミドルタワーケースくらいの大きさです.
ケースはこんな感じ.PC用ケースと比べると,やや横幅がスリムという感じです.
奥行きは 5inchドライブの奥行き+α程度ではなく,結構あるので設置場所には注意.
ケースの下の方に,アクセスランプ4つ(各IEEE1394a<->IDE変換カードに対して1つづつ), 電源ランプ,電源ボタンがあります.
ケース背面.最上段は排気用 8cmファン*2,最下段はサービスコンセント付きの 300W電源です.そしてIEEE1394a用のコネクタが沢山並んでいますが,ここには4枚の IEEE1394a<->IDE 変換基盤が取り付けられており,それぞれを数珠繋ぎで接続すること により,8台までのデバイスを接続出来るようになっています.そして左には audio 用の RCA コネクタが出ています.この変換基盤には,ディスクに限らず ATAPI 機器を 接続可能になっており,CD-ROM ドライブなどを接続したときにはこのコネクタを経由 して,音声出力を行うことが可能であることを意味しています.
300W電源.冷却用の 8cm ファンは予想に反してかなり静かです.
IEEE1394a変換基盤取り付け部のアップ
冷却用 8cmファンのアップ.こちらも予想に反して静かなタイプになっておりますが, 風量は充分に確保されています.
コの字型のスチールの蓋を引き出すという,一昔前に良くあったような PCケースと同じ構造になっています.メンテナンス性はあまり高くありません.
仕上げはそこそこ丁寧ですが,手を切らないように 注意.案の定,私は血だらけになりました :-<
蓋を開けて横から見た状態.IDEケーブルや電源ケーブル,ネジなど一通りのものは ケースの中に収められて出荷されています.
上からケースの中を見た状態.
ケース上部の冷却ファン
ケース背面
ケーブルやネジ,その他はケースに収められていますので,出します.
内容物一覧
簡単なマニュアル.ディジーチェーン接続や変換カードに関しての説明があります
内蔵されている300W電源.Mapower製で 115V/230V(日本で使う場合,本当は115Vに 昇圧した方が良いかも),60/50Hz対応です.容量は+5Vに16A,+12Vに18Aです.
変換カード.1枚に対してIDEデバイス2つ接続できます.変換チップはOxfordのOXFW911
■Lian Li EX-34B
Lian Li EX-34B (黒). 綺麗な化粧箱に入っています.Faithの通販で 2004/12月に 3590円で購入.
仕様.3本の5.25inchベイを使い,3.5インチディスクを4台マウント可能です.また, 冷却ファンが取り付けられています.
説明書きは箱にあります.
冷却ファンは12cmのタイプ.12V/0.24Aです.実際に動かすとかなり静かです.
ディスク4台を取り付けた状態.下に這い出ているケーブルは,ファン用の電源です.
後から見るとこんな感じ.ディスク間に若干スペースが空きますが,高密度に実装されています.
全面には冷却ファンがあり,その前にはスポンジ状の防塵フィルタが付いています. これで送風することにより,ディスクのオーバーヒートを防ぐわけです.
ディスク取り付けネジには防振用のゴムが付いています.これを付けることにより, 共振やウナリを防ぐようになっています.
正面の防塵フィルタ
取り付け時には,防塵フィルタの前に,異物が入らないようにするためのカバーを取り付けます.
ケースへ取り付けるとこんな感じ.
IEEE1394aケーブルはこんな感じでディジーチェーンして行きます.
設置した状態.奥行きがかなりあるのでTerminator TUに比べて特に大きく感じます.

 静音化対策を行った Terminator と比較すると流石にうるさく感じますが,所謂マシン ルームに置くような RAID アレイと比較するとその静かさは雲泥の差.一般のデスクトップ PC と比較しても,少しうるさい程度の部類に収まると思います.

■SoftRAID化
■SoftRAID化の準備
 ディスクを一通り取り付け,PC 本体に IEEE1394a で接続することにより, 単体ディスクとして認識出来るようになります.RAID化の前に内蔵した8台 全てのディスクがきちんと認識されることをまずは確認します.

 IEEE1394 経由で接続した場合,Linux では SCSI ディスクとして認識される わけですが,USB/IEEE1394/SCSI に他に何も接続していない場合は,内蔵した8台 のディスクは sda 〜 sdh としてデバイス名がアサインされます.物理的にどの ディスクがどの名前にアサインされたか,そしてケース上で対応するアクセスラン プはどれか等,この時点で確認しておくのが良いでしょう.

 例えは hdparm -tT /dev/sda を実行すると,sda の速度を計測することが 出来ます.このときにどのディスクが動作しているかを見るわけです.

 私の環境では,本体からディジーチェーンで遠い順にsdaから振られていることが 分かりました.

 次に SoftRAID 化の準備として,各ディスクをパーティション分けします.fdisk コマンドを使用し,各ディスク上に容量をフルに使用するパーティションで切って いきます(sda1〜sdh1を作成).

 なお,パーティションIDはデフォルトでは 83(Linux) になりますが,fdisk の t コマンド(領域のシステム ID を変更する)を使用し,fd (Linux raid 自動) にしておいてください.

# fdisk -l /dev/sda

Disk /dev/sda: 250.0 GB, 250059350016 bytes
255 heads, 63 sectors/track, 30401 cylinders
Units = シリンダ数 of 16065 * 512 = 8225280 bytes

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

■SoftRAID化に使用するパッケージ
 md ドライバを使用した SoftRAID は,Linux のディストリビューションによって 利用できるフロントエンドコマンドが異なり,若干設定方法が異なります.私は Vine3.1(相当) を使用している関係で,ここでは raidtools を使用して設定する 方法に関して解説することにします,

 まず,"rpm -qa |grep raid"と実行し, raidtools のパッケージがインストール されていることを確認して下さい.インストールされていない場合はインストールし て下さい.私の環境では,raidtools-1.00.3-8vl2 がインストールされていました.

■/etc/raidtabの設定
 md を使用した RAID アレイは,/dev/md? として認識されます.1つのみ RAID アレイを構築する場合,/dev/md0 となります.そして今回は

  • 8台のディスク(sda〜sdh)を使用
  • RAID5 化
  • 1台ホットスタンバイ

    という構成のため,/etc/raidtab は以下のように記述しました(各項目の意味が 分かりやすいようにコメントも入れてありますが,これは抜いておいて下さい).

    raiddev /dev/md0                # /dev/md0 の設定は以下の通り
        raid-level                5        # RAID5 を指定
        nr-raid-disks             7        # RAIDには7台のディスクを使用
        nr-spare-disks            1        # ホットスペアとして1台使用
        persistent-superblock     1        # superblock に構成を書き込む(RAID構成を自動認識)
        parity-algorithm          left-symmetric # パリティ計算のアルゴリズム
        chunk-size                32        # チャンクサイズ(チューニングの余地有り)
    
        device                    /dev/sda1    # デバイス名 /dev/sda1 は…
        raid-disk                 0        # RAIDの0台目である
        device                    /dev/sdb1    # デバイス名 /dev/sdb1 は…
        raid-disk                 1        # RAIDの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    # デバイス名 /dev/sdh1 は…
        spare-disk                0         # (ホット)スペアディスクの1台目である
    

  • ■RAID アレイを構築
     mkraid /dev/md0を実行し,上記 /etc/raidtab で指定した構成通りの RAID アレイを構築します.

     なお,コマンドを実行すると即リターンされますが,この段階では RAID アレイ の構成が書き込まれて利用できる状態になっているだけであり,実際には『RAIDアレイ』 としては不完全です./prc/mdstatを cat すると分かりますが,この時点では, リビルドをかけている状態と同じになります.そのため,この処理が終わるまでは パフォーマンスが著しく低下します.

     RAIDアレイの(再)構築終了までの概算時間は /proc/mdstat で確認することが 出来ますが,IEEE1394a 外付けディスクを使用した私の構成では,約24時間もの時間 が必要でした.IDE 接続や SCSI 接続の場合は,数時間で終わると思います.

    ■/dev/md0のフォーマット
     /dev/md0 は,普通の1台のディスクとして見えます.当然ながらフォーマット しないと利用できません(ただし,パーティション分けの必要はありません/出来ません).

     そこで任意のファイルシステム形式でフォーマットを行いましょう.容量が容量ですので ext2 のようなジャーナリングを行わない形式を利用しますと,fsck 等を行わざるを得ない 状況に陥る場合があった際に泣きを見ます.大抵の Linux ディストリビューションの kernel には,ジャーナリングに対応した形式として, ext3 や reiserfs が元々入っています.

     使い慣れている ext3 形式でも良かったのですが,Software RAID で利用する場合に パフォーマンスが良く,何かと操作が軽い reiserfs を利用することにしました( mkfs.reiserfs /dev/md0 でフォーマット).

     ext3 でフォーマットを行うとかなり長時間待たされますが,reiserfs でフォーマットを 行うと,あっという間に終了します.なお,多少速度は落ちますが,RAID アレイの (再)構築中であってもフォーマットは行えますので,平行してフォーマットを行っておいた 方が良いでしょう.

    ■RAID アレイの mount と利用
     フォーマットが終わったら,mount して使用してみましょう.適当なディレクトリ を作成し,mount コマンドでマウントします.なお,mount の実行やファイルの書き込み 等は RAID アレイの(再)構築中であっても問題なく行えます.
    # mkdir /export/fwdisk1      (mountポイントの作成)
    # mount /dev/md0 /export/fwdisk1 (mount を実施)
    # df                (mount 状況や空きエリアの確認)
    ....
    

     特にエラー無く mount され,ファイルの読み書きが出来ていれば,これで Software RAID を用いた RAID アレイの構築は完了です.

    ■運用と障害時の対応
    ■起動時の自動認識
     Vine3.1 の場合,起動時に自動的に md ドライバが立ち上がり,その時点で Linux のコントロール下に置かれているディスクをチェックし,前述した 『RAID自動認識』になっているパーティションが存在した場合,自動で md? と して当該 RAID アレイを利用可能にします.この機構は,ディスクが IDE や SCSI 等で接続されていれば問題なく利用できるのですが,USBやIEEE1394接続のような 場合は若干問題が発生します.何故なら,md ドライバが動き始めた時点で RAID アレイとして設定されているディスクが認識されていないからです.

     より具体的に説明すると,USB や IEEE1394 接続のディスクを利用するためには, まず USB や IEEE1394 を利用するためのドライバが読み込まれ,デバイスが接続 されたことが認識され,そして接続されたデバイスに対応したドライバが動作する ことによってようやく利用可能になります.しかし,これら一連のシーケンスは, mdドライバが起動した後,遙か彼方でようやく実行されるようになっています.

     そこでエレガントな対応策ではありませんが,md ドライバが読み込まれる直前で 外付けディスクを利用するために必要なドライバを強引に読み込ませることにしました. 編集を行ったファイルは,/etc/rc.d/rc.sysinit です.

    # Load modules (for backward compatibility with VARs)
    if [ -f /etc/rc.modules ]; then
            /etc/rc.modules
    fi
    
    rc_splash "start md"
    # for IEEE1394a disk
    modprobe ohci1394
    modprobe ieee1394
    modprobe ide-scsi
    modprobe sbp2
    
    # Add raid devices
    if [ ! -f /proc/mdstat ]; then
            modprobe md >/dev/null 2>&1
    fi
    
    if [ -f /proc/mdstat -a -f /etc/raidtab ]; then
            echo -n $"Starting up RAID devices: "
    

     太字で書いた部分を追加します.この変更により,起動時に自動的に『外付け IEEE1394a ディスクを認識→ md ドライバスタート → RAID アレイのスタート』というシーケンスが 実行されるようになります.

     難点は,一度 RAID の整合性チェックに行くようになるため,起動シーケンス終了までに 2,3分余計にかかるようになってしまったことでしょうか….

     なお,USB 外付けディスクを使用して RAID 化したい場合は,必要モジュールが 異なりますので,適時読み替えて設定を変更するようにしてください.

    ■障害時の自動復旧と障害対応
     RAID化することにより『RAIDアレイ』としての耐障害性は高まりますが,ディスク 単体としての信頼性は単体ディスクとして利用した場合と変りません.すなわち, 壊れるときは壊れ,許容台数を超えてディスクがクラッシュした場合は,RAID アレイ としても崩壊するということです.

     明日クラッシュするか,○年後にクラッシュするかは神のみぞ知るですが, いずれはディスクは壊れます.そのときに慌てないために,どう対処したら良いかと いうのを本格運用前に予行演習しておいた方が良いでしょう.

     下記の状態は,たまたま何かの拍子にディスクが1台死んだ状態になった ときの様子です.

    # cat /proc/mdstat
    Personalities : [raid5]
    read_ahead 1024 sectors
    md0 : active raid5 sdh1[7] sdg1[6](F) sdf1[5] sde1[4] sdd1[3] sdc1[2] sdb1[1] sd
    a1[0]
          1465175424 blocks level 5, 32k chunk, algorithm 2 [7/6] [UUUUUU_]
          [>....................]  recovery =  0.6% (1691204/244195904) finish=1229.
    1min speed=3286K/sec
    unused devices: < none>
    

     このように,『sdg1[6](F)』となっており,sdgのディスクがクラッシュしたことが 示されています.そしてホットスペアとして sdh1 を確保していたので,sdg1 の代わり にこの領域が利用され,再構築されている様子が分かります.

     まずは死んだディスクを RAID アレイから論理的に抜くことにします.

    #raidsetfaulty /dev/md0 /dev/sdg1 (故障フラグを立てる)
    #raidhotremove /dev/md0 /dev/sdg1 (RAIDアレイから抜く)
    
    #cat /proc/mdstat        (現在のRAIDアレイの状況を確認)
    Personalities : [raid5]
    read_ahead 1024 sectors
    md0 : active raid5 sdh1[7] sdf1[5] sde1[4] sdd1[3] sdc1[2] sdb1[1] sda1[0]
          1465175424 blocks level 5, 32k chunk, algorithm 2 [7/6] [UUUUUU_]
          [>....................]  recovery =  2.1% (5350648/244195904) finish=1198.
    0min speed=3320K/sec
    unused devices: < none>
    
    # lsraid -A -p          (アレイを構成する各ディスクの詳細表示)
    [dev   9,   0] /dev/md0         63B3CE19.5EED0DDD.37899B44.D791BD17 online
    [dev   8,   1] /dev/sda1        63B3CE19.5EED0DDD.37899B44.D791BD17 good
    [dev   8,  17] /dev/sdb1        63B3CE19.5EED0DDD.37899B44.D791BD17 good
    [dev   8,  33] /dev/sdc1        63B3CE19.5EED0DDD.37899B44.D791BD17 good
    [dev   8,  49] /dev/sdd1        63B3CE19.5EED0DDD.37899B44.D791BD17 good
    [dev   8,  65] /dev/sde1        63B3CE19.5EED0DDD.37899B44.D791BD17 good
    [dev   8,  81] /dev/sdf1        63B3CE19.5EED0DDD.37899B44.D791BD17 good
    [dev   ?,   ?] (unknown)        00000000.00000000.00000000.00000000 missing
    [dev   8,  113] /dev/sdh1        63B3CE19.5EED0DDD.37899B44.D791BD17 spare
    
    [dev   8,  97] /dev/sdg1        63B3CE19.5EED0DDD.37899B44.D791BD17 unbound
    

     と,このように,故障した sdg ドライブが RAID アレイから抜かれたことが 確認できます.一応補足しておきますと,RAID の再構築が終わるまでは,ホット スペアとして確保されおり,再構築に利用されているディスクは spare 扱いに なります(上記 sdh1).

     壊れたディスクを物理的に交換し(再構築中にshutdownしてから電源を落とし, 交換してもかまいません),再構築終了後にもう一度現在の状態を見ると以下の ようになります.なお,以下の表示を行った際には,sdg1 は再度 RAID アレイに 参加させるためにパーティションは既に切ってあります.

    # cat /proc/mdstat   (再構築が終了しているのを確認)
    Personalities : [raid5]
    read_ahead 1024 sectors
    md0 : active raid5 sdh1[6] sdf1[5] sde1[4] sdd1[3] sdc1[2] sdb1[1] sda1[0]
          1465175424 blocks level 5, 32k chunk, algorithm 2 [7/7] [UUUUUUU]
    
    unused devices: < none>
    
    # lsraid -A -p    (現在の状態を詳細表示)
    [dev   9,   0] /dev/md0         63B3CE19.5EED0DDD.37899B44.D791BD17 online
    [dev   8,   1] /dev/sda1        63B3CE19.5EED0DDD.37899B44.D791BD17 good
    [dev   8,  17] /dev/sdb1        63B3CE19.5EED0DDD.37899B44.D791BD17 good
    [dev   8,  33] /dev/sdc1        63B3CE19.5EED0DDD.37899B44.D791BD17 good
    [dev   8,  49] /dev/sdd1        63B3CE19.5EED0DDD.37899B44.D791BD17 good
    [dev   8,  65] /dev/sde1        63B3CE19.5EED0DDD.37899B44.D791BD17 good
    [dev   8,  81] /dev/sdf1        63B3CE19.5EED0DDD.37899B44.D791BD17 good
    [dev   8,  113] /dev/sdh1        63B3CE19.5EED0DDD.37899B44.D791BD17 good
    
    [dev   8,  97] /dev/sdg1        63B3CE19.5EED0DDD.37899B44.D791BD17 unbound
    
    # lsraid -R -p   (raidtab 形式で現在の状態を表示)
    
    
    # This raidtab was generated by lsraid version 0.7.0.
    # It was created from a query on the following devices:
    #       /dev/md0
    #       /dev/sda
    #       /dev/sda1
    #       /dev/sdb
    #       /dev/sdb1
    #       /dev/sdc
    #       /dev/sdc1
    #       /dev/sdd
    #       /dev/sdd1
    #       /dev/sde
    #       /dev/sde1
    #       /dev/sdf
    #       /dev/sdf1
    #       /dev/sdg
    #       /dev/sdg1
    #       /dev/sdh
    #       /dev/sdh1
    #       /dev/hdc
    #       /dev/hdc1
    #       /dev/hda
    #       /dev/hda1
    #       /dev/hda2
    #       /dev/hda3
    #       /dev/hdb
    #       /dev/hdb1
    
    # md device [dev 9, 0] /dev/md0 queried online
    raiddev /dev/md0
            raid-level              5
            nr-raid-disks           7
            nr-spare-disks          1
            persistent-superblock   1
            chunk-size              32
    
            device          /dev/sda1
            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/sdh1
            raid-disk               6
    

     sdh1 がスペア扱いではなく,実稼働領域としてアサインされているのが確認 できます.

     次に交換した sdg1 を RAID アレイに追加します.

    # raidhotadd /dev/md0 /dev/sdg1   (RAIDアレイに追加)
    
    # cat /proc/mdstat          (ステータスを表示)
    Personalities : [raid5]
    read_ahead 1024 sectors
    md0 : active raid5 sdg1[7] sdh1[6] sdf1[5] sde1[4] sdd1[3] sdc1[2] sdb1[1] sda1[0]
          1465175424 blocks level 5, 32k chunk, algorithm 2 [7/7] [UUUUUUU]
    
    unused devices: %lt none>
    
    # lsraid -A -p            (詳細表示)
    [dev   9,   0] /dev/md0         63B3CE19.5EED0DDD.37899B44.D791BD17 online
    [dev   8,   1] /dev/sda1        63B3CE19.5EED0DDD.37899B44.D791BD17 good
    [dev   8,  17] /dev/sdb1        63B3CE19.5EED0DDD.37899B44.D791BD17 good
    [dev   8,  33] /dev/sdc1        63B3CE19.5EED0DDD.37899B44.D791BD17 good
    [dev   8,  49] /dev/sdd1        63B3CE19.5EED0DDD.37899B44.D791BD17 good
    [dev   8,  65] /dev/sde1        63B3CE19.5EED0DDD.37899B44.D791BD17 good
    [dev   8,  81] /dev/sdf1        63B3CE19.5EED0DDD.37899B44.D791BD17 good
    [dev   8,  113] /dev/sdh1        63B3CE19.5EED0DDD.37899B44.D791BD17 good
    [dev   8,  97] /dev/sdg1        63B3CE19.5EED0DDD.37899B44.D791BD17 spare
    
    # lsraid -R -p            (raidtab形式で表示)
    
    # This raidtab was generated by lsraid version 0.7.0.
    # It was created from a query on the following devices:
    #       /dev/md0
    #       /dev/sda
    #       /dev/sda1
    #       /dev/sdb
    #       /dev/sdb1
    #       /dev/sdc
    #       /dev/sdc1
    #       /dev/sdd
    #       /dev/sdd1
    #       /dev/sde
    #       /dev/sde1
    #       /dev/sdf
    #       /dev/sdf1
    #       /dev/sdg
    #       /dev/sdg1
    #       /dev/sdh
    #       /dev/sdh1
    #       /dev/hdc
    #       /dev/hdc1
    #       /dev/hda
    #       /dev/hda1
    #       /dev/hda2
    #       /dev/hda3
    #       /dev/hdb
    #       /dev/hdb1
    
    # md device [dev 9, 0] /dev/md0 queried online
    raiddev /dev/md0
            raid-level              5
            nr-raid-disks           7
            nr-spare-disks          1
            persistent-superblock   1
            chunk-size              32
    
            device          /dev/sda1
            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/sdh1
            raid-disk               6
            device          /dev/sdg1
            spare-disk              0
    

     と,このように,sdg1 がスペアディスクとして追加されたことが分かります.

    ■障害時の対応2
     複数の変換基盤を使用していたり,外部配線によるケーブリングの不安要因が 存在する場合,ケーブルがコネクタから脱落し,複数台のディスクが一度に見え なくなるという事故が発生する可能性があります.このような場合,RAID5では 2台以上のディスクがクラッシュしたのと同じ状態になり,RAID アレイはサービス を停止します.そして再びケーブルを接続して再起動したとしても,そのままでは 復活することはありません.

     md ドライバは,(persistent-superblock 設定次第ですが)RAID を構成する ディスクに対し,当該のパーティションはどの RAID アレイに属しているか等の 情報を書き込み,かつ,定期的にステータス情報をアップデートします.この 機構が存在することにより,ディスクの接続順が変り,デバイス名が変更になった 場合でも自動的に調整され,問題なく利用することが出来るわけです.しかし, 上記のような障害を抱えた場合はこの仕組みが徒となり,RAID アレイから一旦 外れたパーティションは,対応を行わない限り,再び元の RAID アレイに参加する ことが出来ません.

     このような状態に陥った /dev/md0 を復活させる場合は,発生した障害を 物理的に解決した後,mkraid コマンドを以下のように実行します.

      mkraid <あるオプション> --dangerous-no-resync /dev/md0

     この『あるオプション』は誤用すると非常に重篤な障害を引き起こすため, ドキュメント化するなとのことですので,ここではあえて書きません.この オプションを抜いてコマンドを実行し,その際に表示されるメッセージを読んで 『あるオプション』とは何かを見付けてみて下さい.

     この他,RAID の構成を変更しようとする際に,一度 RAID アレイに参加させた パーティションを使い回そうとすると,『既にデータが書き込まれている』 とのエラーでコマンドが実行できない場合があります.これも上記の 『あるオプション』を使用することにより,問題を回避することが出来ます.

     なお,/etc/raidtab の内容は,最新の構成に適時アップデートしておくことを お勧めします.再構築が発生した際などには構成が変ることになり,障害発生時に このファイルの設定を元に障害復旧しようとすると,逆に深刻なダメージを与える ことになってしまいます.

    ■容量の拡張
     ディスクを8台内蔵可能なケースを購入し,最初は4台で運用するが,いずれは 8台フルに使いたいということを考えている人も多いと思います.Software RAID を使用する場合,このようなニーズにも柔軟に対応可能です.

     まず,元々の RAID アレイの構成(拡張前)を /etc/raidtab.org ,拡張後 の構成を /etc/raidtab というファイル名で保存しているとします.内容はraidtab 形式です.つまり,拡張後は nr-raid-disks や デバイス設定が増える形になって いると思います.

     まず,追加するディスクのパーティション分けをして Linux から認識させ, 次に 『raidreconf -o /etc/raidtab.org -n /etc/raidtab -m /dev/md0』 と, コマンドを実行します.すると RAID アレイの容量が拡大します.

     次に,ext2 の場合は resize2fs,ReiserFS の場合は resize_reiserfs を使用し, 例えば 『resize_reiserfs /dev/md0』 のように実行します.このようにする ことにより,容量を拡張することが可能です.

     ただし,250GB と 400GB のパーティションを混在させて総容量を増やすような ことは出来ませんのでご注意下さい.必ず容量の小さいパーティションの方に合わ せられることになります.

    ■まとめ
     運用開始から半年が経とうとしていますが,その間目立ったトラブルもなく,至って順調に 動作しています.やはりフラットな広大な空間は使い勝手も良く,ディスククラッシュが 即データの消失に繋がらない領域ということも相まって,非常に満足の行くものになりました. 安定稼働した結果,内蔵ディスクのバックアップも頻繁に行えるようになり,システムトータル としての耐障害性も高まったと言えましょう.

     しかし,速度は IEEE1394a にぶら下がっているためか,Linux からベタに使用すると 20MB/sec 程の速度が出るのですが,利用時の CPU 負荷がやや高く,特に samba 経由で 複数クライアントからファイルの読み書きが発生した際には大幅にパフォーマンスが低下します.

     そういった意味では,IEEE1394a 外付けディスクで構築した Software RAID アレイは, 高いパフォーマンスを必要とする用途には不向きであるように思います (インターフェイスカードにボトルネックがあるような気もします.使用している インターフェイスチップ/カードによっては,良好なパフォーマンスが出るのかもしれません).

     とは言え,私が当初考えていた用途にはピッタリはまり,大容量の倉庫として大活躍中です.

     そんなこともあり,ガシガシ使っていたら以下のような状態になってしまいました.これでも, 大量の DVD-R にデータを書き出した後の状態です…

    ファイルシステム    1k-ブロック   使用中      空き 使用% マウント場所
    /dev/hda3            239708324 167205236  65197212  72% /
    /dev/hda1               132207     30116     95265  25% /boot
    /dev/hdb1            241263968 171414516  67398336  72% /export/hd1
    /dev/hdc1            240362656 217014264  23348392  91% /export/hd2
    none                    249136         0    249136   0% /dev/shm
    /dev/md0             1465130704 1279525080 185605624  88% /export/fwdisk1
    

     RAID アレイを構成するディスクを 400GB のディスクに置き換える日も,そう遠いことでは 無いかもしれません…

    ※ディスクを使用してのバックアップ方法の記事をSoftware Disign 2005年3月号に書かせて頂く 際に,紙面の関係で大幅に内容を割愛する必要が発生しました.本ページの内容は,この記事の 補足という形で雑誌の発売に間に合わせて公開するつもりでおりましたが,気が付いたら5月まで ずれ込んでしまいました…

     


    『Asus Terminator 活用メモ』 へ戻る