sábado, 16 de abril de 2011

UBUNTU: Sistema Virtualización XEN sobre Ubuntu

Hace un tiempo escribí un post en el que daba una introducción a diferentes tipos de virtualización. Desde entonces esta tecnología no ha dejado de crecer y de consolidarse como una opción más que factible en todo tipo de entornos, desde domésticos hasta corporativos.
En este post explico mis experiencias con XEN en mi entorno doméstico y cómo montarlo en un servidor GNU/Linux con Ubuntu. El objetivo que tenía al buscar una solución de virtualización era encontrar una alternativa que me permitiera disponer en mis servidor doméstico de varios servidores virtuales independientes, que pudiera ejecutar máquinas virtuales tanto Windows como Linux, que tuviera por supuesto un buen rendimiento, y en la medida de lo posible que fuera una solución de software libre o cuanto menos de bajo costo.
Tras probar algunas alternativas como VMPlayer, KVM, QEMU y XEN, finalmente la opción que consideré más apropiado fue XEN. Estuve dudando bastante tiempo entre éste y KVM, pero algunos problemas que encontré con KVM y el hecho de que XEN funcione tanto con paravirtualización como con virtualización completa, así como que el módulo de XEN está previsto que se incorpore de forma nativa al nucleo de linux, inclinaron finalmente la balanza a su favor.

La instalación de XEN es realmente sencilla y es suficiente únicamente con utilizar los repositorios de Ubuntu y apt-get. La siguiente instrucción realiza la instalación de XEN y todas sus dependencias, incluyendo las xen-tools, que se utilizarán para crear las imágenes de los sistemas paravirtualizados.
$ sudo apt-get install ubuntu-xen-server
En mi caso al ser un servidor de 64 bits el comando es ligeramente diferente.
$ sudo apg-get install ubuntu-xen-desktop-amd64
Una vez instalado XEN es necesario editar el archivo “/etc/xen/xend-config.sxp” para indicar que se quieren configurar la conectividad con las máquinas virtuales en modo bridge. De este modo la conexión ethernet del anfitrión (dom0) se comparte con los huéspedes (domU’s) y todas las máquinas parecen estar conectadas directamente a la red.
$ sudo vi /etc/xen/xend-config.sxp
En este archivo hay que comentar (con un # al comienzo) la línea “(network-script network-dummy)” y añadir en su lugar la línea “(network-script network-bridge)”. En el wiki de XEN hay una completa explicación de los diferentes modelos de conexión de red existentes en XEN.
#(network-script network-dummy)
(network-script network-bridge)
Ahora es necesario aumentar el número de dispositivos loop editando el archivo “/etc/modules”. Como el número máximo de dispositivos loop que existen en el sistema es por defecto 8 y que cada máquina virtual usa 2, si queremos arrancar más de 4 máquinas virtuales habrá que incrementar este valor. Por ejemplo para permitir utilizar hasta 64 dispositivos loop habría que incluir la siguiente línea.
loop max_loops=64
Tras esto ya podemos reiniciar el equipo. Una vez hecho esto se puede comprobar que estamos trabajando ya con el kernel adecuado ejecutando “uname -r”.
$ uname -r
2.6.22-14-xen
A continuación voy a explicar cómo crear máquinas virtuales huéspedes (domU’s) de dos formas diferentes. La primera de ella es utilizando las características de paravirtualización de XEN y su hypervisor, y la segunda, utilizando virtualización completa, mediante las capacidades de los procesadores Intel VT y AMD-V.
Las principales diferencias entre ambas es que con la paravirtualización únicamente podemos instalar sistemas operativos que han sido modificados, por lo que no es posible utilizarla para virtualizar máquinas Windows. Por contra, es posible realizar un mayor control de los huéspedes gracias al hypervisor.

Máquinas virtuales con paravirtualización

Al instalar las xen-tools disponemos ya de la información básica para instalar un buen conjunto de distribuciones GNU/Linux como sistema operativo de nuestros huéspedes. Podemos ver estos sistemas disponibles en “/usr/lib/xen-tools”.
$ ls -l /usr/lib/xen-tools
total 32
drwxr-xr-x 2 root root 4096 2007-12-24 16:11 centos4.d
-rwxr-xr-x 1 root root 4306 2007-09-17 01:13 common.sh
drwxr-xr-x 2 root root 4096 2007-12-24 16:11 dapper.d
drwxr-xr-x 2 root root 4096 2007-12-24 16:11 debian.d
drwxr-xr-x 2 root root 4096 2007-12-24 16:11 edgy.d
lrwxrwxrwx 1 root root    8 2007-12-24 16:11 etch.d -> debian.d
drwxr-xr-x 2 root root 4096 2007-12-24 16:11 fedora.d
lrwxrwxrwx 1 root root    6 2007-12-24 16:11 feisty.d -> edgy.d
drwxr-xr-x 2 root root 4096 2007-12-24 16:11 gentoo.d
lrwxrwxrwx 1 root root    6 2007-12-24 16:11 gutsy.d -> edgy.d
lrwxrwxrwx 1 root root    8 2007-12-24 16:11 lenny.d -> debian.d
lrwxrwxrwx 1 root root    8 2007-12-24 16:11 sarge.d -> debian.d
lrwxrwxrwx 1 root root    8 2007-12-24 16:11 sid.d -> debian.d
lrwxrwxrwx 1 root root    8 2007-12-24 16:11 stentz.d -> fedora.d
Vamos a comenzar a crear máquinas virtuales, para ello lo primero que vamos a hacer es crear una carpeta donde alojarlas. En mi caso he creado la carpeta “/opt/vms/xen”.
$ sudo mkdir -p /opt/vms/xen
El procedimiento para crear nuevas máquinas virtuales es realmente sencillo gracias a las xen-tools. Lo primero que tendremos que hacer será configurar los valores por defecto que se utilizarán al crear las máquinas. Estos valores se configuran en el archivo “/etc/xen-tools/xen-tools.conf”.
# sudo vi /etc/xen-tools/xen-tools.conf
En mi caso he modificado los siguientes valores. De todas formas hay que tener en cuenta que es posible indicar otros valores diferentes a la hora de crear las máquinas.
[...]
 
dir = /opt/vms/xen
 
[...]
size   = 4Gb      # Disk image size.
memory = 128Mb    # Memory size
swap   = 128Mb    # Swap size
[...]
 
dist   = gutsy     # distribución por defecto para instalar
 
[...]
dhcp = 1
 
[...]
 
passwd = 1
 
[...]
 
arch = i386
 
[...]
 
mirror = http://de.archive.ubuntu.com/ubuntu/
 
[...]
Con estos parámetros indico que por defecto las máquinas que voy a crear se van a alojar en la carpeta que he creado, que van a tener un tamaño de disco de 4GB, un swap de 128MB y 128MB de RAM. Indico también que se va a utilizar por defecto la distribución de Ubuntu Gutsy Gibbon, que se utilice como arquitectura i386, que se pida el password de root al crear la máquina, y que se utilice como dhcp para la conexión de red. En caso de no disponer de un servidor de dhcp o querer configurar las ip de forma fija, habría que haber utilizado en lugar de “dhcp = 1″ algo como:
gateway   = 192.168.1.1
netmask   = 255.255.255.0
broadcast = 192.168.1.255
En este punto ya tenemos XEN instalado y configurado, hemos creado la ubicación para almacenar las máquinas y hemos configurado xen-tools para la creación de éstas. Ahora ya podemos comenzar a crear las máquinas virtuales.
Para ello utilizaremos el comando xen-create-image. Este comando dispone de diferentes parámetros, para la mayoría de los cuales ya hemos configurado los valores por defecto. Puede obtenerse información detallada de cada uno de ellos con “man xen-create-image”. En el ejemplo indico que se cree una nueva máquina virtual con nombre “vm1″, que se sobreescriba si ya existe, y que se utilice como identificador mac “aa:00:00:00:00:11″. Este último valor lo indico para configurar posteriormente en mi servidor dhcp una dirección ip fija, en caso de que no necesites esto no haría falta indicar este parámetro y se generaría una dirección aleatoria.
$ sudo xen-create-image --hostname=vm1 --force --mac=aa:00:00:00:00:11
Este proceso puede tardar unos cuantos minutos, principalmente la parte en la que se realiza el debootstrap. Tras la creación de la máquina se obtiene un archivo de configuración en /etc/xen/vm1.cfg, el cual es posible modificar para ajustar diferentes valores.
Ya estamos en disposición de ejecutar la máquina virtual, para lo cual hay que utilizar el comando “xm”.
$ sudo xm create /etc/xen/vm1.cfg
 
$ sudo xm console vm1
Las máquinas virtuales que se crean con xen-create-image no disponen de entorno gráfico, por lo que tendremos que utilizar el cliente de SSH para conectarnos. En caso de necesitar el entorno gráfico podremos instalar los paquetes correspondientes desde la propia máquina. Esto puede ser un inconveniente en algunas situaciones, pero por otra parte permite disponer de máquinas virtuales con un tamaño mínimo y plenamente operativas.
Con xm list puede obtenerse una lista de todas las máquinas activas.
$ sudo xm list
Para detener la máquina virtual se puede utilizar también el comando “xm”, que envía la orden de apagado a la máquina virtual.
$ sudo xm shutdown vm1
Si queremos que una máquina virtual se inicie automáticamente al arrancar el servidor habrá que crear un enlace simbólico de la siguiente forma.
$ sudo ln -s /etc/xen/vm1.cfg /etc/xen/auto

Máquinas virtuales con virtualización completa

Vamos a ver ahora cómo instalar máquinas virtuales con virtualización completa. A mi parecer esta es la forma más sencilla de disponer de máquinas virtuales con escritorio gráfico, tanto Windows como Linux, aunque como inconveniente no dispondremos de algunos de los controles existentes mediante el comando “xm” para las paravirtualizadas. De esta forma si indicamos con xm que se pare una máquina, lo que se producirá sería lo mismo que si la desconectásemos de la red, por lo que en su lugar deberíamos conectarnos a cada una de las máquinas que queramos apagar y apagarlas manualmente desde dentro de ellas.
Antes de nada es necesario comprobar que nuestro procesador dispone de las extensiones de virtualización, buscando la cadena de texto “vmx” en los datos de información del procesador “/proc/cpuinfo”. Si el comando devuelve algo, tal como en el ejemplo, significa que disponemos de las extensiones.
$ egrep '(vmx|svm)' /proc/cpuinfo
flags           : fpu tsc msr pae mce cx8 apic mtrr mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm syscall nx lm constant_tsc pni monitor ds_cpl vmx est tm2 ssse3 cx16 xtpr lahf_lm
flags           : fpu tsc msr pae mce cx8 apic mtrr mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm syscall nx lm constant_tsc up pni monitor ds_cpl vmx est tm2 ssse3 cx16 xtpr lahf_lm
El primer paso consistirá en crear el archivo que servirá como imagen de la máquina virtual. Para ello lo más sencillo es utilizar el comando “dd”, por ejemplo indicando que cree un archivo de nombre “disk.img” con un tamaño de 4GB (4096 bloques de 1MB).
$ mkdir -p /opt/vms/xen/domains/winxp
$ dd if=/dev/zero of=/opt/vms/xen/domains/winxp/disk.img bs=1M count=4096
Tras esto hay que crear manualmente el archivo de configuración de la máquina virtual, en este caso “/etc/xen/winxp.cfg”.
kernel = "/usr/lib/xen/boot/hvmloader"
builder = 'hvm'
device_model = '/usr/lib/xen/bin/qemu-dm'
memory = 512
name = "winxp"
vcpus = 1
vif = [ 'type=ioemu, bridge=xenbr0' ]
disk = [ 'file:/opt/vms/xen/domains/winxp/disk.img,ioemu:hda,w' ]
cdrom='/dev/scd0'
ne2000=0
boot='d'
Es necesario comprobar que la ruta indicada en kernel existe, ya que puede variar entre sistemas (/usr/lib/xen/boot/hvmloader, /usr/lib/xen-ioemu-3.1/boot/hvmloader, …). La última línea indica que se arranque desde CD, una vez instalado el sistema operativo habría que cambiarla por boot=’c’. Si en vez de arrancar desde el CD queremos que Más información de las opciones disponibles con “man xmdomain.cfg”.
Una vez creado el archivo ya podemos iniciar la máquina.
$ xm create winxp.cfg
Automáticamente se mostrará una ventana con el proceso de arranque e instalación. A partir de aquí habrá que seguir los pasos habituales tal como si estuviéramos trabajando con una estación física normal. En mi caso una recomendación sería modificar la configuración de la máquina virtual para que no muestre la ventana automáticamente al iniciarla, sino que se pueda conectar con ella a través de VNC. Para ello hay que añadir las siguientes líneas al archivo de confiración.
vnc=1
vncunused=0
vncviewer=0
sdl=0
Para conectarnos por VNC tendremos que conectarnos a la dirección ip del equipo anfitrión (dom0) e indicar el puerto concreto de VNC que se ha asignado a la máquina virtual.
$ sudo xm list -l
[...]
    (device
        (vfb
            (vncunused 0)
            (uuid afbb5ef1-5c86-fd33-3c1e-4cfd80cb87b7)
            (location 192.168.1.1:5901)
        )
    )
 
[...]
 
$ vncviewer 192.168.1.1::5901
Es importante poner dos puntos antes del 5901 para que lo tome como puerto y no como display. Existen otras formas de configurar VNC para que se muestren las máquinas siempre en los mismos displays, hay información al respecto en “man xmdomain.cfg”.
El procedimiento para instalar una máquinar virtual con Linux y entorno gráfico es idéntico, crear el archivo de imagen, el archivo de configuración y arrancar la máquina para instalar el sistema operativo. Es probable que al arrancar el equipo la primera vez e intentar instalar el sistema operativo se produzca un cuelgue y no sea posible llegar a la pantalla de instalación. Si ocurre esto se debe a un problema con el logotipo que se suele mostrar al arrancar desde CD en muchas distribuciones. Para resolverlo es necesario modificar la imagen del CD de instalación.
El primer paso es obtener una imagen del CD de instalación (no es necesario si ya disponemos del ISO). El siguiente comando hace una copia del CD de instalación, en este caso de ubuntu, y la guarda como /opt/ubuntu-7.10.iso
$ dd if=/dev/cdrom of=/opt/ubuntu-7.10.iso
Una vez tenemos la imagen del CD de instalación hay que modificarla para desactivar el GFSBOOT. Para ello podemos probar primero con el siguiente comando.
$ sed -e 's/GFXBOOT bootlogo/#FXBOOT bootlogo/g' < /opt/ubuntu-7.10.iso > /opt/ubuntu-7.10-nogfxboot.iso
Para probar la imagen no es necesario volver a generar un CD, podemos indicarle a XEN que utilice directamente el archivo ISO modificando el archivo de configuración de la máquina virtual.
[...]
disk = ['file:/opt/vms/xen/domains/winxp/disk.img,ioemu:hda,w', 'file:/opt/ubuntu-7.10-nogfxboot.iso,ioemu:hdc:cdrom,r']
[...]
Si sigue sin funcionar existe otra opción para modificar la imagen, utilizando gfxboot-disable.
$ gfxboot-disable /opt/ubuntu-7.10.iso
Más información

No hay comentarios:

Publicar un comentario