2011年7月16日

XenServerのiSCSI共有ストレージが壊れた時の復旧方法メモ

トラブルの概要


先日、社内で使っているXenServerの共有ストレージにアクセス出来なくなると言うトラブルが起こった。

使っていた共有ストレージは、Buffalo TeraStation ProのiSCSIモデル。セットアップしてから約1年半、全く何のトラブルも無く動いていた機器だったので、油断していた。

ビルディングのメンテナンスで長時間の停電があって、その停電からの復帰後に起動したら「iSCSIの論理ボリュームを作成出来ない」という旨のエラーがストレージ側のログに出て、XenServerからの接続が一切出来なくなってしまった。

TeraStationの管理画面を開いて色々やって見たけれどもどうもらちが開かないので、TeraStationからHDDを取り出してPC(サーバー)に直接接続してみた。Raid1で4本のHDDを2本ずつ別々にミラーリングしているだけだったので、1本だけ取り出してもそのまま読めるだろうと思ったのだ。

まずはPC上でDVDからUbuntuを起動する。でもそのままではHDDはマウント出来なかった。かなり焦りながら調べた所、どうやら mdadm コマンドでSoftware Raidとして認識させる必要があるらしいという事が分かった。
ソフトウェアRAIDのデグレード(縮退)モードからの復旧 - RX-7乗りの適当な日々

mdadmを使ったRAIDの再構成 - 日々雑文



mdadmでミラーリングを認識


まずは、
sudo apt-get install mdadm
でmdadmをインストール。
mdadm --examine --scan
cat /proc/mdstat
これでRaidの認識は出来た。次に、
mdadm --run /dev/md0
mdadm --run /dev/md1
mdadm --run /dev/md2
とやると、ミラーリングされたデバイスに片肺状態でアクセス可能になる。
cat /proc/mdstat
でACTIVEと表示されるのが確認出来る。



lvm2で論理ボリュームを認識


ここまで来たら、lvm2で論理ボリュームを確認する所までは一気に行ける。
sudo apt-get install lvm2
pvscan
vgscan
lvscan

これで論理ボリュームの情報が表示されればOK。保存されていた仮想マシンのディスクイメージの分だけ論理ボリュームが存在している。

この論理ボリュームを何とかUbuntuでマウント出来れば、データが取り出せるはずだ。よし、復旧までもう少し。。。

と思ったが、ここからがまた結構長かった。データがそこにあるのが分かっているのに取り出せない、という辛い状態で数時間を費やす事になってしまった。

しょんぼり技術メモ

LVMの論理ボリュームをddでコピー - litediary




ddで吸いだす


とりあえずlvmの論理ボリュームのままでは扱いにくいので、 dd コマンドでボリュームを丸ごと別のディスクにファイルとしてコピーしておく。実はddコマンドなんて普段使う事がほとんど無いので、勉強になった。(笑)
dd if=/dev/VS_XenStorage..(論理ボリュームの名前) of=/media/EXTERNAL/data.vhd bs=4M
これで論理ボリュームからdata.vhdというファイルにコピー出来た。

さて、XenServerの仮想マシンのイメージはVHD形式で保存されているらしいという事は分かったのだが、それがどうやってもマウント出来ない。

最初は losetup と kpartx と言うコマンドでループバックデバイスを構成してから mountコマンドでマウントという方法を試した。下の例の様に、その方法で解決出来たという情報がいくつか見つかったからだ。
Citrix Forums : Unable to mount a VHD in Dom0 ...

CTX117791 - How To Mount a Linux LVM Partition in a XenServer Host - Citrix Knowledge Center

CTX116183 - How To Mount a XenVM Filesystem on XenServer Host - Citrix Knowledge Center

Xenのイメージファイルをマウントする « そこはかと

lvmのディスクイメージをmount - 間違いだらけの備忘録

LVMで使っていたドライブからデータを救出する - kinneko@転職先募集中の日記

上の方法ではどうしても上手く行かなかったので、さらに検索。。。

次に、vdfuse というコマンドでVHDがマウント出来るらしいという事でやって見たが、これもなぜか上手く行かなかった。
Mounting a VHD in Linux




VirtualBoxでVHDをアタッチ


一晩空けて、ふと思い付いた。VirtualBoxの仮想マシンにVHDファイルをアタッチして見たらどうだろうか。。。結果、これが見事に成功だった。VirtualBox上のUbuntu仮想マシンで、アタッチされたディスクをマウントして無事データを復旧する事が出来た。

ただこの方法では、VirtualBoxでアタッチする時にエラーになって出来なかったケースもあった。確か「Parent file with UUID XXXX-XXX-XXXX-....XXX cannot be found...」みたいなエラーメーッセージだった。

これは、どうもXenServerでスナップショット機能を使っていた場合に起こる様だ。スナップショットによって複数の論理ボリュームにディスクイメージのデータが分散してしまっている場合は、VirtualBoxでは上手くアタッチ出来ないのかも知れない。

あと、qemu-img のコンバート機能を使ってもVHDからRAWフォーマットに変換出来るそうだ。RAWフォーマットに変換出来れば、あとは上記のlosetup と kpartxを使う方法でマウント可能になる。
qemu-img convert -f vpc -O raw data.vhd data.raw



XenConvertで仮想マシンを復旧


データをVHDのイメージから取り出す事は上の方法で出来たが、仮想マシン自体をもう一度XenServerで起動するにはどうしたら良いだろうか。データだけ取り出すよりも、元の仮想マシンがそのまま動かせればそれに越した事はない。

まず考えたのは、上でコピーしたdata.vhdファイルの中味を、ddコマンドでXenServerのローカルストレージに作った領域に書き戻してやるという方法だった。理論的にはこれでバッチリ復旧だと思った。でも実際にローカルストレージに元のイメージと同じサイズの仮想ディスクを作成して、そこに dd コマンドで仮想マシンのイメージをそのまま書きこんで起動しようとしても、エラーになって出来なかった。

そこで最後の手段として、VHDのイメージをXenConverterで読み込んで、変換先に「XenServer」を指定して変換して見た。これはなんとか上手く行った。XenConverterでの処理は1台の仮想マシンにつき2時間~5時間ぐらいかかるので大変だったけれども、最終的にはほとんどの仮想マシンをこの方法で元通り稼働させる事が出来た。

復旧後のXenServerのホストはもちろん「TeraStation無し」で動いている。今はローカルストレージをメインで使って、プラス別のLinuxサーバーのNFSシェアを共有ストレージとして使っている。

「NFSは遅いだろう」という先入観があったけれども、TeraStationのiSCSIの時と比べると変わらない。というよりもむしろパフォーマンスは良くなっているかも知れない。