Skip to main content

Howto de Virtualización con Xen en Debian Squeeze (usando LVM, bridges a interfaces de red y máquinas paravirtualizadas)

Imagen de kadejo

- Instalar Debian configurando la partición principal como LVM. Para que Grub2 pueda instalarse sin problemas en algunos servidores debe crearse una partición especial en primer lugar de tipo bios_grub (1 Mb es suficiente), aunque en general este paso no es necesario. Sí es imprescindible crear otra partición para /boot de 256Mb (puede ser de tipo ext4). El resto del disco duro puede ser asignado a LVM en el que crearemos un grupo único (VG) en el que dentro crearemos una partición (LV) para / (podemos llamarla root) de un tamaño moderado y otro LV para la swap (podemos llamarla intercambio), del tamaño apropiado según el tamaño de la RAM. El resto del espacio lo dejamos sin asignar, pues posteriormente crearemos los LVs de las máquinas virtuales.

- Una vez concluye la instalación podemos comprobar el estado del LVM con los comandos vgdisplay y lvdisplay

- Instalamos los paquetes de Xen

apt-get install xen-hypervisor xen-linux-system xen-utils xenstore-utils xenwatch xen-tools

- cambiamos la prioridad de arranque del kernel para que arranque el hypervisor

mv /etc/grub.d/10_linux /etc/grub.d/50_linux
update-grub2

- reiniciamos (reboot) y probamos que todo funciona tras el reinicio con

xm dmesg

Si no salen un montón de instrucciones definitivamente hay algún problema u omisión

---- Ajustes de red
Debian tiene una configuración diferente a la de Upstream (en la que todo se maneja mediante el script network-bridge). Sin embargo acá /usr/share/doc/xen-utils-4.0/README.Debian dice el DD que "Debian is different" y lindamente nos conduce a la página del manual de bridge-utils-interfaces, para que se haga todo en el /etc/network/interfaces. Encontré la siguiente referencia http://serverfault.com/questions/151230/debian-network-bridge-configurat..., en la respuesta más votada estaba la sentencia mágica, y a partir de ella todo furuló. He aquí los pasos:
- Editar /etc/network/interfaces
Dejamos la configuración normal de eth0 por cualquier cosa (no molesta) y agregamos los bridges.

auto xenbr0 xenbr1 xenbr2 xenbr3
iface xenbr0 inet static
bridge_ports eth0
bridge_stp no
address 10.10.20.40
netmask 255.255.255.0
network 10.10.20.0
broadcast 10.10.20.255
gateway 10.10.20.1

- una entrada de iface por cada bridge, obviamente.

- Verificar que en /etc/xen/xend-config.sxp está comentado

# (network-script network-bridge)

- y descomentado

(vif-script vif-bridge)

- Luego en los ficheros de configuración de cada máquina virtual indicar qué bridge se usará aparte de otros parámetros.
vif=[ 'bridge=xenbr1',.... ] o indicarlo en el xm-create-image (parámetro --bridge=xenbr#)

De todos modos también conseguí que funcionara con el script de Xen, pero daba errores esporádicos y tardaba infinito en arrancar y apagar. Por cualquier referencia futura, estas son las instrucciones, pero insisto, NO USAR.
http://toic.org/2008/10/06/multiple-network-interfaces-in-xen/
http://www.sparksupport.com/blog/xen-bridging
http://wiki.xensource.com/xenwiki/XenNetworking

- Agregar en /etc/xen/xend-config.sxp

(network-script network-bridge-wrapper)

- Comentar (vif-script vif-bridge)

- editar /etc/xen/scripts/network-bridge-wrapper y agregar tantas líneas como tarjetas físicas
- ojo, para evitar problemas deben tener estar conectadas y configuradas con su respectiva IP
- en el /etc/network/interfaces

#!/bin/sh
/etc/xen/scripts/network-bridge $@ vifnum=0 netdev=eth0 bridge=xenbr0
/etc/xen/scripts/network-bridge $@ vifnum=1 netdev=eth1 bridge=xenbr1

una línea por bridge/interfaz

- en los ficheros de configuración de cada máquina virtual indicar qué bridge se usará aparte de otros parámetros.

vif=[ 'bridge=xenbr1',..... ]

---- fin ajustes de red

- vamos a crear las máquinas virtuales con xen-tools, así que retocamos/revisamos algunos parámetros:

vi /etc/xen-tools/xen-tools.conf
[...]
# dir = /var/xen
[...]
lvm = VG01
[...]
fs = ext4
[...]
dist = `xt-guess-suite-and-mirror --suite` # Default
distribution to install.
[...]
gateway = 10.10.20.1
netmask = 255.255.255.0
broadcast = 10.10.20.255
[...]
passwd = 1
[...]
ext4_options = noatime,nodiratime,errors=remount-ro
[...]
serial_device = hvc0 #default
[...]
disk_device = xvda #default
[...]

- Crear la imagen

xen-create-image --hostname=cosa.salud.gob.sv --vcpus=2 --size=20Gb --swap=512Mb --ip=10.10.20.45 --bridge=xenbr1 --memory=2048Mb --arch=amd64 --role=udev

- Podemos virtualizar Ubuntu en vez de Debian (cambiar lucid por la versión deseada, p.e. natty)

xen-create-image --hostname=bbb.salud.gob.sv --dist lucid --mirror=http://sv.archive.ubuntu.com --vcpus=4 --size=100Gb --swap=1Gb --ip=10.10.20.13 --bridge=xenbr2 --memory=4096Mb --arch=amd64 --role=udev

Ojo, pueden faltar algunos paquetitos para que todo quede bien, y por supuesto pueden instalarse normalmente una vez arrancada la máquina, p.e. yo eché en falta lo siguiente:


apt-get install wget language-pack-es

- Arrancarla

xm create /etc/xen/cosa.salud.gob.sv.cfg

- Entrar a la máquina (para salir de la consola usar ctrl+])

xm console cosa.salud.gob.sv

-- Arranque automático:

mkdir /etc/xen/auto
ln -s /etc/xen/cosa.salud.gob.sv.cfg /etc/xen/auto

-- Para agregarle otra partición (obviamente, /var, ojo al SIZE)
http://wiki.stocksy.co.uk/wiki/Creating_Xen_Machines_on_Debian_Lenny#Cre...

Ejecutar en bash de la dom0

LVM_VG=$(/bin/grep lvm /etc/xen-tools/xen-tools.conf | /bin/sed -e 's/lvm = //')
XEN_HOSTNAME=cosa.salud.gob.sv
SIZE=1024G
/sbin/lvcreate -n $XEN_HOSTNAME-var -L $SIZE $LVM_VG
/sbin/mkfs.ext4 -m 1 /dev/$LVM_VG/$XEN_HOSTNAME-var
if [ $(/bin/grep "disk[\t ]*=.*\]" /etc/xen/$XEN_HOSTNAME.cfg | /usr/bin/wc --lines) -eq 0 ]; then
/bin/sed -i -e "/^disk[\t ]*=.*/a\\
'phy:/dev/$LVM_VG\/$XEN_HOSTNAME-var,xvda3,w'," \
/etc/xen/$XEN_HOSTNAME.cfg
else
/bin/sed -i -e "s/^\(disk[\t ]*=.*\)\]/\1, 'phy:/dev/$LVM_VG\/$XEN_HOSTNAME-var,xvda3,w' ]/" /etc/xen/$XEN_HOSTNAME.cfg
fi

Ahora editamos el fstab de la domU donde queremos agregar la partición

/bin/umount /dev/$LVM_VG/$XEN_HOSTNAME-disk
MOUNT_POINT=$(/bin/mktemp -d)
/bin/mount /dev/${LVM_VG}/${XEN_HOSTNAME}-disk ${MOUNT_POINT}
/bin/echo "/dev/xvda3 /var ext4 defaults 0 1" | /usr/bin/tee -a ${MOUNT_POINT}/etc/fstab
VAR_MOUNT_POINT=$(/bin/mktemp -d)
/bin/mount /dev/${LVM_VG}/${XEN_HOSTNAME}-var ${VAR_MOUNT_POINT}
/bin/cp -a ${MOUNT_POINT}/var/* ${VAR_MOUNT_POINT}
/bin/umount ${VAR_MOUNT_POINT}
/bin/umount ${MOUNT_POINT}

Reiniciar la máquina virtual del todo

xm shutdown respaldo.salud.gob.sv
xm create respaldo.salud.gob.sv.cfg

-- Para estirar una partición (NO reducir, se friega el sistema de archivos irremediablemente)
Por ejemplo agregar 100 Gb al /var de una máquina virtual

xm shutdown cosa.salud.gob.sv
lvresize -L +100G /dev/VG01/cosa.salud.gob.sv-var
e2fsck -f /dev/VG01/cosa.salud.gob.sv-var
resize2fs /dev/VG01/cosa.salud.gob.sv-var
xm create cosa.salud.gob.sv.cfg

-- Buenas prácticas: limitar y proteger el uso de memoria y CPUs de la dom0

vi /etc/default/grub
GRUB_CMDLINE_XEN_DEFAULT="dom0_mem=512M"

update-grub2

vi /etc/xen/xend-config.sxp
(dom0-min-mem 512)
(dom0-cpus 2)

-- Otros comandos importantes

xm destroy - Botonazo sin piedad.
xm list - Listar todos los comandos
xm help - List of all commands

Fuentes:
http://www.howtoforge.com/paravirtualization-with-xen-4.0-on-debian-sque...
http://www.howtoforge.com/paravirtualization-with-xen-4.0-on-debian-sque...

CMDLINE de GRUB

Buena receta de Xen, solo quiero sugerirte que corrijas una línea.

GRUB_CMDLINE_XEN_KERNEL="dom0_mem=512M" por

GRUB_CMDLINE_XEN_DEFAULT="dom0_mem=512M"

Yo generalmente uso 256M y me funciona muy bien.

En [1] están los comandos de Grub, y GRUB_CMDLINE_XEN_KERNEL no es parte de los comandos; realmente siempre lo he usado con GRUB_CMDLINE_XEN_DEFAULT y agrega "dom0_mem=512M" en la linea correcta del Grub.

Saludos.

[1] https://www.gnu.org/software/grub/manual/grub.html#Configuration

Fe de erratas

Muchísimas gracias Raúl!!! ya mismo lo corrijo :)