Howto de Virtualización con Xen en Debian Squeeze (usando LVM, bridges a interfaces de red y máquinas paravirtualizadas)
- 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...
- kadejo's blog
- Inicie sesión o regístrese para enviar comentarios









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 :)