ディスクがとんだので 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 からディスクを切り離してディスクを修復してっていう手もあったみたい。なるほど。

*1:VMware ESXi のストレージになってたので、いちいち全 VM を落とすのが面倒だった。

*2:ちなみに RAID-1 が成立している状態で再 sync すると State は clean, resyncing になるし、ドライブの State も spare rebuilding じゃなくて active sync になる。

*3:じゃあ Reallocated Sectors Count が増えてるかといえばそういうことはなく、0 のままだった。