So-net無料ブログ作成
検索選択

mdadmで壊れたアレイを修復できるか? [Linux(LVM/RAID/Storage)]

※ この方法が必ず成功するかどうか、確証は全く持てないので、ダメだったとしても文句は言わないように!(笑) ※

 さて。LinuxのソフトウェアRAIDでアレイを構築している状態で、ディスク以外のパーツでトラブルが発生することもある。
 例えば、拡張スロットに挿しているSATAカードの故障とか、SATAのポートマルチプライヤとか、あるいはケーブル類とか。特にSATAポートマルチプライヤの故障は頻度が多い気がしてならないんだが…。個人的に。そう、あくまでも個人的に。

 で、RAID5の場合、原則論としてはディスク1本の障害までは耐えられることになっているが、2本飛んだらゲームオーバーということになっている。その故障の原因は全く問われないが、ディスクそのものの故障よりも、前述のSATAカードやパーツ類の故障の場合は一気に複数のディスクがアクセス不能になる傾向にあるのもまた事実。

 ディスクが壊れていなければ、アレイの中のデータが無事である可能性はある。ダメになっているかもしれないが、そこに一縷の望みをかけて「なんとか復旧」させたいと思うのもまた心情。そこで、復旧方法の一つについてここに記載しておく。
 ちなみに、我が家の最近のSATAポートマルチプライヤの故障によるRAIDアレイ停止問題はコレで解決できた。

 サーバ起動時のログは、こんな感じだった。ちょっと長いけど全部晒すと…
Jun 17 22:22:36 urd kernel: md: Autodetecting RAID arrays.
Jun 17 22:22:36 urd kernel: md: autorun ...
Jun 17 22:22:36 urd kernel: md: considering sdk1 ...
Jun 17 22:22:36 urd kernel: md:  adding sdk1 ...
Jun 17 22:22:36 urd kernel: md:  adding sdj1 ...
Jun 17 22:22:36 urd kernel: md:  adding sdi1 ...
Jun 17 22:22:36 urd kernel: md:  adding sdh1 ...
Jun 17 22:22:36 urd kernel: md:  adding sdg1 ...
Jun 17 22:22:36 urd kernel: md:  adding sdf1 ...
Jun 17 22:22:36 urd kernel: md:  adding sde1 ...
Jun 17 22:22:36 urd kernel: md:  adding sdd1 ...
Jun 17 22:22:36 urd kernel: md:  adding sdc1 ...
Jun 17 22:22:36 urd kernel: md:  adding sdb1 ...
Jun 17 22:22:36 urd kernel: md:  adding sda1 ...
Jun 17 22:22:36 urd kernel: md: created md0
Jun 17 22:22:36 urd kernel: md: bind
Jun 17 22:22:36 urd kernel: md: bind
Jun 17 22:22:36 urd kernel: md: bind
Jun 17 22:22:36 urd kernel: md: bind
Jun 17 22:22:36 urd kernel: md: bind
Jun 17 22:22:36 urd kernel: md: bind
Jun 17 22:22:36 urd kernel: md: bind
Jun 17 22:22:36 urd kernel: md: bind
Jun 17 22:22:36 urd kernel: md: bind
Jun 17 22:22:36 urd kernel: md: bind
Jun 17 22:22:36 urd kernel: md: bind
Jun 17 22:22:36 urd kernel: md: running: 
Jun 17 22:22:36 urd kernel: md: kicking non-fresh sdj1 from array!
Jun 17 22:22:36 urd kernel: md: unbind
Jun 17 22:22:36 urd kernel: md: export_rdev(sdj1)
Jun 17 22:22:36 urd kernel: md: kicking non-fresh sdi1 from array!
Jun 17 22:22:36 urd kernel: md: unbind
Jun 17 22:22:36 urd kernel: md: export_rdev(sdi1)
Jun 17 22:22:36 urd kernel: raid5: automatically using best checksumming function: generic_sse
Jun 17 22:22:36 urd kernel:    generic_sse:  5868.000 MB/sec
Jun 17 22:22:36 urd kernel: raid5: using function: generic_sse (5868.000 MB/sec)
Jun 17 22:22:36 urd kernel: raid6: int64x1   1339 MB/s
Jun 17 22:22:36 urd kernel: raid6: int64x2   1667 MB/s
Jun 17 22:22:36 urd kernel: raid6: int64x4   1523 MB/s
Jun 17 22:22:36 urd kernel: raid6: int64x8   1265 MB/s
Jun 17 22:22:36 urd kernel: raid6: sse2x1    2609 MB/s
Jun 17 22:22:36 urd kernel: raid6: sse2x2    3160 MB/s
Jun 17 22:22:36 urd kernel: raid6: sse2x4    4792 MB/s
Jun 17 22:22:36 urd kernel: raid6: using algorithm sse2x4 (4792 MB/s)
Jun 17 22:22:36 urd kernel: md: raid6 personality registered for level 6
Jun 17 22:22:36 urd kernel: md: raid5 personality registered for level 5
Jun 17 22:22:36 urd kernel: md: raid4 personality registered for level 4
Jun 17 22:22:36 urd kernel: raid5: device sdh1 operational as raid disk 8
Jun 17 22:22:36 urd kernel: raid5: device sdg1 operational as raid disk 5
Jun 17 22:22:36 urd kernel: raid5: device sdf1 operational as raid disk 3
Jun 17 22:22:36 urd kernel: raid5: device sdd1 operational as raid disk 7
Jun 17 22:22:36 urd kernel: raid5: device sdc1 operational as raid disk 2
Jun 17 22:22:36 urd kernel: raid5: device sdb1 operational as raid disk 6
Jun 17 22:22:36 urd kernel: raid5: device sda1 operational as raid disk 4
Jun 17 22:22:36 urd kernel: raid5: not enough operational devices for md0 (2/9 failed)
Jun 17 22:22:36 urd kernel: RAID5 conf printout:
Jun 17 22:22:36 urd kernel:  --- rd:9 wd:7 fd:2
Jun 17 22:22:36 urd kernel:  disk 2, o:1, dev:sdc1
Jun 17 22:22:36 urd kernel:  disk 3, o:1, dev:sdf1
Jun 17 22:22:36 urd kernel:  disk 4, o:1, dev:sda1
Jun 17 22:22:36 urd kernel:  disk 5, o:1, dev:sdg1
Jun 17 22:22:36 urd kernel:  disk 6, o:1, dev:sdb1
Jun 17 22:22:36 urd kernel:  disk 7, o:1, dev:sdd1
Jun 17 22:22:36 urd kernel:  disk 8, o:1, dev:sdh1
Jun 17 22:22:36 urd kernel: raid5: failed to run raid set md0
Jun 17 22:22:36 urd kernel: md: pers->run() failed ...
Jun 17 22:22:36 urd kernel: md: do_md_run() returned -5
Jun 17 22:22:36 urd kernel: md: md0 stopped.
Jun 17 22:22:36 urd kernel: md: unbind
Jun 17 22:22:36 urd kernel: md: export_rdev(sdk1)
Jun 17 22:22:36 urd kernel: md: unbind
Jun 17 22:22:36 urd kernel: md: export_rdev(sdh1)
Jun 17 22:22:36 urd kernel: md: unbind
Jun 17 22:22:36 urd kernel: md: export_rdev(sdg1)
Jun 17 22:22:36 urd kernel: md: unbind
Jun 17 22:22:36 urd kernel: md: export_rdev(sdf1)
Jun 17 22:22:36 urd kernel: md: unbind
Jun 17 22:22:36 urd kernel: md: export_rdev(sde1)
Jun 17 22:22:36 urd kernel: md: unbind
Jun 17 22:22:36 urd kernel: md: export_rdev(sdd1)
Jun 17 22:22:36 urd kernel: md: unbind
Jun 17 22:22:36 urd kernel: md: export_rdev(sdc1)
Jun 17 22:22:36 urd kernel: md: unbind
Jun 17 22:22:36 urd kernel: md: export_rdev(sdb1)
Jun 17 22:22:36 urd kernel: md: unbind
Jun 17 22:22:36 urd kernel: md: export_rdev(sda1)
Jun 17 22:22:36 urd kernel: md: ... autorun DONE.


 RAIDアレイを構成する9本のディスクのうち、2本がFailedの扱いになっていて、
Jun 17 22:22:36 urd kernel: md: kicking non-fresh sdj1 from array!
Jun 17 22:22:36 urd kernel: md: unbind
Jun 17 22:22:36 urd kernel: md: export_rdev(sdj1)
Jun 17 22:22:36 urd kernel: md: kicking non-fresh sdi1 from array!
Jun 17 22:22:36 urd kernel: md: unbind
Jun 17 22:22:36 urd kernel: md: export_rdev(sdi1)

 そしてアレイをスタートするのにディスクが足りないよというエラーに。
Jun 17 22:22:36 urd kernel: raid5: device sdh1 operational as raid disk 8
Jun 17 22:22:36 urd kernel: raid5: device sdg1 operational as raid disk 5
Jun 17 22:22:36 urd kernel: raid5: device sdf1 operational as raid disk 3
Jun 17 22:22:36 urd kernel: raid5: device sdd1 operational as raid disk 7
Jun 17 22:22:36 urd kernel: raid5: device sdc1 operational as raid disk 2
Jun 17 22:22:36 urd kernel: raid5: device sdb1 operational as raid disk 6
Jun 17 22:22:36 urd kernel: raid5: device sda1 operational as raid disk 4
Jun 17 22:22:36 urd kernel: raid5: not enough operational devices for md0 (2/9 failed)
Jun 17 22:22:36 urd kernel: RAID5 conf printout:
Jun 17 22:22:36 urd kernel:  --- rd:9 wd:7 fd:2
Jun 17 22:22:36 urd kernel:  disk 2, o:1, dev:sdc1
Jun 17 22:22:36 urd kernel:  disk 3, o:1, dev:sdf1
Jun 17 22:22:36 urd kernel:  disk 4, o:1, dev:sda1
Jun 17 22:22:36 urd kernel:  disk 5, o:1, dev:sdg1
Jun 17 22:22:36 urd kernel:  disk 6, o:1, dev:sdb1
Jun 17 22:22:36 urd kernel:  disk 7, o:1, dev:sdd1
Jun 17 22:22:36 urd kernel:  disk 8, o:1, dev:sdh1
Jun 17 22:22:36 urd kernel: raid5: failed to run raid set md0

 ひとまず手動でRAIDをスタートさせてみる。
 mdadm --assemble /dev/md0 --run /dev/sd[a-k]1 とか実行してみる。/dev/md0は始動するも、ディスク2本(sdi1とsdj1)がFailedの扱いになって組み込まれないので、 mdadm --misc --detail /dev/md0 で確認してもアクセスは不能に。

 このような場合、2つの方法がある模様。
  ① 思い切ってmdadm --createをやってしまう方法
  ② ディスクが歯抜けになっているアレイに、Failedなディスクをaddする方法
 実は、昔①を試したことがあって、1勝1敗という状況。勝率50%ではあるが今回コレを再度実行する勇気がもてなかったので(笑)、②を実施することにした。(笑)

 どうやら、コレには条件があるようだ。ざっくり調べてみた限りでは、mdadm --misc --examineでディスクに保存されているアレイの情報が綺麗に一致する状態でなければならないとのこと。おそらく、RAIDの情報(管理情報?)を更新している瞬間とかにエラーになったらダメとか、そういうことなのだろうか?よく判らないのでその筋の識者の方、コメントを求む。

 そんな訳で、

Jun 17 22:22:36 urd kernel: md: kicking non-fresh sdj1 from array!
Jun 17 22:22:36 urd kernel: md: kicking non-fresh sdi1 from array!

 ということだったので、mdadm --misc --examine /dev/sdj1mdadm --misc --examine /dev/sdi1 と実行してみる。
 ちなみにこのコマンドを実行すると、↓こんな具合の情報が出る。
/dev/sdj1:
          Magic : a92b4efc
        Version : 0.90.00
           UUID : 920f0fa0:3134624c:9777e46a:4cafd8b9
  Creation Time : Mon Feb  1 23:09:17 2010
     Raid Level : raid5
  Used Dev Size : 1953511936 (1863.01 GiB 2000.40 GB)
     Array Size : 15628095488 (14904.11 GiB 16003.17 GB)
   Raid Devices : 9
  Total Devices : 11
Preferred Minor : 0

    Update Time : Mon Jun 20 04:03:47 2011
          State : clean
 Active Devices : 9
Working Devices : 11
 Failed Devices : 0
  Spare Devices : 2
       Checksum : 5e9e5268 - correct
         Events : 1521164

         Layout : left-symmetric
     Chunk Size : 256K

      Number   Major   Minor   RaidDevice State
this     0       8      145        0      active sync   /dev/sdj1

   0     0       8      145        0      active sync   /dev/sdj1
   1     1       8      129        1      active sync   /dev/sdi1
   2     2       8       33        2      active sync   /dev/sdc1
   3     3       8       81        3      active sync   /dev/sdf1
   4     4       8        1        4      active sync   /dev/sda1
   5     5       8       97        5      active sync   /dev/sdg1
   6     6       8       17        6      active sync   /dev/sdb1
   7     7       8       49        7      active sync   /dev/sdd1
   8     8       8      113        8      active sync   /dev/sdh1
   9     9       8       65        9      spare   /dev/sde1
  10    10       8      161       10      spare   /dev/sdk1

 (上記の表示例は正常に起動してからのものなので、停止中とかだとちょっと違う場合も考えられる。)
 幸い、「Checksum : ナントカカントカ - correct」だったので、このまま組み込んでも大丈夫かな?と思えた。思っただけで確証は全く無かったが!!

 と言うわけで、sdj1とsdi1とをアレイに組み込む。コマンドはmdadm --manage /dev/md0 --add /dev/sd[ij]1だ。特にエラーも無く、sdj1とsdi1とをaddしたお^-^  みたいなメッセージがちょろっと出て終了。
 mdadm --misc --detail /dev/md0で表示を確認すると、こちらも特にエラーなど無く、それぞれのディスクは「active sync」の状態に。

 こいつ・・・動くぞ!?

 という心境になった。(笑)しかし、アレイ自体はまだ起動していないので、あと一発コマンドを流し込んでアレイを起動する。コマンドはmdadm --manage /dev/md0 --runだ。

 お・・・

 エラーとか出ない!!

 mdadm --misc --detail /dev/md0でも正常起動を確認!!mount /dev/md0 /mnt/local/storage とか実行してみてdf -hとか実行してみて内部のデータの無事を確認!!   いや、もしかしたら何か壊れたファイルもあるかもしれないが、とりあえずサルベージは可能な状態には達した!!
 とりあえず、中のデータを救い出してしまおう。そのうちに!

メッセージを送る