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

こんな感じでやると、そこそこ安全にきれいに消せるかなぁ……と。

https://manimani.cc/lib/plugins/linkback/exe/trackback.php/wiki:kvm:remove_domain_clenly