ディスクがとんだので md RAID を修復した
作業メモ。
以下の2台のハードディスクを md で /dev/md0 として RAID-1 をくんでる。
- /dev/sdb 1TB (SAMSUNG HD103UI)
- /dev/sdc 1TB (WD WD10EADS)
ある日 smartd からメールがとどいていた。以下の2通。
Device: /dev/sdc, 1 Currently unreadable (pending) sectors Device: /dev/sdc, 5 Offline uncorrectable sectors
いわゆる Caviar Green のほうがちょっとおかしくなったらしい。
dmesg みてみる。
ata4.00: exception Emask 0x0 SAct 0x3e7ffe0f SErr 0x0 action 0x0 ata4.00: irq_stat 0x40000008 ata4.00: cmd 60/80:48:bf:4d:70/00:00:74:00:00/40 tag 9 ncq 65536 in res 41/40:00:ef:4d:70/85:00:74:00:00/40 Emask 0x409 (media error) <F> ata4.00: status: { DRDY ERR } ata4.00: error: { UNC } sd 3:0:0:0: SCSI error: return code = 0x08000002 sdc: Current [descriptor]: sense key: Medium Error Add. Sense: Unrecovered read error - auto reallocate failed ata4.00: exception Emask 0x10 SAct 0x1 SErr 0x800100 action 0x6 frozen ata4.00: irq_stat 0x08000000, interface fatal error ata4: SError: { UnrecovData LinkSeq } ata4.00: cmd 61/80:00:3f:51:70/00:00:74:00:00/40 tag 0 ncq 65536 out res 40/00:04:3f:51:70/85:00:74:00:00/40 Emask 0x10 (ATA bus error) ata4.00: status: { DRDY } ata4: hard resetting link raid1: Disk failure on sdc1, disabling device. Operation continuing on 1 devices
あー。なんかエラーでてる。/dev/sdc がおかしいので RAID から切り離したって書いてる。
念のために S.M.A.R.T. 情報もみてみる。
# smartctl -a /dev/sdc smartctl version 5.38 [i686-redhat-linux-gnu] Copyright (C) 2002-8 Bruce Allen Home page is http://smartmontools.sourceforge.net/ === START OF INFORMATION SECTION === Device Model: WDC WD10EADS-00L5B1 Serial Number: WD-WCAU45695418 Firmware Version: 01.01A01 User Capacity: 1,000,204,886,016 bytes Device is: Not in smartctl database [for details use: -P showall] ATA Version is: 8 ATA Standard is: Exact ATA specification draft version not indicated Local Time is: Mon Dec 14 13:32:46 2009 JST SMART support is: Available - device has SMART capability. SMART support is: Enabled ID# ATTRIBUTE_NAME FLAG VALUE WORST THRESH TYPE UPDATED WHEN_FAILED RAW_VALUE 5 Reallocated_Sector_Ct 0x0033 200 200 140 Pre-fail Always - 0 196 Reallocated_Event_Count 0x0032 200 200 000 Old_age Always - 0 197 Current_Pending_Sector 0x0032 200 200 000 Old_age Always - 5 198 Offline_Uncorrectable 0x0030 200 200 000 Old_age Offline - 5
たしかに Offline Uncorrectable Sector が存在している。
余談
ログによるとエラーが出始めたのは 15:16 ころ。最初の smartd からのメールが届いたのは 15:26 ころ。ちと遅い。
あとその日の 04:22 ころに /dev/md0 の再 sync が始まってて終わったのが 15:15 ころ。このちょっと後にエラーがではじめてるので、ディスクをがりがりやりすぎて疲れたのかな。
/dev/md0 の resync がはじまったのは、CentOS の cron.weekly の 99-raid-check が走ったからみたい。これデフォルトで RAID のチェックを(echo check > /sys/block/md0/md/sync_action
で)おこなうんだけど、md のしくみ上、/sys/block/md0/md/mismatch_cnt が 0 ではなかった場合、自動で(全体を)resync するみたい。
/sys/block/md0/md/mismatch_cnt が 0 じゃなかった理由は不明。今調べたらまた 0 じゃなかった(256 だった)。今週末も resync が走るのかぁ。
md からディスクの切り離し
/proc/mdstat で md のステータスを確認。
# cat /proc/mdstat Personalities : [raid1] md0 : active raid1 sdc1[2](F) sdb1[0] 976759936 blocks [2/1] [U_] unused devices: <none>
/dev/sdc1 が faulty になってて、[UU]
じゃなくて [U_]
になってる。片肺(縮退)運転中らしい。
mdadm でもっとくわしくみてみる。
# mdadm --detail /dev/md0 /dev/md0: Version : 0.90 Creation Time : Mon Aug 17 12:34:05 2009 Raid Level : raid1 Array Size : 976759936 (931.51 GiB 1000.20 GB) Used Dev Size : 976759936 (931.51 GiB 1000.20 GB) Raid Devices : 2 Total Devices : 2 Preferred Minor : 0 Persistence : Superblock is persistent Update Time : Mon Dec 14 13:31:45 2009 State : clean, degraded Active Devices : 1 Working Devices : 1 Failed Devices : 1 Spare Devices : 0 UUID : b6d52409:411c067f:8e204d9a:bede5976 Events : 0.155972 Number Major Minor RaidDevice State 0 8 17 0 active sync /dev/sdb1 1 0 0 1 removed 2 8 33 - faulty spare /dev/sdc1
State が degraded で /dev/sdc1 は faulty spare になってる。
このままだと /dev/sdc1 は /dev/md0 のメンバのままであり、交換できないので切り離す。
# mdadm /dev/md0 -r /dev/sdc1 mdadm: hot removed /dev/sdc1
切り離した。
もいちど mdadm で調べると
Number Major Minor RaidDevice State 0 8 17 0 active sync /dev/sdb1 1 0 0 1 removed
/dev/sdc1 が消えた。
このとき dmesg 的には
md: unbind<sdc1> md: export_rdev(sdc1)
が出力される。
ディスクをホットスワップする
ほんとうは、このホストを落としてディスクを交換して RAID を再構築して、っていう手順をふむべき。
なんだけど、ちょっと事情があって*1ダウンタイムを少なくしたかった。
いろいろ調べたら、現在の Linux (の一部のディスクコントローラ)ではホットスワップに対応しているらしい。http://okkun-lab.rd.fukuoka-u.ac.jp/wiki/?Tips/Linux/mdadm とか SATAをホットスワップ化 | 作業日報 とか参照。
生きたままディスクを抜き差しするのは抵抗感あるけど、たまたまわりと直近にバックアップをとったばっかりだったので、ホットスワップに挑戦してみた。
まずはディスクのデバイス番号を調べる。
# dmesg | egrep -e '^sd ' sd 0:0:0:0: Attached scsi disk sda sd 2:0:0:0: Attached scsi disk sdb sd 3:0:0:0: Attached scsi disk sdc sd 0:0:0:0: Attached scsi generic sg0 type 0 sd 2:0:0:0: Attached scsi generic sg1 type 0 sd 3:0:0:0: Attached scsi generic sg2 type 0
今回は sdc なのでデバイス番号は 3:0:0:0
だった。
この番号をもとに、HDD を Linux から見えなくする。
# echo 1 > /sys/class/scsi_device/3:0:0:0/device/delete
この時点で dmesg 的には
ata4.00: disabled
と出るだけ。あと、たしかに /dev/sdc*
というノードはなくなった。
リムーバブルトレイに入れていたのでえいっとディスクを抜く。たぶんこのときにでた dmesg がこれ。
ata4: exception Emask 0x10 SAct 0x0 SErr 0x10000 action 0xe frozen ata4: irq_stat 0x00400000, PHY RDY changed ata4: SError: { PHYRdyChg } ata4: hard resetting link ata4: SATA link down (SStatus 0 SControl 300) ata4: EH complete
exception とか SError とかでるのでヒヤっとする。
新しいディスクを入れる。このときの dmesg がたぶんこのあたり。
ata4: exception Emask 0x10 SAct 0x0 SErr 0x4050002 action 0xe frozen ata4: irq_stat 0x00400040, connection status changed ata4: SError: { RecovComm PHYRdyChg CommWake DevExch } ata4: hard resetting link ata4: link is slow to respond, please be patient (ready=0) ata4: COMRESET failed (errno=-16) ata4: hard resetting link ata4: SATA link up 3.0 Gbps (SStatus 123 SControl 300) ata4.00: ATA-8: WDC WD10EADS-00M2B0, 01.00A01, max UDMA/133 ata4.00: 1953525168 sectors, multi 0: LBA48 NCQ (depth 31/32) ata4.00: configured for UDMA/133 ata4: EH complete Vendor: ATA Model: WDC WD10EADS-00M Rev: 01.0 Type: Direct-Access ANSI SCSI revision: 05 SCSI device sdd: 1953525168 512-byte hdwr sectors (1000205 MB) sdd: Write Protect is off sdd: Mode Sense: 00 3a 00 00 SCSI device sdd: drive cache: write back SCSI device sdd: 1953525168 512-byte hdwr sectors (1000205 MB) sdd: Write Protect is off sdd: Mode Sense: 00 3a 00 00 SCSI device sdd: drive cache: write back sdd: unknown partition table sd 3:0:0:0: Attached scsi disk sdd sd 3:0:0:0: Attached scsi generic sg2 type 0
hard link reset が最初うまくいかなくて再度やってるとこがちと怖い。ともかくディスクが認識された。スゴー!
あとほんとは /sys/class/scsi_host に 再 scan するように投げる必要があるはずなんだけど、それしなくても上記のように /dev/sdd として認識された。なんでだろ。
ほんとは /dev/sdc のままだとうれしかったんだけど、まぁこういうものかもしれない。USB HDD を追加削除するときもこうだっけ?
ちなみに、使ってるリムーバブルケースは電源スイッチが独立じゃなかったんだけど(つまり電源を入れたまま交換をおこなった)、こういうホットスワップをするなら電源が独立しているもの(ロック鍵と電源が連動しているもの)のほうがよかったと思った。怖いもの。
md にディスクを追加して RAID 再構築
fdisk して /dev/sdd1 を作ったりパーティション ID を変えたりするところは省略(ログとるの忘れた)。
で、こんどは /dev/sdd1 になったのでこれを /dev/md0 アレイに追加する。
# mdadm /dev/md0 -a /dev/sdd1 mdadm: hot added /dev/sdd1
ステータスの確認。
# mdadm --detail /dev/md0 /dev/md0: Version : 0.90 Creation Time : Mon Aug 17 12:34:05 2009 Raid Level : raid1 Array Size : 976759936 (931.51 GiB 1000.20 GB) Used Dev Size : 976759936 (931.51 GiB 1000.20 GB) Raid Devices : 2 Total Devices : 2 Preferred Minor : 0 Persistence : Superblock is persistent Update Time : Mon Dec 14 13:53:40 2009 State : clean, degraded, recovering Active Devices : 1 Working Devices : 2 Failed Devices : 0 Spare Devices : 1 Rebuild Status : 0% complete UUID : b6d52409:411c067f:8e204d9a:bede5976 Events : 0.158652 Number Major Minor RaidDevice State 0 8 17 0 active sync /dev/sdb1 2 8 49 1 spare rebuilding /dev/sdd1
State が clean, degraded, recovering になってる*2。
/proc/mdstat だともっとそれっぽい再構築過程が見られる。
# cat /proc/mdstat Personalities : [raid1] md0 : active raid1 sdd1[2] sdb1[0] 976759936 blocks [2/1] [U_] [>....................] recovery = 0.2% (2077312/976759936) finish=515.9min speed=31482K/sec unused devices: <none>
speed は負荷や外周内周などで変わるので finish time はあんまり当てにならない。
ここらへんでの dmesg の出力は下記のとおり。
md: bind<sdd1> RAID1 conf printout: --- wd:1 rd:2 disk 0, wo:0, o:1, dev:sdb1 disk 1, wo:1, o:1, dev:sdd1 md: syncing RAID array md0 md: minimum _guaranteed_ reconstruction speed: 1000 KB/sec/disc. md: using maximum available idle IO bandwidth (but not more than 200000 KB/sec) for reconstruction. md: using 128k window, over a total of 976759936 blocks.
んで、再構築が終了すると dmesg には
md: md0: sync done.
のようにでる。
再構築にかかった時間は 1 TB で 11 時間 30 分くらいでした。
ホットスワップしてノード名(/dev/sdd1)が変わったのが気持ち悪いので、いつかちゃんと再起動したい。
あと、エラーがでた HDD は Data Lifeguard Diagnostic(いわゆる DLGDIAG)で FULL TEST したら、エラーをリカバリしたとかでた。その後ディスク消去などおこなって再度 FULL TEST 等して S.M.A.R.T. ステータスを確認したら、Offline Uncorrectable などが 0 になってた*3。怖いんで RAID アレイメンバとしては使わないことにする。
Offline Uncorrectable Sector Count なんて別に怖くないよというなら、https://lumiere.atobe.com/blog/?item=offline-uncorrectable-sectors&category=software のようにディスクの交換をおこなわずに RAID からディスクを切り離してディスクを修復してっていう手もあったみたい。なるほど。