kvm ゲストを安全に削除する
単純に削除するのではなく、ボリューム等も含めてきれいに、且つ誤削除なんかの危険を極力減らした手順を考えてみる。
割り当てボリュームの確認
まず削除対象の仮想ゲストにくっついているボリュームを確認します。
virsh # domblklist dom1 Target Source ------------------------------------------------ vda /dev/vg001/dom1_lv001 vdb /dev/vg001/dom1_lv002
で、うちの環境はディスクは仮想ホストの lvm ボリュームをそのまま block デバイスとして仮想ゲストに割り当てているので、virsh ではなく bash からこれらのボリュームが現在オンラインでないことを確認します。
# lvs LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert dom1_lv001 vg001 -wi-a----- 20.00g dom1_lv002 vg001 -wi-a----- 32.00g
オンラインになっている場合は Attr
が -wi-ao-----
とかになっています。その場合はたぶんなにか間違っています。
ボリュームの削除
libvirt で pool を作っている場合だと、lvm 側でいきなり削除すると libvirt 上に消せない volume が残ってしまいますね。pool がある場合とない場合で手順が異なります。
pool がある場合
単純に vol-delete
を打てばきれいに消えます。
virsh # vol-delete dom1_lv001 --pool pool001 Vol dom1_lv001 deleted
pool がない場合
仮想ホスト上の lvm で、削除対象のボリュームをディアクティベートします。
# lvchange -an /dev/vg001/dom1_lv001 # lvchange -an /dev/vg001/dom1_lv002 # lvs LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert dom1_lv001 vg001 -wi------- 20.00g dom1_lv002 vg001 -wi------- 32.00g
Attr
から a
が消えます。この状態にしてから lvremove
でボリュームを削除します。
# lvremove /dev/vg001/dom1_lv001 Logical volume "dom1_lv001" successfully removed # lvremove /dev/vg001/dom1_lv002 Logical volume "dom1_lv002" successfully removed
このとき、先の手順でボリュームのディアクティベートをやっていないと「アクティブだよ? 本当に消すの?」みたいな警告が入ります。また、ディアクティベートしてあるボリュームは /dev/vg001/ のデバイスが消えているので tab 補完とかが利きません。手打ちしましょう。
仮想ゲストの削除
ここまできてから、仮想ゲストを削除します。最初にこの手順をやった方が順番的に正しい気もするんですが、そうすると紐付いていたボリュームを確認することができなくなるので、ボリューム削除がちょっと怖くなるんですよね……
virsh # undefine dom1 Domain dom1 has been undefined
こんな感じでやると、そこそこ安全にきれいに消せるかなぁ……と。