Linuxでストライピング(RAID0)なソフトウェアRAIDを組んでいた際にデバイスが外れてしまった場合

若手が(ry・・・シリーズ。次から他の人にやってほしいのでw 共有用のメモを残してしておきます。
Linuxのサーバで、ソフトウェアRAID(ストライピング)を組んでいたときに、片方のデバイスが不調で外れてしまったんだけど、デバイス内のデータは無事で、復旧(RAID0再構成)させたい場合のオペレーション。


ちなみに、たまたまなんだけど、ちょうど8年くらい前に似たようなエントリを書いていた。参考までに。

RAIDデバイスの確認と試行錯誤

外れてしまったデバイスは、問題なさそうってのは確認済み(本エントリでは割愛)で、あとは正常なRAIDデバイスに戻したいフェーズ、ってのが前提。
(自分が作ったサーバではないので、アレやコレやと確認しながら手探りになってしまっていますがw)

# cat /proc/mdstat
Personalities : [raid0]
md0 : inactive fiob[1] fioa[0]
      1249999872 blocks super 1.2

unused devices: <none>

mdstat見ると、inactiveになってますねー。

# mdadm --detail /dev/md0
/dev/md0:
        Version : 1.2
  Creation Time : Thu Jun 28 14:38:32 2012
     Raid Level : raid0
   Raid Devices : 4
  Total Devices : 2
    Persistence : Superblock is persistent

    Update Time : Thu Jun 28 14:38:32 2012
          State : active, FAILED, Not Started
 Active Devices : 2
Working Devices : 2
 Failed Devices : 0
  Spare Devices : 0

     Chunk Size : 256K

           Name : servername:0  (local to host servername)
           UUID : d1b36e91:11335546:3afa068c:35bcb74b
         Events : 0

    Number   Major   Minor   RaidDevice State
       0     252        0        0      active sync   /dev/fioa
       1     252       16        1      active sync   /dev/fiob
       2       0        0        2      removed
       3       0        0        3      removed

詳細を確認。デバイス4本でRAID0だったところ、2本のデバイスが切り離された状態となっている。

# mdadm --manage /dev/md0 --add /dev/fioc
mdadm: /dev/fioc reports being an active member for /dev/md0, but a --re-add fails.
mdadm: not performing --add as that would convert /dev/fioc in to a spare.
mdadm: To make this a spare, use "mdadm --zero-superblock /dev/fioc" first.

カジュアルにaddしようとしてもダメと。中身というかSuperblockが残っていますからね。そりゃそうです。

# mdadm --manage /dev/md0 --re-add /dev/fioc
mdadm: --re-add for /dev/fioc to /dev/md0 is not possible

一応やってみた、、、けど、ダメですw


# mdadm --examine /dev/fioa
/dev/fioa:
          Magic : a92b4efc
        Version : 1.2
    Feature Map : 0x0
     Array UUID : d1b36e91:11335546:3afa068c:35bcb74b
           Name : servername:0  (local to host servername)
  Creation Time : Thu Jun 28 14:38:32 2012
     Raid Level : raid0
   Raid Devices : 4

 Avail Dev Size : 1249999872 (596.05 GiB 640.00 GB)
    Data Offset : 2048 sectors
   Super Offset : 8 sectors
          State : clean
    Device UUID : 6c5bac62:4ceb9b5a:93dae9f9:9ff609c6

    Update Time : Thu Jun 28 14:38:32 2012
       Checksum : c44265b4 - correct
         Events : 0

     Chunk Size : 256K

   Device Role : Active device 0
   Array State : AAAA ('A' == active, '.' == missing)


# mdadm --examine /dev/fiob
/dev/fiob:
          Magic : a92b4efc
        Version : 1.2
    Feature Map : 0x0
     Array UUID : d1b36e91:11335546:3afa068c:35bcb74b
           Name : servername:0  (local to host servername)
  Creation Time : Thu Jun 28 14:38:32 2012
     Raid Level : raid0
   Raid Devices : 4

 Avail Dev Size : 1249999872 (596.05 GiB 640.00 GB)
    Data Offset : 2048 sectors
   Super Offset : 8 sectors
          State : clean
    Device UUID : e4947155:9ae45038:1c7135cb:a73e1e72

    Update Time : Thu Jun 28 14:38:32 2012
       Checksum : 121c770c - correct
         Events : 0

     Chunk Size : 256K

   Device Role : Active device 1
   Array State : AAAA ('A' == active, '.' == missing)


# mdadm --examine /dev/fioc
/dev/fioc:
          Magic : a92b4efc
        Version : 1.2
    Feature Map : 0x0
     Array UUID : d1b36e91:11335546:3afa068c:35bcb74b
           Name : servername:0  (local to host servername)
  Creation Time : Thu Jun 28 14:38:32 2012
     Raid Level : raid0
   Raid Devices : 4

 Avail Dev Size : 1249999872 (596.05 GiB 640.00 GB)
    Data Offset : 2048 sectors
   Super Offset : 8 sectors
          State : clean
    Device UUID : 664047e7:12cab443:9bec3b71:a205ce72

    Update Time : Thu Jun 28 14:38:32 2012
       Checksum : 560c4a81 - correct
         Events : 0

     Chunk Size : 256K

   Device Role : Active device 2
   Array State : AAAA ('A' == active, '.' == missing)


# mdadm --examine /dev/fiod
/dev/fiod:
          Magic : a92b4efc
        Version : 1.2
    Feature Map : 0x0
     Array UUID : d1b36e91:11335546:3afa068c:35bcb74b
           Name : servername:0  (local to host servername)
  Creation Time : Thu Jun 28 14:38:32 2012
     Raid Level : raid0
   Raid Devices : 4

 Avail Dev Size : 1249999872 (596.05 GiB 640.00 GB)
    Data Offset : 2048 sectors
   Super Offset : 8 sectors
          State : clean
    Device UUID : f77e67b2:6ef79bea:3b8471ea:da73403b

    Update Time : Thu Jun 28 14:38:32 2012
       Checksum : 9bbbc48 - correct
         Events : 0

     Chunk Size : 256K

   Device Role : Active device 3
   Array State : AAAA ('A' == active, '.' == missing)

"--examine"オプションは、デバイスのスーパーブロックを確認するオプション。
4本とも各デバイスのsuperblockの状態を確認したところ、特に問題なさそうなので、、、

# mdadm --assemble --scan /dev/md0
mdadm: /dev/md0 is already in use.

# mdadm --misc --detail /dev/md0
mdadm: cannot open /dev/md0: No such file or directory

# mdadm --assemble --scan /dev/md0
mdadm: /dev/md0 has been started with 4 drives.

結果論ではあるけど、こういう感じで修復した。
"/etc/mdadm.conf"からMDアレイを再構成しなおそうとしたんだけど、おそらく1〜2個目のコマンドで、/dev/md0 がstopしてしまったような挙動に思える。多分。confに構成を吐いてる分、素直にstopでもよかったかもしれない。
"mdadm --assemble --scan"を再実行したところ、正しい構成でRAIDデバイスが再構成された。

# echo "DEVICE /dev/fio*" > /etc/mdadm.conf'
# mdadm --detail --scan >> /etc/mdadm.conf'

一応、"/etc/mdadm.conf" は、こういう感じで作られていたっぽいことを補足。

# mdadm --detail /dev/md0
/dev/md0:
        Version : 1.2
  Creation Time : Thu Jun 28 14:38:32 2012
     Raid Level : raid0
     Array Size : 2499999744 (2384.19 GiB 2560.00 GB)
   Raid Devices : 4
  Total Devices : 4
    Persistence : Superblock is persistent

    Update Time : Thu Jun 28 14:38:32 2012
          State : clean
 Active Devices : 4
Working Devices : 4
 Failed Devices : 0
  Spare Devices : 0

     Chunk Size : 256K

           Name : servername:0  (local to host servername)
           UUID : d1b36e91:11335546:3afa068c:35bcb74b
         Events : 0

    Number   Major   Minor   RaidDevice State
       0     252        0        0      active sync   /dev/fioa
       1     252       16        1      active sync   /dev/fiob
       2     252       32        2      active sync   /dev/fioc
       3     252       48        3      active sync   /dev/fiod

問題なく復旧! =͟͟͞͞(๑•̀=͟͟͞͞(๑•̀д•́=͟͟͞͞(๑•̀д•́๑)=͟͟͞͞(๑•̀д•́