RAID 1 でのドライブ障害に対処する (Linux 2.6.xx + mdadm)

2007/07/16 公開
2007/08/05 更新

私は以前 Vine Linux 3.1 を使用していたのですが、 Debian 4.0 (etch) へ乗り換えました。 Vine Linux 3.1 は 2.4 系の Linux カーネルでしたが、 Debian 4.0 (etch) は 2.6 系のカーネルです。Vine Linux 3.1 の RAID 管理ツールは raidtools でしたが、Debian 4.0 (etch) の RAID 管理ツールは mdadm です。

最近、ディスク・ドライブに障害が発生したため、障害に対処したので、事例として紹介したいと思います。 なお、 2.4 系の Linux カーネルと raidtools の組合せでの障害への対応(ディスクの交換)はこちらに記載しています。

hda に障害発生し RAID 1 から hda1 が切り離される

システムの root アカウント宛のメールは、私が普段使用しているメール・アドレスへ転送するように設定しています。 RAID 1 を構成する一方のディスクが障害によって切り離されたことを示す以下のメールが届きました。 mdadm が root アカウント宛に送信したメールです。

This is an automatically generated mail message from mdadm
running on pluto.nabe.bne.jp

A DegradedArray event had been detected on md device /dev/md0.

Faithfully yours, etc.

P.S. The /proc/mdstat file currently contains the following:

Personalities : [raid1] 
md0 : active raid1 hdc1[1]
      39094080 blocks [2/1] [_U]
      
unused devices: 

/var/log/syslog を確認すると、以下のようなログが残っていました。

Jul 14 03:20:49 pluto kernel: hda: lost interrupt
Jul 14 03:21:09 pluto kernel: hda: dma_timer_expiry: dma status == 0x21
Jul 14 03:21:19 pluto kernel: hda: DMA timeout error
Jul 14 03:21:19 pluto kernel: hda: dma timeout error: status=0x58 { DriveReady 
SeekComplete DataRequest }
Jul 14 03:21:19 pluto kernel: ide: failed opcode was: unknown
Jul 14 03:21:19 pluto kernel: raid1: Disk failure on hda1, disabling device. 
Jul 14 03:21:19 pluto kernel: ^IOperation continuing on 1 devices
Jul 14 03:21:20 pluto kernel: RAID1 conf printout:
Jul 14 03:21:20 pluto kernel:  --- wd:1 rd:2
Jul 14 03:21:20 pluto kernel:  disk 0, wo:1, o:0, dev:hda1
Jul 14 03:21:20 pluto kernel:  disk 1, wo:0, o:1, dev:hdc1
jul 14 03:21:20 pluto kernel: RAID1 conf printout:
Jul 14 03:21:20 pluto kernel:  --- wd:1 rd:2
Jul 14 03:21:20 pluto kernel:  disk 1, wo:0, o:1, dev:hdc1
Jul 14 03:21:20 pluto mdadm: Fail event detected on md device /dev/md0, compone
nt device /dev/hda1

このログからは、 hda からの割り込みを失ったことにより、 hda の DMA がタイムアウトしてしまったと読み取れます。 その結果、 hda1 が無効にされ RAID 1 から切り離されたようです。

割り込みを失ったことが原因ですので、情報を記録しているディスクが壊れたわけではなさそうです。 割り込みを失ってしまった原因は、ディスク・ドライブである気はしますが、 IDE コントローラにあるかもしれませんし、チップセットにあるかもしれません。 全てのデバイスを一旦リセットした方がよさそうです。 外向きのサービス(Web サーバ)を予備のマシンへ引き継ぎ、このマシンを再起動することにします。

後から気づいたのですが、 hda5 はスワップ・パーティションとして使用しています。 hda に障害が起きたので、 hda5 も影響が波及し、スワップ・パーティションも無効になってもおかしくありません。 しかし、ログには、スワップ・パーティションが無効になった記録はありませんでした。

Grub の Stage 1 を hdc の MBR へインストールする

hda1 と hdc1 の2つのパーティションを組みにして RAID 1 を構成していました。 Grub の Stage 1 は hda の MBR にインストールされています。 もし、 hda の MBR からブートできず、かつ、 hdc の MBR に Grub の Stage 1 がインストールされていなければ、 Linux を起動することが不可能になります。

本来ならば、障害が起きる前に hdc の MBR に Grub の Stage 1 をインストールしておくべきです。 しかし、 MBR を逆アセンブルして確認したところ、インストールされていないことが分かりました。 そこで、マシンを再起動する前に、 hdc の MBR に Grub の Stage 1 をインストールすることにします。

# grub-install /dev/hdc

念のため、 hdc の MBR に Grub の Stage 1 がインストールできたか確認します。 まず、 hdc の MBR をファイルへ書き出します。 次に MBR を逆アセンブルします。 また、 /boot/grub/stage1 も逆アセンブルします。 それぞれ逆アセンブルした結果を比較し、大きく違いがないことを確認します。

# dd if=/dev/hdc of=hdc_mbr.bin bs=512 count=1
# objdump -b binary -D -m i8086 hdc_mbr.bin > hdc_mbr.disasm
# objdump -b binary -D -m i8086 /boot/grub/stage1 > stage1.disasm
# diff -y hdc_mbr.disasm stage1.disasm

システムを再起動する

通常の手順で再起動します。 hda の MBR から通常通り起動することができました。 Grub の Stage 1 を hdc の MBR へインストールしましたが、今回の再起動のためには不要だったようです。

以下のメールが root アカウント宛に届きました。 hda1 のデータが古いため RAID1 から切り離されたようです。

This is an automatically generated mail message from mdadm
running on pluto.nabe.bne.jp

A DegradedArray event had been detected on md device /dev/md0.

Faithfully yours, etc.

P.S. The /proc/mdstat file currently contains the following:

Personalities : [raid1] 
md0 : active raid1 hdc1[1]
      39094080 blocks [2/1] [_U]
      
unused devices: 

hda1 を RAID 1 に再追加する

hda1 は RAID 1 から切り離されているので、 mdadm --add で hda1 を再度 RAID 1 に追加します。 hda1 はアクティブではないので、改めて hda1 に対し mdadm --fail や --remove を実行する必要はないようです。

# mdadm /dev/md0 --add /dev/hda1

すぐに RAID 1 の再構成が始まります。 1, 2 時間後には再構成は完了します。 再構成が完了した後の /dev/mdstat は次のようになります。

Personalities : [raid1]
md0 : active raid1 hda1[0] hdc1[1]
      39094080 blocks [2/2] [UU]

unused devices: 

Copyright (C) 2007 Nabe, All right reserved.