13 June 2009

Openfiler RAID-1デグレードの復旧 (/dev/sdaの破損時)

RAID-1のマスター側(/dev/sda)のハードディスクの故障から復旧する手順をまとめたもの

GRUBブートローダを、スレーブ側にも書き込む (非常に重要)

OpenfilerのインストーラでRAID-1としたシステムパーティションは、スレーブ側(/dev/sdb)にはGRUBブートローダが書き込まれていないため、当然、スレーブ側のみ生き残った状態では立ち上げることは出来ない。

で、正常稼動時に、マスター側、スレーブ側双方に強制的にGRUBブートローダをインストールする。


[root@localhost grub]# grub

GNU GRUB version 0.95 (640K lower / 3072K upper memory)

[ Minimal BASH-like line editing is supported. For the first word, TAB
lists possible command completions. Anywhere else TAB lists the possible
completions of a device/filename.]

grub> root (hd1,0)
Filesystem type is ext2fs, partition type 0xfd

grub> setup (hd1)
Checking if "/boot/grub/stage1" exists... yes
Checking if "/boot/grub/stage2" exists... yes
Checking if "/boot/grub/e2fs_stage1_5" exists... yes
Running "embed /boot/grub/e2fs_stage1_5 (hd1)"... 16 sectors are embedded.
succeeded
Running "install /boot/grub/stage1 (hd1) (hd1)1+16 p (hd1,0)/boot/grub/stage2 /boot/grub
/grub.conf"... succeeded
Done.

grub> root (hd0,0)
Filesystem type is ext2fs, partition type 0xfd

grub> setup (hd0)
Checking if "/boot/grub/stage1" exists... yes
Checking if "/boot/grub/stage2" exists... yes
Checking if "/boot/grub/e2fs_stage1_5" exists... yes
Running "embed /boot/grub/e2fs_stage1_5 (hd0)"... 16 sectors are embedded.
succeeded
Running "install /boot/grub/stage1 (hd0) (hd0)1+16 p (hd0,0)/boot/grub/stage2 /boot/grub
/grub.conf"... succeeded
Done.

grub> quit

片側のハードディスクが故障した場合の起動試験

/dev/sda 側のハードディスクを取り外して、再起動したところ


[root@localhost ~]# cat /proc/mdstat
Personalities : [raid6] [raid5] [raid4] [raid10] [raid1]
md1 : active raid1 sda2[1]
522048 blocks [2/1] [_U]

md2 : active raid1 sda3[1]
144512 blocks [2/1] [_U]

md0 : active raid1 sda1[1]
1020032 blocks [2/1] [_U]

/dev/sdb 側のハードディスクを取り外して、再起動したところ


[root@localhost ~]# cat /proc/mdstat
Personalities : [raid6] [raid5] [raid4] [raid10] [raid1]
md1 : active raid1 sda2[0]
522048 blocks [2/1] [U_]

md2 : active raid1 sda3[0]
144512 blocks [2/1] [U_]

md0 : active raid1 sda1[0]
1020032 blocks [2/1] [U_]

GRUBブートローダを双方に書き込んだので、どちら側からでも起動できることが分かる。

マスター側が故障した場合の復旧手順

マスター側のHDD(故障)を取り出し、スレーブ側HDDをマスター側に接続する。 (これは、新しいディスクをマスター側に入れると、ブートローダが無いため起動できないから)

新しいHDDをスレーブ側に接続する。
そして、サーバを起動する。

RAIDの状況を確認する。 スレーブ側がデグレードしている。


[root@localhost ~]# cat /proc/mdstat
Personalities : [raid6] [raid5] [raid4] [raid10] [raid1]
md1 : active raid1 sda2[1]
522048 blocks [2/1] [_U]

md2 : active raid1 sda3[1]
144512 blocks [2/1] [_U]

md0 : active raid1 sda1[1]
1020032 blocks [2/1] [_U]

20090613-of16.png
Openfilerの管理用GUIから見ると、このように表示される。

/dev/sda側と同じように、/dev/sdbにパーティションを作成する。


[root@localhost ~]# fdisk /dev/sda ← 正常なディスクの状態表示

Command (m for help): p

Disk /dev/sda: 2147 MB, 2147483648 bytes
255 heads, 63 sectors/track, 261 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

Device Boot Start End Blocks Id System
/dev/sda1 * 1 127 1020096 fd Linux raid autodetect
/dev/sda2 128 192 522112+ fd Linux raid autodetect
/dev/sda3 193 210 144585 fd Linux raid autodetect

Command (m for help): q

[root@localhost ~]# fdisk /dev/sdb
Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel
Building a new DOS disklabel. Changes will remain in memory only,
until you decide to write them. After that, of course, the previous
content won't be recoverable.

Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite)

Command (m for help): p ← 新しいディスクにパーティションが何も無いことを念のため確認

Disk /dev/sdb: 2147 MB, 2147483648 bytes
255 heads, 63 sectors/track, 261 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

Device Boot Start End Blocks Id System

Command (m for help): n ← 以下、正常な方に合わせてパーティションを作成
Command action
e extended
p primary partition (1-4)
p
Partition number (1-4): 1
First cylinder (1-261, default 1):
Using default value 1
Last cylinder or +size or +sizeM or +sizeK (1-261, default 261): 127

Command (m for help): n
Command action
e extended
p primary partition (1-4)
p
Partition number (1-4): 2
irst cylinder (128-261, default 128):
Using default value 128
Last cylinder or +size or +sizeM or +sizeK (128-261, default 261): 192

Command (m for help): n
Command action
e extended
p primary partition (1-4)
p
Partition number (1-4): 3
First cylinder (193-261, default 193):
Using default value 193
Last cylinder or +size or +sizeM or +sizeK (193-261, default 261): 210

Command (m for help): p ← とりあえず、出来たパーティションを表示してみる

Disk /dev/sdb: 2147 MB, 2147483648 bytes
255 heads, 63 sectors/track, 261 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

Device Boot Start End Blocks Id System
/dev/sdb1 1 127 1020096 83 Linux
/dev/sdb2 128 192 522112+ 83 Linux
/dev/sdb3 193 210 144585 83 Linux

Command (m for help): t ← パーティションのタイプをRAIDに変更
Partition number (1-4): 1
Hex code (type L to list codes): fd
Changed system type of partition 1 to fd (Linux raid autodetect)

Command (m for help): t
Partition number (1-4): 2
Hex code (type L to list codes): fd
Changed system type of partition 2 to fd (Linux raid autodetect)

Command (m for help): t
Partition number (1-4): 3
Hex code (type L to list codes):fd
Changed system type of partition 3 to fd (Linux raid autodetect)

Command (m for help): p ← 最終的に、正常な方のパーティションとサイズ、タイプが同じことを確認

Disk /dev/sdb: 2147 MB, 2147483648 bytes
255 heads, 63 sectors/track, 261 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

Device Boot Start End Blocks Id System
/dev/sdb1 1 127 1020096 fd Linux raid autodetect
/dev/sdb2 128 192 522112+ fd Linux raid autodetect
/dev/sdb3 193 210 144585 fd Linux raid autodetect

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.

パーティションが作成できたら、リビルドを行う。


[root@localhost ~]# mdadm /dev/md0 --add /dev/sdb1
mdadm: re-added /dev/sdb1
[root@localhost ~]# mdadm /dev/md1 --add /dev/sdb2
mdadm: re-added /dev/sdb2
[root@localhost ~]# mdadm /dev/md2 --add /dev/sdb3
mdadm: re-added /dev/sdb3

[root@localhost ~]# cat /proc/mdstat ← リビルド状況の表示
Personalities : [raid6] [raid5] [raid4] [raid10] [raid1]
md1 : active raid1 sdb2[2] sda2[1]
522048 blocks [2/1] [_U]
resync=DELAYED

md2 : active raid1 sdb3[2] sda3[1]
144512 blocks [2/1] [_U]
resync=DELAYED

md0 : active raid1 sdb1[2] sda1[1]
1020032 blocks [2/1] [_U]
[======>..............] recovery = 34.1% (348864/1020032) finish=0.5min speed=20521K/sec

全て終了すれば、この章の最初にある 「GRUBブートローダを、スレーブ側にも書き込む (非常に重要)」 を忘れず実施しておく。

参考にしたホームページ
RAID構成ハードディスク交換
「mdadm」によるRAID5の構築