daemonfreaks.com

mdadmのソフトウェアRAID復旧

posted by jun-g at Tue, 25 Sep 2012 17:56 JST

先日、自宅でブレーカーが落ちて停電してしまう事件?が発生しました。よくある過電流による停電の場合、回路ブレーカーが落ちて一部屋だけ停電したりするのですが、今回は主幹ブレーカーが落ちてしまい、全部屋が停電になりました。

とりあえずスマホでネット検索して原因と対策を調べました。原因としては漏電の可能性があること、対策としては問題のある箇所の回路ブレーカーのみを落としておけばとりあえず大丈夫であることがわかりました。

ということで問題となる箇所の回路ブレーカーを探してその日はとりあえず事なきを得ました。後日、電気工事業者に来てもらい、漏電箇所は修理してもらいました。(実際は修理不可能な箇所だったので、壁口コンセントを一箇所殺して終わり。)

で、漏電はこれで良かったのですが、停電した日に何度も家のブレーカーがバチバチ落ちたせいで、UPSを使ってない自宅サーバー(OSはXenServer)がもろに被害を受けてしまいました。

サーバーを起動し、XenCenterからつないでみると、ストレージが見つからないという警告。sshでログインしてRAIDの様子を確認してみると、HDDは4本使っているのに3本しか認識していない状態でした。

で、筐体を開けて確認してみると、何故かこのタイミングでHDDの電源ケーブルが1本抜けかかっていました…。そのケーブルを接続し直して改めてサーバーを起動し直すと、無事に4本認識しました。

しかし、RAIDの様子を確認すると、4本認識しているものの、様子は変わらず。

[root@xenserver ~]# cat /proc/mdstat
Personalities :
md0 : inactive sdb1[0](S) sde1[3](S) sdd1[2](S) sdc1[1](S)
      3907039744 blocks

unused devices: <none>

とりあえずネットでmdadmのraid復旧方法を調べて、そのとおりの手順で復旧を試みてみたところ、無事に復旧しました。手順は以下の通り。

まずはAssembleモードでmdadmを実行。

[root@xenserver ~]# mdadm -A /dev/md0 /dev/sd[bcde]1
mdadm: /dev/md0 assembled from 3 drives - not enough to start the array while not clean - consider --force.

怒られます。なので強制的に行う「--force」オプションを追加して実行。(ついでに詳細を出力する「-v」オプションも追加。)

[root@xenserver ~]# mdadm -v -A --force /dev/md0 /dev/sd[bcde]1
mdadm: looking for devices for /dev/md0
mdadm: /dev/sdb1 is identified as a member of /dev/md0, slot 0.
mdadm: /dev/sdc1 is identified as a member of /dev/md0, slot 1.
mdadm: /dev/sdd1 is identified as a member of /dev/md0, slot 2.
mdadm: /dev/sde1 is identified as a member of /dev/md0, slot 3.
mdadm: added /dev/sdc1 to /dev/md0 as 1
mdadm: added /dev/sdd1 to /dev/md0 as 2
mdadm: added /dev/sde1 to /dev/md0 as 3
mdadm: added /dev/sdb1 to /dev/md0 as 0
mdadm: /dev/md0 has been started with 3 drives (out of 4).

今度は上手くいったようなので、状態を確認。

[root@xenserver ~]# cat /proc/mdstat
Personalities : [raid6] [raid5] [raid4]
md0 : active raid5 sdb1[0] sde1[3] sdd1[2]
      2930279808 blocks level 5, 64k chunk, algorithm 2 [4/3] [U_UU]

unused devices: <none>
[root@xenserver ~]# mdadm -D /dev/md0
/dev/md0:
        Version : 0.90
  Creation Time : Mon Jul  4 17:39:51 2011
     Raid Level : raid5
     Array Size : 2930279808 (2794.53 GiB 3000.61 GB)
  Used Dev Size : 976759936 (931.51 GiB 1000.20 GB)
   Raid Devices : 4
  Total Devices : 3
Preferred Minor : 0
    Persistence : Superblock is persistent

    Update Time : Fri Sep 21 21:13:32 2012
          State : clean, degraded
 Active Devices : 3
Working Devices : 3
 Failed Devices : 0
  Spare Devices : 0

         Layout : left-symmetric
     Chunk Size : 64K

           UUID : 11c0d6c2:2c1cae2a:99080105:010c0b1b
         Events : 0.11416776

    Number   Major   Minor   RaidDevice State
       0       8       17        0      active sync   /dev/sdb1
       1       0        0        1      removed
       2       8       49        2      active sync   /dev/sdd1
       3       8       65        3      active sync   /dev/sde1

sdc1が無い3本構成の状態でRAID自体は復旧したみたいです。まずは一安心。

で、次にsdc1をRAIDに再追加。

[root@xenserver ~]# mdadm /dev/md0 -a /dev/sdc1
mdadm: re-added /dev/sdc1

追加されたようなので、確認。

[root@xenserver ~]# mdadm -D /dev/md0
/dev/md0:
        Version : 0.90
  Creation Time : Mon Jul  4 17:39:51 2011
     Raid Level : raid5
     Array Size : 2930279808 (2794.53 GiB 3000.61 GB)
  Used Dev Size : 976759936 (931.51 GiB 1000.20 GB)
   Raid Devices : 4
  Total Devices : 4
Preferred Minor : 0
    Persistence : Superblock is persistent

    Update Time : Sun Sep 23 10:10:28 2012
          State : clean, degraded, recovering
 Active Devices : 3
Working Devices : 4
 Failed Devices : 0
  Spare Devices : 1

         Layout : left-symmetric
     Chunk Size : 64K

 Rebuild Status : 0% complete

           UUID : 11c0d6c2:2c1cae2a:99080105:010c0b1b
         Events : 0.11416781

    Number   Major   Minor   RaidDevice State
       0       8       17        0      active sync   /dev/sdb1
       4       8       33        1      spare rebuilding   /dev/sdc1
       2       8       49        2      active sync   /dev/sdd1
       3       8       65        3      active sync   /dev/sde1

sdc1がRAIDに追加され、リビルドが始まりました。この数時間後に、無事にRAIDが復旧したことを確認しました。

思ったことなど

  • mdadmどころかLinux自体に不慣れなので、こういう障害が発生すると軽くパニックになります。 仮想ホストOSにも慣れているFreeBSDが使いたいので、 BHyVe の実用化が待ち遠しいです。
  • こういう障害復旧方法はいつかの自分の為にブログに書いてますが、自宅サーバーが死ぬとこのブログも閲覧できなくなるので、障害が発生する度にいつも途方に暮れます…。
  • やはりUPSは必要ですね。買いましょう。