Conversión de máquinas virtuales VMWare a Xen

A la hora de implantar una nueva aplicación de servidor es imprescindible realizar un detallado estudio de la misma que incluya entre otras cosas pruebas de funcionamiento y requerimientos técnicos. En estos casos lo habitual es generar un entorno sandbox en el que instalar la aplicación y llevar a cabo el estudio sin miedo a «estropear nada». Sin duda, la mejor opción para obtener un entorno aséptico es el uso de la virtualización.

De hecho, es muy habitual que los proveedores de las aplicaciones ofrezcan máquinas virtuales preinstaladas para que sólo tengamos que lanzarlas y realizar el estudio. Sin embargo, la mayoría de dichas VM de prueba están basadas en VMWare debido a la popularidad que éste tiene en entornos corporativos. Personalmente, prefiero utilizar Xen como solución de virtualización en servidores porque, aparte de que es software de licencia libre, ofrece un impresionante conjunto de funcionalidades y capacidades que nos permiten virtualizar prácticamente cualquier sistema operativo bajo cualquier circunstancia técnica.

La escasa disponibilidad de VM de prueba en formato Xen no me ha impedido utilizarlas, ya que lo que hago es traducirlas desde el formato de VMWare. La receta que sigo para ello es lo que quiero compartir en el artículo de hoy. Antes de nada, debo apuntar que sólo he migrado VMs basadas en Linux. Si alguien necesita hacerlo con VMs basadas en Windows (le deseo suerte), un buen punto de partida previo es éste artículo de Microsoft.

Para ello, vamos a necesitar tener instalado el paquete qemu en nuestro servidor. En Debian es tan sencillo como:

# apt-get install qemu

Lo siguiente es comprobar el formato concreto de la imagen de la VM origen (vmdk o raw), cuyo fichero tiene extensión vmdk:

# qemu-img info Test1.vmdk
image: Test1.vmdk
file format: vmdk
virtual size: 82G (88081432576 bytes)
disk size: 2.0G

En este caso el formato de la imagen es el nativo de VMWare, así que debemos proceder a su conversión.

qemu-img convert Test1.vmdk -O raw Test1.img

Veamos un ejemplo con una imagen en formato raw:

# qemu-img info Test2.vmdk
file format: raw
virtual size: 82G (88081432576 bytes)
disk size: 2.0G

En este caso, basta con que renombremos la extensión a img:

# mv Test2.vmdk Test2.img

Ahora toca guardar la imagen en su directorio correspondiente:

# mkdir -p /home/xen/domains/test1/
# mv Test1.img /home/xen/domains/test1/

Para terminar, tenemos que generar el fichero de configuración de la nueva VM, que guardaremos en /etc/xen. En nuestro ejemplo, el fichero se llamará /etc/xen/Test1.cfg y tendrá el siguiente contenido:

disk = [ 'file:/home/xen/domains/test1/Test1.img,xvda,w' ]

Las imágenes VMWare suelen venir acompañadas de un fichero con extensión vmx, que contiene información sobre el hardware virtualizado de la VM. Suele ser muy interesante consultarlo y copiar a la configuración de la máquina Xen aquellas características que nos puedan ser de utilidad. En nuestro ejemplo, nos encontramos lo siguiente:

# less Test1.vmx
...
memsize = "2048"
numvcpus = "2"
...

Y lo trasladamos al fichero Test1.cfg de Xen así:

memory = '2048'
vcpus = '2'

Estamos preparados para arrancar la nueva máquina Xen:

# xm create -c Test1.cfg
Using config file "/etc/xen/Test1.cfg".
Started domain Test1
...

En caso de que todo vaya bien, podemos incluir en el fichero de configuración más información, como el nombre de la máquina, la configuración de red o el comportamiento de la VM ante el cierre del sistema:

name = 'test1.ejemplo.com'
vif = [ 'ip=192.168.10.55' ]
on_poweroff = 'destroy'
on_reboot = 'restart'
on_crash = 'restart'

Por último, una vez estemos satisfechos con el resultado, deberíamos incorporar esta nueva máquina a la gestión de dominios de Xen:

# xm new Test1.cfg
Using config file "Test1.cfg".

Un último apunte antes de terminar. A veces nos podemos encontrar con imágenes VMWare que están divididas en varios ficheros. En ese caso procederemos a convertir cada fichero antes de unirlos en una sola imagen Xen final. Por ejemplo:

# ls
Test3-s001.vmdk Test3-s004.vmdk Test3.vmdk
Test3-s002.vmdk Test3-s005.vmdk Test3.vmx
Test3-s003.vmdk Test3-s006.vmdk
# for i in `ls *[0-9].vmdk`; do qemu-img convert $i -O raw ${i/vmdk/raw} ; done
# cat *.raw >> Test3.img

Espero que esta receta os sea de utilidad a la hora de probar nuevas aplicaciones y servicios para vuestros servidores. Espero vuestros comentarios.