ホットスワップを用いたソフトウェアRAID復旧

気付いたら6月です。驚きですね。
他にもVM周りとか色々書きたいことはあるのですが、差し当たってソフトウェアRAIDを復旧した時のメモなどを書きたいと思います。
キーワード: mdadm, RAID, hotswap, hotplug, software RAID

さて、SASが12本刺さる2Uのサーバ(RAID箱ではない)という面白いものが研究室にありまして、それに2TのSASを12本刺し、mdでRAID1にして合計2T * 6 = 12Tという感じになっています。
で、今回壊れたのがsdgだったのですが、これがなかなか面倒な感じでした。パーティションの構成は以下です。

sdaとsdgをそれぞれ4パーティションに切って、そのうち2パーティションずつをmdでRAID1にし、1つずつをswapにし、1つずつを/bootにしています。
/bootはRAIDにはしておらず、単にそれぞれに/bootを用意しておいて、片方が壊れたときにも片方から起動できるようにしてあるだけです。
さて、状況を確認してみます。

# less /proc/mdstat

md5 : active raid1 sda3[0] sdg3[1]
      976562432 blocks [2/2] [UU]

md6 : active raid1 sda4[0] sdg4[2](F)
      944725376 blocks [2/1] [U_]

というわけで、sdg4が壊れているようです。
やらなければいけないことは

  • swapとRAIDからsdgを切り離す
  • sdgを抜いていい状態にし、ディスクを交換する
  • 以前と同じパーティションに切る
  • swaponとRAIDのresync
  • grubのインストール

という感じです。
では具体的な手順を。

swapとRAIDからsdgを切り離す

# swapoff /dev/sdg2
# mdadm --manage --fail /dev/md6 /dev/sdg4
# mdadm --manage --remove /dev/md6 /dev/sdg4
# mdadm --manage --fail /dev/md5 /dev/sdg3
# mdadm --manage --remove /dev/md5 /dev/sdg3

これでOK

sdgを抜いていい状態にし、ディスクを交換する

# echo 1 >  /sys/block/sdg/device/delete

これで抜いて大丈夫になったはず。
ディスクを交換。今回は自動的に新たなディスクがsdgとして認識された。

以前と同じパーティションに切る

はい。partedを使ってGPTで切っていたので、同じようにpartedで同じように切ればいいのですが、「見ながら同じように切る」なんて許せないですよね。コピーしたいですよね。

そこでこうしました。

# dd if=/dev/sda of=/dev/sdg count=100

先頭のMBRをコピーすればおk!
bsが512なので、51.2kBコピーすることになります。こんなにコピーする必要ありませんが、なんとなく。念のため。

確認してみます。

# parted /dev/sdg print
Model: SEAGATE ST32000444SS (scsi)
Disk /dev/sdg: 2000GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt

Number  Start   End     Size    File system  Name  Flags
 1      17.4kB  1000MB  1000MB  ext3                  boot
 2      1000MB  33.0GB  32.0GB	
 3      33.0GB  1033GB  1000GB                            raid
 4      1033GB  2000GB  967GB                             raid

ちゃんと切れています。flagも立っていて、ちゃんとgptにもなっています。
フォーマットはまだしていませんが、先頭のパーティションだけはさきほどのddで一部コピーされてext3と判断されているようです。

3と4はRAIDでresyncするのでフォーマットする必要はありませんが、1と2はそれぞれext3とswapにフォーマットする必要があります。

# mkfs.ext3 /dev/sdg1
# mkswap /dev/sdg2

swaponとRAIDのresync

swaponします。

# swapon /dev/sdg2

次にRAIDをresyncします。

mdadm --manage --add /dev/md5 /dev/sd3
mdadm --manage --add /dev/md6 /dev/sd4

以上でだいたい終わりです。あとは

grubのインストール

で、じつはgrubのインストールはまだやっていません。
まぁ、いざとなったらCDブートすればいいし・・・