mdadmを使ったRAIDの再構成

ハードディスクが壊れたときには、RAID上で壊れたハードディスクに無効のマークをつけてから、RAIDの構成情報から取り除きます。
その後物理的にハードディスクを取り外し、新しいハードディスクを取り付けてRAIDに追加します。

RAIDの状態チェック

RAIDの状態をチェックするには
mdadm -detail [RAIDデバイス名]
RAIDの状態をチェックすることができます。

[root@localhost ~]# mdadm --detail /dev/md0
/dev/md0:
        Version : 00.90.03
  Creation Time : Wed Jul 15 01:27:49 2009
     Raid Level : raid1
     Array Size : 20482752 (19.53 GiB 20.97 GB)
  Used Dev Size : 20482752 (19.53 GiB 20.97 GB)
   Raid Devices : 2
  Total Devices : 2
Preferred Minor : 0
    Persistence : Superblock is persistent

    Update Time : Fri Jul 17 01:53:52 2009
          State : clean
 Active Devices : 2
Working Devices : 2
 Failed Devices : 0
  Spare Devices : 0

           UUID : bb2db18d:ba1f4229:8dd8b038:1632a4a8
         Events : 0.8

    Number   Major   Minor   RaidDevice State
       0       3        2        0      active sync   /dev/hda2
       1       3       66        1      active sync   /dev/hdb2

もしくは
cat /proc/mdstat
とすることでRAIDの状態を確認することができます。

 [root@localhost ~]# cat /proc/mdstat
Personalities : [raid1]
md0 : active raid1 hdb2[1] hda2[0]
      20482752 blocks [2/2] [UU]

md1 : active raid1 hdb1[1] hda1[0]
      15358016 blocks [2/2] [UU]

unused devices: 

上記の情報で[UU]と成っているのはRAIDを構成する2つのドライブが正常に動いていることを示しています。
RAIDを構成するドライブに問題が発生し、認識されない状態になったりすると[U_]とになり、また構成するドライブ数が「2/1」になったり、RAIDを構成するドライブがFaultyになると[(F)]が表示されたりします。

md1 : active raid1 hdb1[2](F) hda1[0]
      15358016 blocks [2/1] [U_]

RAIDを構成するドライブに不具合が発生した場合

RAIDを構成するドライブにリードエラーが頻発するなどの不具合が発生した場合には、RAIDの構成からそのドライブを削除してドライブの交換を行います。
ドライブの交換は
mdadm -fail [RAIDデバイス名] [HDDのデバイス名]
で指定します。

 [root@localhost ~]# mdadm --fail /dev/md1 /dev/hdb1
mdadm: set /dev/hdb1 faulty in /dev/md1

このようにすることでhdb1は壊れたドライブとしてマークをつけます。
マークをつけたhdb1はRAIDを構成するドライブから削除します。
RAIDの構成から削除するには --remove コマンドを使用します。
mdadm -remove [RAIDデバイス名] [HDDのデバイス名]

 [root@localhost ~]# mdadm --remove /dev/md1 /dev/hdb1
mdadm: hot removed /dev/hdb1

もしほかのRAIDドライブを構成するメンバに、交換する予定のhdb のパーティションが含まれているのなら、そのRAIDのメンバになっているパーティションRAIDの構成情報から削除します。
その後問題のあるHDDを取り外します。

RAIDを構成するドライブの交換

問題のあるHDDを取り外し、正常なドライブと交換します。
交換するドライブは元のドライブと同じ容量か、大きい容量のものを使うようにしてください。小さい容量のものでは正常にミラーリングを構成できません。
新しいドライブを接続した状態で、電源を入れます。 BIOSのメッセージが表示されるので、F1キーを押してブートを続行します。
コンソールが起動したら管理者でログインします。
追加したドライブのドライブ名を確認します。

 [root@localhost ~]#dmesg | grep hd

交換したドライブの「hda」、「hdb」などがドライブ名になります。
新しいドライブには領域がないので、fdiskコマンドを使用して領域を作成します。

[root@localhost ~]#fdisk /dev/hdb

上記は追加した新たしいドライブが「hdb」の場合上記のようになります。 以下「hdb」を例にして話をします。
パーティションは1番目が15G、2番目が20G、残りがSwap領域になります。

このディスクのシリンダ数は 77622 に設定されています。
間違いではないのですが、1024 を超えているため、以下の場合
に問題を生じうる事を確認しましょう:
1) ブート時に実行するソフトウェア (例. バージョンが古い LILO)
2) 別の OS のブートやパーティション作成ソフト
   (例. DOS FDISK, OS/2 FDISK)

コマンド (m でヘルプ):p[領域テーブルを表示する]
Disk /dev/hdb: 40.0 GB, 40060403712 bytes
16 heads, 63 sectors/track, 77622 cylinders
Units = シリンダ数 of 1008 * 512 = 516096 bytes

デバイス Boot      Start         End      Blocks   Id  System

コマンド (m でヘルプ): 

Unitsの最後に「516096 bytes」というのがありますが、これがシリンダ当たりのバイト数になります。 このシリンダ当たりのバイト数はHDDによって変わります。
このシリンダ当たりのバイト数で目的の容量を割ることで、その領域に割り当てるシリンダ数が計算できます。
15Gの領域を作る場合
15000000000/516096=29064.3601
必要なシリンダ数は「29065」となります。
シリンダ数が計算できれば、fdiskのコマンドで「n」を入力しパーティションを作成します。

コマンド (m でヘルプ): n[n:領域を作成]
コマンドアクション
   e   拡張
   p   基本領域 (1-4)
p[基本領域作成のpを入力]
領域番号 (1-4): 1[1番目の領域に作成]
最初 シリンダ (1-77622, default 1):
Using default value 1[シリンダの始点を指定]
終点 シリンダ または +サイズ または +サイズM または +サイズK (1-77622, default 77622): 29065
[シリンダの終点を指定]

同様にして2番目の領域に20Gの領域を作成します。
3番目の領域はスワップ領域になります。 3番目の領域はドライブのあまりの領域すべてを指定して領域を作成します。
領域作成後、Linuxの領域になっているので、領域をそれぞれ設定していきます。
スワップ領域のコード番号は82、RAIDのメンバにする領域はfdを指定します。

コマンド (m でヘルプ): t    [領域のシステムIDを変更]
領域番号 (1-4): 1        [変更する領域番号を指定します]
16進数コード (L コマンドでコードリスト表示): fd  [領域をLinux raid 自動検出に変更]
領域のシステムタイプを 1 から fd (Linux raid 自動検出) に変更しました

コマンド (m でヘルプ): t
領域番号 (1-4): 2
16進数コード (L コマンドでコードリスト表示): fd
領域のシステムタイプを 2 から fd (Linux raid 自動検出) に変更しました

コマンド (m でヘルプ): t
領域番号 (1-4): 3
16進数コード (L コマンドでコードリスト表示): 82   [領域をSwap領域に変更]
領域のシステムタイプを 3 から 82 (Linux swap / Solaris) に変更しました

領域を作成したらその領域を確認し、最後にwで作成した領域をドライブに記録します。

コマンド (m でヘルプ): p[領域テーブルを表示]

Disk /dev/hdb: 40.0 GB, 40060403712 bytes
16 heads, 63 sectors/track, 77622 cylinders
Units = シリンダ数 of 1008 * 512 = 516096 bytes

デバイス Boot      Start         End      Blocks   Id  System
/dev/hdb1               1       29065    14648728+  fd  Linux raid 自動検出
/dev/hdb2           29066       38753     4882752   fd  Linux raid 自動検出
/dev/hdb3           38754       77622    19589976   82  Linux swap / Solaris

コマンド (m でヘルプ): w[テーブルをディスクに書き込み終了]
領域テーブルは交換されました!
ミラーリングの再構成

領域を作成後、作成したドライブをRAIDに追加します。
新しい領域をRAIDに追加するにはmdadmコマンドに-addオプションを使用します。

[root@localhost ~]#mdadm --add /dev/md0 /dev/hdb2
mdadm: re-added /dev/hdb2
[root@localhost ~]# cat /proc/mdstat
Personalities : [raid1]
md0 : active raid1 hdb2[1] hda2[0]
      20482752 blocks [2/1] [U_]
      [===>.................]  recovery = 18.3% (3754752/20482752) finish=13.9min speed=19948K/sec

md1 : active raid1 hda1[0]
      15358016 blocks [2/1] [U_]

unused devices: 

mdadm -addコマンドで領域を追加後、/proc/mdadm を見ると同期の進捗状況を確認することができます。
同期が終了するとミラーリング構成が正常になります。

ブートローダのインストール

ミラーリングの再構成が終了後、どちらのドライブからでも正常に起動できるように、ブートローダを両方のドライブにインストールしておきます。
以下のように入力してきます。

[root@localhost ~]# grub
 grub> root (hd0,0)
 grub> setup (hd0)
 grub> root (hd1,0)
 grub> setup (hd1)
 grub> quit

最初に grub と入力した後、すこし時間がかかるかもしれませんが、プロンプトが表示されます。
プロンプトが表示されたら、[ grub> ] に続く文字を順に入力していきます。
最後に[ quid ]でgrubを終了します。