Como soy un “freak” de la linea de comandos y de del “make your self” así como un enamorado del kvm, libvirt, virsh, la virtualización en general y/o el “cloud” en particular, cuando hay que hacer alguna tarea de minería no me importa gastar algo de tiempo en “automatizar” dicha tarea, aunque, luego no lo vuelva a necesitar, ejejeje. Como dijo un coleguita, “El script, que crea el script, que realiza la acción”.

Bueno al grano, tenemos un servidor dedicado a la virtualización con kvm, y lo teníamos hasta arriva de máquínas que ya no usamos para nada, así que hemos decidido borra todas aquellas que no necesitamos, pero claro, algunas tienen más de un disco, y … que pereza, bueno pués virsh es tu aliado:

Listado de las máquinas a eliminar:

Para decidir obtener el listado completo de las máquinas que están corriendo en yun hypervisor con kvm utlizamos virsh list --all pero claro esto te muestra un listado muy chulo, aunque poco manejable, por ejemplo:

1
2
3
4
5
6
7
kvm:~# virsh list --all
 Id    Name                           State
 ----------------------------------------------------
  1     presice-chef-server            running
  -     template_debian_lenny          shut off
  -     template_debian_squeeze        shut off
  -     template_debian_wheezy         shut off

Como a mí lo que me interesa es una lista, que sólo tenga los nombres de las máquinas:

1
virsh -q list --all | awk '{print $2}' > tmp/vms.list

Ojo, primero he editado dicho fichero, y he quitado todas aquellas máquinas que tengo y/o quiero conservar.

Script para borrar una máquina

Al eliminar una máquina hay que tener en cuenta tanto los discos como la definicion de la propia máquina.

Para obtener los discos que está usando un “dominio” en concreto usamos virsh domblklist <dominio>, otro comando muy chulo, aunque de nuevo, la información que optenemos es poco manejable:

1
2
3
4
Target     Source
------------------------------------------------
vda        /var/lib/libvirt/images/<nombre-disco>.img
hdc        -

Y para eliminar una máquina, lo que se usa es virsh undefine <dominio>.

Llegado a este punto quiero aclarar un par de cosas:

  • dominio == máquina virtual
  • Eliminar máquina virtual == borrar discos + realizar undefine de dicha máquina

Así pues, he creado el siguiente script:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/bin/bash
[ $# -lt 1 ] && echo "Falta Dominio" && exit 1

DOM=$1

for IMG in $(virsh domblklist $DOM | awk '/\/var.*.img/ {print $2}')
do
    echo "Borramos: "
    echo $DOM:$IMG
    rm -vf $IMG
done

echo "Eliminamos $DOM"
virsh undefine $DOM

Y para rizar el rizo, como tengo mi listilla con las máquinas que quiero borrar en tmp/vms.list ejecuto:

1
for DOM in $(cat tmp/vms.list);do bash borrar_maquina.sh $DOM;done

Y e voilà me he desecho de todas las máquinas que no quería.

Hasta otra.