RAID5トラブル 2006/2/25

md0がまともに読めなくなった。
リブートしようにもshutdownが止まる。init 6で行けるとこまで行ってハードウェアリセット。
リブート後にresyncが始まり、その後しばらく動いてたが、また同じ現象。
どうもsdaが怪しいので本格調査。

1回目
ログとり損ねた。read errorだったと思う。要点だけメモった。雰囲気は2回目と同じ。

dev sda, sector 163415151

2回目

ata1: command 0x25 timeout, stat 0xd0 host_stat 0x61
scsi0: ERROR on channel 0, id 0, lun 0, CDB: Read (10) 00 1c bb 39 a7 00 00 18 00
Current sda: sense key Medium Error
Additional sense: Unrecovered read error - auto reallocate failed
end_request: I/O error, dev sda, sector 482032039
ATA: abnormal status 0xD0 on port 0xF085C087
ATA: abnormal status 0xD0 on port 0xF085C087
ATA: abnormal status 0xD0 on port 0xF085C087

resyncが固まる

Personalities : [raid5]
md0 : active raid5 sdd1[3] sdc1[2] sdb1[1] sda1[0]
      732587712 blocks level 5, 64k chunk, algorithm 2 [4/4] [UUUU]
      [=>...................]  resync =  9.5% (23309568/244195904) finish=9369.2min speed=392K/sec

unused devices: <none>

Personalities : [raid5]
md0 : active raid5 sdd1[3] sdc1[2] sdb1[1] sda1[0]
      732587712 blocks level 5, 64k chunk, algorithm 2 [4/4] [UUUU]
      [=>...................]  resync =  9.5% (23309568/244195904) finish=9811.1min speed=375K/sec

unused devices: <none>

... ずっとこのまま

エラーが出てるのは全部sdaなのでアレイから外す

# mdadm /dev/md0 --set-faulty /dev/sda1

degradedだが順調にresync完了

$ cat /proc/mdstat
Personalities : [raid5]
md0 : active raid5 sdd1[3] sdc1[2] sdb1[1]
      732587712 blocks level 5, 64k chunk, algorithm 2 [4/3] [_UUU]

unused devices: <none>

sdaをチェック

# badblocks -v -o ~nickle/afio/sda1_badblocks.txt /dev/sda1

... 6時間近くかかった

[nickle@itefu ~]% ls -l ~nickle/afio/sda1_badblocks.txt
-rw-r--r--  1 root root 0 2006-02-26 05:00 /home/nickle/afio/sda1_badblocks.txt

問題なさそうなので再構築

# mdadm /dev/md0 -a /dev/sda1

またエラー…

ata1: command 0x35 timeout, stat 0xd8 host_stat 0x61
scsi0: ERROR on channel 0, id 0, lun 0, CDB: Write (10) 00 00 00 30 3f 00 01 00 00
Current sda: sense key Medium Error
Additional sense: Write error - auto reallocation failed
end_request: I/O error, dev sda, sector 12351
ATA: abnormal status 0xD8 on port 0xF085C087
ATA: abnormal status 0xD8 on port 0xF085C087
ATA: abnormal status 0xD8 on port 0xF085C087
raid5: Disk failure on sda1, disabling device. Operation continuing on 2 devices

再起動したらブート中に落ちた。このメッセージは手で書き写したので不正確かも

XFS mounting filesystem md0
ata1: command 0x35 timeout, stat 0xd8 host_stat 0x61
scsi0: ERROR on channel 0, id 0, lun 0, CDB: Write (10) 00 00 00 1a 3f 00 04 00 00
Current sda: sense key Medium Error
Additional sense: Write error - auto reallocation failed
end_request: I/O error, dev sda, sector 6719
ATA: abnormal status 0xD8 on port 0xF085C087
ATA: abnormal status 0xD8 on port 0xF085C087
ATA: abnormal status 0xD8 on port 0xF085C087

recovery modeで起動したら、すごく遅いがmd0のrecoveryが進んでいる様子。
ならset faultyできるかなと思って

# mdadm /dev/md0 -f /dev/sda1

成功。sda1が外れてrecoveryが快調に走り出した。
どうせこのrecoveryに意味はないので、

# mdadm --stop --scan

sync doneだそうな。なら最初からやるな(ぉ
で、リブートしたらdegraded arrayで正常動作

ならば、writeが鬼門?最初のエラーはreadのほうだったのになぁ。
非破壊書き込み検査やってみる

# badblocks -n -s -v /dev/sda1 | tee ~nickle/afio/sda1_badblocks_write.txt
Checking for bad blocks in non-destructive read-write mode
From block 0 to 244196001
Checking for bad blocks (non-destructive read-write test)
Testing with random pattern:            1536/      244196001

お、固まった

# dmesg
ata1: command 0x25 timeout, stat 0xd0 host_stat 0x61
scsi0: ERROR on channel 0, id 0, lun 0, CDB: Read (10) 00 00 00 0f bf 00 00 80 00
Current sda: sense key Medium Error
Additional sense: Unrecovered read error - auto reallocate failed
end_request: I/O error, dev sda, sector 4031
ATA: abnormal status 0xD0 on port 0xF085C087
ATA: abnormal status 0xD0 on port 0xF085C087
ATA: abnormal status 0xD0 on port 0xF085C087

というわけで、writeが混ざるとread errorも出るらしい。ディスク交換決定。
と言いたいとこだが、雨降ってて足がないので他の原因もあたってみる。
まずはSATAケーブル交換。再度badblocks。

[nickle@itefu ~]% sudo badblocks -n -s -v /dev/sda1 | tee ~nickle/afio/sda1_badblocks_write.txt
Password:
Checking for bad blocks in non-destructive read-write mode
From block 0 to 244196001
Checking for bad blocks (non-destructive read-write test)
Testing with random pattern:          804608/      244196001
Interrupt caught, cleaning up

順調に見えるが、進行速度が恐ろしく不安定。怪しい。
試しにsdbでもやってみたら、これも不安定。sdcとsddは安定している。(sdcはsddの半分くらいの速度しか出ていないけど)

それぞれ30秒回してどこまで進むかテスト

sda - 不安定

[nickle@itefu ~]% sudo badblocks -n -s -v /dev/sda1
Checking for bad blocks in non-destructive read-write mode
From block 0 to 244196001
Checking for bad blocks (non-destructive read-write test)
Testing with random pattern:           13696/      244196001
Interrupt caught, cleaning up

sdb - 不安定

[nickle@itefu ~]% sudo badblocks -n -s -v /dev/sdb1
Checking for bad blocks in non-destructive read-write mode
From block 0 to 244196001
Checking for bad blocks (non-destructive read-write test)
Testing with random pattern:           17984/      244196001
Interrupt caught, cleaning up

sdc - 安定して2500block/secくらい

[nickle@itefu ~]% sudo badblocks -n -s -v /dev/sdc1
Checking for bad blocks in non-destructive read-write mode
From block 0 to 244196001
Checking for bad blocks (non-destructive read-write test)
Testing with random pattern:           72960/      244196001
Interrupt caught, cleaning up

sdd - 安定して4500block/secくらい

[nickle@itefu ~]% sudo badblocks -n -s -v /dev/sdd1
Checking for bad blocks in non-destructive read-write mode
From block 0 to 244196001
Checking for bad blocks (non-destructive read-write test)
Testing with random pattern:          180416/      244196001
Interrupt caught, cleaning up

というわけで、sdaとsdbは瀕死と見るべき?
LinuxではSMART見れないので、Winマシンにつないで見てみた。

やはりReallocation多発らしい。交換決定。
sdcはReallocationは1セクタだけみたいだけど、CRC Errorが多いのが気になる。
sddはもちろんAll Green。まだ買って2ヶ月だし。

... というわけで3台買ってきた。sd[ab]は即交換。もう1台はsdc用。もう少し様子見て、壊れ次第交換。
どこぞのサイトの啓示どおり、badblocksから始める

[nickle@itefu ~]% sudo badblocks -w -s -v /dev/sda
Checking for bad blocks in read-write mode
From block 0 to 244198584
Testing with pattern 0xaa: done                        584844
Reading and comparing: done                        584
Testing with pattern 0x55:        27488704/      244198584
[nickle@itefu ~]%

4パスあるみたいで、1パスの書き込みのみで1時間40分程度(約40MB/s)。読み込みは1時間20分程度(約50MB/s)
値を変えて複数回やらなくても、とりあえずセクタ不良はわかるよねってことで、1パス終了時点で打ち切り。

sdbはWindows側でWestern DigitalのLifeGuard Diagnosticsをかけた。
2台ともOKみたいので、1台ずつ取り替え

ディスク全体を1パーティションにしてtypeをraid autodetectに

# cfdisk /dev/sda

# mdadm /dev/md0 -a /dev/sda1

... recovery 4時間ちょっと

sdbにも同じことをする

# cfdisk /dev/sdb
# mdadm /dev/md0 -a /dev/sdb1

... というわけで無事復旧しました。sdcも近いうちに取り替えたほうがいいな

念のためDBとハッシュの比較

[nickle@itefu ~/storage]% fg
[1]  + continued  nice ./storage_verify.pl | tee verify.log
[nickle@itefu ~/storage]% 
うん。OKっぽい