Eucalyptus 2.0.3 で DeleteVolume できなくなる件

ということで、突如 DeleteVolume ができなくなった我が家の Eucalyptus ですが、以下のような感じです。

DescribeVolume の結果は特に問題なし

 [root@eucalyptus ~]# euca-describe-volumes
 VOLUME  vol-58C70625     1              cluster0        available       2011-06-09T04:25:15.757Z
 VOLUME  vol-592B061A     2              cluster0        available       2011-06-09T04:25:28.287Z

DeleteVolumeを実施

 [root@eucalyptus ~]# euca-delete-volume vol-58C70625
 VOLUME  vol-58C70625

でも消えてない…

 [root@eucalyptus ~]# euca-describe-volumes
 VOLUME  vol-58C70625     1              cluster0        available       2011-06-09T04:25:15.757Z
 VOLUME  vol-592B061A     2              cluster0        available       2011-06-09T04:25:28.287Z

/var/log/messages には LVM の lv がないというログが…

 Jun 20 02:01:20 eucalyptus tgtd: backed_file_open(92) Could not open /dev/vg-1iOYfw../lv-CdT28w.., No such file or directory

ちなみに DB には問題なさげ…

 [root@eucalyptus ~]# grep vg-1iOYfw.. -r /var/lib/eucalyptus/db/
 /var/lib/eucalyptus/db/eucalyptus_storage.script:INSERT INTO ISCSIVOLUMEINFO VALUES('ff808081307291f4013072a5d7960014','/dev/loop1',NULL,'lv-CdT28w..','/dev/loop1','cluster0',2,NULL,'available','vg-1iOYfw..','vol-592B061A',NULL,1,'iqn.2009-06.com.eucalyptus.cluster0:store2','eucalyptus',2)

ループバックデバイスにもちゃんと…

 [root@eucalyptus ~]# losetup -a
 /dev/loop0: [0813]:118587831 (//var/lib/eucalyptus/volumes/vol-58C70625)
 /dev/loop1: [0813]:118587832 (//var/lib/eucalyptus/volumes/vol-592B061A)

実体もある…

 [root@eucalyptus ~]# ls -al /var/lib/eucalyptus/volumes/vol-592B061A
 -rw-r--r-- 1 eucalyptus eucalyptus 2151677952 Jun  9 13:25 /var/lib/eucalyptus/volumes/vol-592B061A

削除しようとしたボリュームに対する tgtadm コマンドが止ってる…?

 [root@eucalyptus ~]# ps auxww | grep [i]scsi
 root      4221  0.0  0.0   3796   440 ?        S    02:01   0:00 tgtadm --lld iscsi --op new --mode logicalunit --tid 2 --lun 1 -b /dev/vg-1iOYfw../lv-CdT28w..
 root     20681  0.0  0.0   3796   436 ?        S    03:04   0:00 tgtadm --lld iscsi --op unbind --mode target --tid 1 -I ALL

確かにない…

 [root@eucalyptus ~]# ls -al /dev/vg-1iOYfw../lv-CdT28w..
 ls: /dev/vg-1iOYfw../lv-CdT28w..: No such file or directory

っていうか、すごく…何もないです…

 [root@eucalyptus ~]# ls /dev/ | grep vg- | wc -l
 0

で、原因追求しようとしたけど、あまり深く追う余裕がないので、さっくりと諦めて復旧…っていうか、「再インストールするよりはマシだよ」レベルのあまり良くない直し方で。

CLC/Walrus/SC を停止 (同居環境なため、Walrus は完全に巻き添え)

 [root@eucalyptus ~]# /etc/init.d/eucalyptus-cloud stop
 Stopping Eucalyptus services: walrus sc cloud done.

iSCSI まわりを停止

 killall -9 tgtadm
 killall -9 tgtd

lv を削除

 [root@eucalyptus ~]# lvdisplay
   --- Logical volume ---
   LV Name                /dev/vg-1iOYfw../lv-CdT28w..
 (snip)
   --- Logical volume ---
   LV Name                /dev/vg-3QD4nw../lv-V_kuAw..
 [root@eucalyptus ~]# lvremove /dev/vg-1iOYfw../lv-CdT28w..
   Logical volume "lv-CdT28w.." successfully removed
 [root@eucalyptus ~]# lvremove /dev/vg-3QD4nw../lv-V_kuAw..
   Logical volume "lv-V_kuAw.." successfully removed

vg を削除

 [root@eucalyptus ~]# vgdisplay
   --- Volume group ---
   VG Name               vg-1iOYfw..
 (snip)
   --- Volume group ---
   VG Name               vg-3QD4nw..
 [root@eucalyptus ~]# vgremove vg-1iOYfw..
   Volume group "vg-1iOYfw.." successfully removed
 [root@eucalyptus ~]# vgremove vg-3QD4nw..
   Volume group "vg-3QD4nw.." successfully removed

pv を削除

 [root@eucalyptus ~]# pvdisplay
   --- Physical volume ---
   PV Name               /dev/loop1
 (snip)
   --- Physical volume ---
   PV Name               /dev/loop0
 [root@eucalyptus ~]# pvremove /dev/loop1
   Labels on physical volume "/dev/loop1" successfully wiped
 [root@eucalyptus ~]# pvremove /dev/loop0
   Labels on physical volume "/dev/loop0" successfully wiped

ループバックマウントを解放

 [root@eucalyptus ~]# losetup -d /dev/loop0
 [root@eucalyptus ~]# losetup -d /dev/loop1

で、ここまでは簡単だし、上記のような手作業じゃなくサラっとワンライナーで消したりしてもいいんですが、こっから先が説明が面倒かつ間違えると環境破壊を起してしまうので、慎重に。

DB をバックアップ

 [root@eucalyptus ~]# cp -a /var/lib/eucalyptus/db /root/var.lib.eucalyptus.db.`date +'%Y%m%d'`

ボリュームについて記述してあるテーブルとトランザクションログのファイルを表示

 [root@eucalyptus ~]# cd /var/lib/eucalyptus/db/
 [root@eucalyptus db]# grep vol- -r ./ | cut -d':' -f1 | sort | uniq
 ./eucalyptus_images.log
 ./eucalyptus_images.script
 ./eucalyptus_storage.script

で、ここで表示されたテーブルとトランザクションログの中から前述のボリュームに該当するレコードとそれに付随する SQL 文を削除します (本当は CLC だけもう一度起動して、トランザクションログをテーブルデータにマージさせたほうが楽です)。

これらの作業が終ったら、CLC/Walrus/SC を起動してボリュームを作ってみると、環境が直ったか否かがわかります。

CreateVolume して…

 [root@eucalyptus db]# euca-create-volume -s 8 -z cluster0
 VOLUME  vol-592C0622    8       creating        2011-06-19T18:45:19.713Z

DescribeVolume して…

 [root@eucalyptus db]# euca-describe-volumes
 VOLUME  vol-592C0622     8              cluster0        available       2011-06-19T18:45:19.713Z

lv もちゃんとあるよね?

 [root@eucalyptus db]# ls /dev/|grep vg-|wc -l
 1

最初、本件は連載のネタになるかと考えたんですが、バッドノウハウすぎて、ちっとも「復旧」になってないので日記に書くことにしました。一応上記の手順では実体のボリュームは /var/lib/eucalyptus/volumes/ 配下に残っているので、ちょっと面倒な手順を要しますが、データを取り出すことは可能です。(それについては別の機会で触れ…ないかも)