RAID5 RAID [ FedoraCore3 Linux ]の復旧手順 [RAID1] BACK

項目 確認/設定
Partitonの表示@
現在のパーティションを調べます。(シリンダー境界で、パーティションが分割されている場合。
# fdisk -l
Disk /dev/sda: 80.0 GB, 80000000000 bytes
255 heads, 63 sectors/track, 9726 cylinders
Units = シリンダ数 of 16065 * 512 = 8225280 bytes

 デバイス Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1          64      514048+  fd  Linux raid 自動検出
/dev/sda2              65         191     1020127+  fd  Linux raid 自動検出
/dev/sda3             192        9726    76589887+  fd  Linux raid 自動検出

Disk /dev/sdb: 80.0 GB, 80000000000 bytes
255 heads, 63 sectors/track, 9726 cylinders
Units = シリンダ数 of 16065 * 512 = 8225280 bytes

 デバイス Boot      Start         End      Blocks   Id  System
/dev/sdb1   *           1          64      514048+  fd  Linux raid 自動検出
/dev/sdb2              65         191     1020127+  fd  Linux raid 自動検出
/dev/sdb3             192        9726    76589887+  fd  Linux raid 自動検出
RAIDを構成するHDのIdは、fd になっている必要があります。
Idが、83(Linux)になっている場合は、mdadm --manage /dev/mdx -a /dev/sdyn 等で、RAIDを構成(hot add)しても、rebootで、RAIDが外れる現象がおきます。
Partitonの表示A
現在のパーティションを調べます。
# fdisk -l
ディスク /dev/sda: 160.0 GB, 160000000000 バイト
ヘッド 255, セクタ 63, シリンダ 19452
Units = シリンダ数 of 16065 * 512 = 8225280 バイト
ディスク識別子: 0x00000080

デバイス ブート     始点        終点    ブロック   Id  システム
/dev/sda1               1         128     1024000   fd  Linux raid 自動検出
パーティション 1 は、シリンダ境界で終わっていません。
/dev/sda2             128         383     2048000   fd  Linux raid 自動検出
パーティション 2 は、シリンダ境界で終わっていません。
/dev/sda3             383       19452   153176158+  fd  Linux raid 自動検出

ディスク /dev/sdb: 160.0 GB, 160000000000 バイト
ヘッド 255, セクタ 63, シリンダ 19452
Units = シリンダ数 of 16065 * 512 = 8225280 バイト
ディスク識別子: 0x00000081

デバイス ブート     始点        終点    ブロック   Id  システム
/dev/sdb1               1         128     1024000   fd  Linux raid 自動検出
パーティション 1 は、シリンダ境界で終わっていません。
/dev/sdb2             128         383     2048000   fd  Linux raid 自動検出
パーティション 2 は、シリンダ境界で終わっていません。
/dev/sdb3             383       19452   153176158+  fd  Linux raid 自動検出
この様に、パーティションがシリンダー境界で終わっていない場合は、fdisk -lu コマンドで
セクター表示をさせる。(セクター単位で、パーティション構成するため。)
# fdisk -lu
ディスク /dev/sda: 160.0 GB, 160000000000 バイト
ヘッド 255, セクタ 63, シリンダ 19452, 合計 312500000 セクタ
Units = セクタ数 of 1 * 512 = 512 バイト
ディスク識別子: 0x00000080

デバイス ブート     始点        終点    ブロック   Id  システム
/dev/sda1              63     2048062     1024000   fd  Linux raid 自動検出
パーティション 1 は、シリンダ境界で終わっていません。
/dev/sda2         2048063     6144062     2048000   fd  Linux raid 自動検出
パーティション 2 は、シリンダ境界で終わっていません。
/dev/sda3         6144063   312496379   153176158+  fd  Linux raid 自動検出

デバイス ブート     始点        終点    ブロック   Id  システム
/dev/sdb1              63     2120579     1060258+  83  Linux
/dev/sdb2         2120580     6329609     2104515   83  Linux
/dev/sdb3         6329610   312496379   153083385   83  Linux
RAIDを構成するHDのIdは、fd になっている必要があります。
Idが、83(Linux)になっている場合は、mdadm --manage /dev/mdx -a /dev/sdyn 等で、RAIDを構成(hot add)しても、rebootで、RAIDが外れる現象がおきます。
RAID構成の表示
RAIDの状態を調べます。
# cat /proc/mdstat
Personalities : [raid1]
md1 : active raid1 sdb2[1] sda2[0]
      1020032 blocks [2/2] [UU]

md2 : active raid1 sdb3[1] sda3[0]
      76589760 blocks [2/2] [UU]

md0 : active raid1 sdb1[1] sda1[0]
      513984 blocks [2/2] [UU]

unused devices: <none>
上の表示は、全てのRAID1が、正常に動作していることを示しています。
mount状態の表示
HDのマウント状態を調べます。(md0,2 の部分が、RAIDデバイス)
# mount
/dev/md2 on / type ext3 (rw)
none on /proc type proc (rw)
none on /sys type sysfs (rw)
none on /dev/pts type devpts (rw,gid=5,mode=620)
usbfs on /proc/bus/usb type usbfs (rw)
/dev/md0 on /boot type ext3 (rw)
none on /dev/shm type tmpfs (rw)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
none on /var/named/chroot/proc type proc (rw)
sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw)
ファイルシステムの割付け状態
ファイルシステムの割り付け状態を表示させます。
# cat /etc/fstab
# This file is edited by fstab-sync - see 'man fstab-sync' for details
/dev/md2       /                ext3    defaults        1 1
/dev/md0       /boot            ext3    defaults        1 2
none           /dev/pts         devpts  gid=5,mode=620  0 0
none           /dev/shm         tmpfs   defaults        0 0
none           /proc            proc    defaults        0 0
none           /sys             sysfs   defaults        0 0
/dev/md1       swap             swap    defaults        0 0
/dev/hdc       /media/cdrom     auto    pamconsole,exec,noauto,managed 0 0
この情報により、SWAP領域を割当てているデバイス名(ここでは、md1)が解る。
RAID1障害時のHD復元方法 cat /proc/mdstat コマンドで、壊れているHD名を確認します。
壊れているHDのドライブのパーティションを全て、RAIDから外します。
例.(sdb3が壊れている場合)
 mdadm --manage /dev/md0 -f /dev/sdb1 (故障マークを付加 f:fault)
 mdadm --manage /dev/md0 -r /dev/sdb1 (HDの論理的な取り外し r:remove))
 mdadm --manage /dev/md1 -f /dev/sdb2
 mdadm --manage /dev/md1 -r /dev/sdb2
 mdadm --manage /dev/md2 -f /dev/sdb3
 mdadm --manage /dev/md2 -r /dev/sdb3
HDを交換して、正常に動作しているHDと同じパーティションで、FDISK、フォーマットを行ないます。FDISK時に、Id=fdを指定します。
 /sbin/fdisk /dev/sdb  (パーティションを分割します。)
 /sbin/mke2fs -j /dev/sdb1 (パーティション sdb1をフォーマット)
 /sbin/mke2fs -j /dev/sdb2 (パーティション sdb2をフォーマット)
 /sbin/mke2fs -j /dev/sdb3 (パーティション sdb3をフォーマット)
セクター単位のパーティション生成方法(u コマンドで、セクター単位の設定に変更)
[root@hpcs-g proc]# fdisk /dev/sdb
コマンド (m でヘルプ): m
コマンドの動作
   a   ブート可能フラグをつける
   b   bsd ディスクラベルを編集する
   c   dos 互換フラグをつける
   d   領域を削除する
   l   既知の領域タイプをリスト表示する
   m   このメニューを表示する
   n   新たに領域を作成する
   o   新たに空の DOS 領域テーブルを作成する
   p   領域テーブルを表示する
   q   変更を保存せずに終了する
   s   空の Sun ディスクラベルを作成する
   t   領域のシステム ID を変更する
   u   表示/項目ユニットを変更する
   v   領域テーブルを照合する
   w   テーブルをディスクに書き込み、終了する
   x   特別な機能 (エキスパート専用)

コマンド (m でヘルプ): u
セクタ数 の表示/項目ユニットを変更します

コマンド (m でヘルプ): n
コマンドアクション
   e   拡張
   p   基本領域 (1-4)
p
領域番号 (1-4): 1
最初 セクタ (63-312499999, 初期値 63):
初期値 63 を使います
Last セクタ, +セクタ数 or +size{K,M,G} (63-312499999, 初期値 312499999): 2048062

コマンド (m でヘルプ): n
コマンドアクション
   e   拡張
   p   基本領域 (1-4)
p
領域番号 (1-4): 2
最初 セクタ (2048063-312499999, 初期値 2048063):
初期値 2048063 を使います
Last セクタ, +セクタ数 or +size{K,M,G} (2048063-312499999, 初期値 312499999): 6144062

コマンド (m でヘルプ): n
コマンドアクション
   e   拡張
   p   基本領域 (1-4)
p
領域番号 (1-4): 3
最初 セクタ (6144063-312499999, 初期値 6144063):
初期値 6144063 を使います
Last セクタ, +セクタ数 or +size{K,M,G} (6144063-312499999, 初期値 312499999):
初期値 312499999 を使います

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

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

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

コマンド (m でヘルプ): w
パーティションテーブルは変更されました!

ioctl() を呼び出してパーティションテーブルを再読込みします。
ディスクを同期しています。
セクター単位でパーティションを作成したので、シリンダー境界がだぶっていますが、これで、
/dev/sda側と同じパーティションになったので、RAIDの構築が可能となります。
# fdisk -l

ディスク /dev/sdb: 160.0 GB, 160000000000 バイト
ヘッド 255, セクタ 63, シリンダ 19452
Units = シリンダ数 of 16065 * 512 = 8225280 バイト
ディスク識別子: 0x5f8413fb

デバイス ブート     始点        終点    ブロック   Id  システム
/dev/sdb1               1         128     1024000   fd  Linux raid 自動検出
パーティション 1 は、シリンダ境界で終わっていません。
/dev/sdb2             128         383     2048000   fd  Linux raid 自動検出
パーティション 2 は、シリンダ境界で終わっていません。
/dev/sdb3             383       19453   153177968+  fd  Linux raid 自動検出
RAIDに追加します。
 mdadm --manage /dev/md0 --add /dev/sdb1
 mdadm --manage /dev/md1 --add /dev/sdb2
 mdadm --manage /dev/md2 --add /dev/sdb3
RAID再構成中の表示例(下図の例では、md2デバイスが再構成中であることが解る。)
# cat mdstat
Personalities : [raid1]
md2 : active raid1 sdb3[2] sda3[0]
      153176064 blocks [2/1] [U_]
      [>....................]  recovery =  0.9% (1464768/153176064) finish=69.0min speed=36609K/sec

md1 : active raid1 sdb2[1] sda2[0]
      2047936 blocks [2/2] [UU]

md0 : active raid1 sdb1[1] sda1[0]
      1023936 blocks [2/2] [UU]

unused devices: <none>
reboot しても、RAIDの構成が保存されていることを確認します。

参考URL
Software RAID HOWTO RAID設定メモ Sarge RAIDの修復 mdadm RAIDの修復
MDADM(8) ManPage

Update 2010/07/30