Instalar Xen en Debian con LVM y bridges a varias interfaces de red
Este artículo ha sido aprobado oficialmente.
Este artículo describe cómo instalar Xen en Debian GNU/Linux y cómo configurar las interfaces de red para ser utilizadas como bridges, ha sido probado tanto en Debian 6.0 "Squeeze" como en Debian 7.0 "Wheezy".
Contenido |
Instalación de Debian
Véase el Manual de Instalación para una referencia detallada del proceso de instalación general de Debian.
Se debe instalar Debian configurando la partición principal como LVM. Para que Grub2 pueda instalarse sin problemas se debe crear una partición especial en primer lugar de tipo biosgrub (1 Mb es suficiente) (según el tipo de servidor es posible que sea necesaria o no) y otra para /boot de 256Mb (puede ser de tipo ext4). El resto del disco duro puede ser asignado a LVM en el que se creará un grupo único (VG) en el que dentro se creará una partición (LV) para / (se puede llamar root) de un tamaño moderado y otro LV para swap, del tamaño apropiado según el tamaño de la RAM. El resto del espacio se deja sin asignar, pues posteriormente se crearán los LVs de las máquinas virtuales.
Al finalizar la instalación se puede comprobar el estado del LVM con los comandos vgdisplay y lvdisplay.
Instalación y configuración de Xen
A menos que se indique lo contrario, en este artículo todas las órdenes han de ser ejecutadas como usuario root. Asegúrese que se han configurado los repositorios de manera apropiada.
Instalar XEN por medio de la siguiente instrucción.
aptitude install xen-linux-system-amd64 xen-tools
Paquetes para Wheezy
Se recomienda instalar Debian 8 "Jessie", sin embargo, a continuación se detalla el listado de paquetes necesarios para instalar Xen en Debian 7 "Wheezy".
aptitude install xen-hypervisor-4.1-amd64 xen-linux-system-amd64 xen-utils-4.1 xenstore-utils xenwatch xen-tools
Paquetes para Squeeze
Se recomienda instalar Debian 8 "Jessie", sin embargo, a continuación se detalla el listado de paquetes necesarios para instalar Xen en Debian 6 "Squeeze".
aptitude install xen-hypervisor-4.0-amd64 \ xen-linux-system-2.6-xen-amd64 xen-utils-4.0 xenstore-utils \ xenwatch xen-tools
Primeras configuraciones
Cambiar la prioridad de arranque del kernel para que arranque el hypervisor
mv /etc/grub.d/10_linux /etc/grub.d/50_linux update-grub2
Buenas prácticas
Limitar y proteger el uso de memoria y CPUs de la dom0
Como usuario root editar el archivo /etc/default/grub, tal como se muestra a continuación. En el ejemplo, se limita el uso de memoria a 512 MB y a un solo núcleo
vi /etc/default/grub
Agregar la siguiente línea
GRUB_CMDLINE_XEN_DEFAULT="dom0_mem=512M,max:512M dom0_max_vcpus=1"
Según la wiki de Xen, se recomienda que se dedique explicitamente el núcleo del CPU a usar, sobre todo cuando los guest vayan a tener operaciones IO intensivas. En general, especificar el núcleo del CPU reduce los cambios de contextos, lo que supone alguna mejora en el rendimiento. En ese caso, la línea queda de la siguiente manera:
GRUB_CMDLINE_XEN_DEFAULT="dom0_mem=512M,max:512M dom0_max_vcpus=1 dom0_vcpus_pin"
Actualizar la configuración de GRUB ejecutando como root la siguiente orden.
update-grub2
En Debian Wheezy y Jessie Como usuario root editar el archivo /etc/xen/xend-config.sxp, tal como se muestra a continuación.
vi /etc/xen/xend-config.sxp
Agregar o modificar las siguientes líneas
(dom0-min-mem 512) (dom0-cpus 1)
Ajustes de red
Debian tiene una configuración diferente a la de Upstream, en la que todo se maneja mediante el script network-bridge. (Puede informarse al respecto en Configure_Networking y Example Debian-style bridge configuration )
Editar como root el archivo /etc/network/interfaces
Cambiamos la configuración normal de eth0, eth1, etc. (quitamos cualquier configuración de IP) por
iface eth0 inet manual
De manera similar con todas las demás interfaces disponibles. Y agregar 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 dns-nameserver 10.10.20.20 10.10.20.21 dns-search salud.gob.sv
Una entrada de iface por cada bridge (xenbr1, xenbr2, etc.), 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 se indicará qué bridge se usará aparte de otros parámetros.
vif=[ 'bridge=xenbr1',.... ]
o indicarlo en el xm-create-image (parámetro --bridge=xenbr#)
Reiniciar (reboot) y probar 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
Creación de las máquinas virtuales
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 [...] gateway = 10.10.20.1 netmask = 255.255.255.0 broadcast = 10.10.20.255 [...] passwd = 1 [...] arch = amd64 [...] ext4_options = noatime,nodiratime,errors=remount-ro [...] serial_device = hvc0 #default [...] disk_device = xvda #default [...]
Imagen de Debian
Una imagen de Debian con los valores por defecto configurados en /etc/xen-tools/xen-tools.conf puede ser creada con el siguiente comando: xen-create-image --hostname=minimo.salud.gob.sv --ip=192.168.2.13 --role=udev
Para crear una imagen de Debian sobreescribiendo algunos de los valores por defecto, ejecute lo siguiente.
xen-create-image \ --hostname=xen-server.salud.gob.sv --vcpus=2 --size=20Gb --memory=512Mb --swap=512Mb \ --ip=10.10.20.45 --bridge=xenbr1 \ --arch=amd64 --role=udev
Imagen de Ubuntu
Para rear una imagen de Ubuntu en lugar de Debian (cambiar lucid por la versión deseada, p.e. natty)
xen-create-image --dist lucid \ --hostname=xen-server-ubuntu.salud.gob.sv --vcpus=4 --size=100Gb --memory=4096Mb --swap=1Gb \ --ip=10.10.20.46 --bridge=xenbr2 \ --arch=amd64 --role=udev
Es posible que falten algunos paquetes útiles para que todo quede bien, que por supuesto pueden instalarse normalmente una vez arrancada la máquina:
apt-get install wget language-pack-es aptitude vim
Imagen de distribuciones basadas en RPM
Se instalo rinse a la hora de instalar los paquetes de xen. Rinse es el método actualmente recomendado para tratar con distribuciones rpm. La lista de distros soportadas puede obtenerse con
rinse --list-distributions
Centos 6
Use el siguiente comando
xen-create-image --install-method=rinse --dist="centos-6" \ --hostname=centoso.salud.gob.sv --vcpus=1 --size=20Gb --memory=512Mb --swap=512Mb \ --ip=10.10.20.47 --bridge=xenbr3 \ --arch=amd64
Centos 7
Oficialmente, parece ser que CentOS 7 no esta soportado al momento de escribir estas líneas (Abril de 2015), pero encontré una forma un tanto chapucera de hacerlo funcionar, ya que rinse si lo soporte, lo único que falta es hacerle creer a xen-image-create que también lo hace. Para ello, agradecemos que la diferencia de Fedora 19 (El correspondiente de CentOS 7) respecto a Fedora 17 (Ultima versión soportada por xen-tools) no es tan grande como se podría pensar:
cd /usr/share/xen-tools/ cp -rv fedora-core-17.d centos-7.d sed -i '$a compat-db47' /etc/rinse/centos-7.packages sed '/update-rc.d/ s/^/#/g' /usr/share/xen-tools/centos-7.d/15-setup-arch
Ahora si es posible especificar la distro como centos-7
xen-create-image --install-method=rinse --dist="centos-7" \ --hostname=centos7.salud.gob.sv --vcpus=1 --size=20Gb --memory=512Mb --swap=512Mb \ --ip=10.10.20.48 --bridge=xenbr0 --arch=amd64
Ambas instalacions terminan con un
No role scripts were specified. Skipping Setting up root password Changing password for user root. New password: Retype new password: passwd: all authentication tokens updated successfully. All done /tmp/aZLJREpzHi/etc/ssh/ssh_host_rsa_key.pub: No such file or directory
Pese a ello, es posible iniciar el guest normalmente
Mejoras adicionales
Los paquetes adicionales más apremiantes que necesita son los siguientes:
yum install vim lsof xterm ncurses-term
El prompt es bastante feo. Para arreglarlo, basta con copiar los ficheros de **/etc/skel** y, al menos, iniciar la consola de nuevo:
cp /etc/skel/.* ~/ bash
Si necesita ahorrarse un poco el uso de ancho de banda, y disponiendo de un disco de instalación de CentOS, puede usarlo ese disco como un pequeño repositorio:
En un servidor con apache corriendo, monte el DVD en el directorio /var/www, o en el directorio raíz de cualquier host virtual disponible:
mount -o loop /root/Repo/CentOS-6.5-x86_64-bin-DVD1.iso /var/www
Modifique el fichero /etc/rinse/rinse.conf en la sección [centos-6], en el mirror que se corresponda con la arquitectura contenida en el DVD
mirror.amd64 = http://10.30.40.50/Packages/
Imagen de Windows Server
La instalación desde la línea de comandos podría ser demasiado complicada e innecesaria de cierto modo. La mejor forma hasta ahora ha sido crear la máquina directamente desde un archivo dado. El ejemplo esta tomado de HowTo: Xen 4.1.3 Windows 8 HVM domU with Intel HD4000 VGA Passthrough on Debian Wheezy , que de hecho puede ampliar más al respecto. Esta configuración parece ser la mínima necesaria para que windows server (2012 en este caso) funcione. No hay igual suerte en la mayoría de casos con windows 7,8
Como única diferencia a la mencionada guía, nosotros usamos LVM. Para crear el volumen lógico basta con el siguiente comando
lvcreate -n /dev/VG/win.salud.gob.sv-disk -L45G
Junto con la máquina virtual, se inicia un servidor VNC en {ip-host}:5900. Allí podrá completar la instalación de Windows Server. Siempre podrá acceder por este método a su Servidor Windows, que le pedirá iniciar sesión en él
Con vncviewer desde un equipo remoto:
vncviewer {ip-host}:5900
- #
- # Kernel + memory size
- #
- kernel = 'hvmloader'
- builder = 'hvm'
- vcpus = '1'
- memory = '1024'
- #
- # Disk device(s).
- #
- disk = [
- 'phy:/dev/host/win.salud.gob.sv-disk,hda,w',
- 'file:/ruta/a/Windows.iso,hdc:cdrom,r'
- ]
- #
- # Physical volumes
- #
- #
- # Hostname
- #
- name = 'win.salud.gob.sv'
- #
- # Networking
- #
- vif = [ 'ip=10.10.20.248 ,mac=00:16:3E:33:2C:AF,bridge=xenbr0' ]
- #
- # Behaviour
- #
- on_poweroff = 'destroy'
- on_reboot = 'restart'
- on_crash = 'restart'
- #
- # Windows
- #
- boot = 'dc'
- acpi = '1'
- apic = '1'
- viridian = '1'
- xen_platform_pci='1'
- sdl = '0'
- vnc = '1'
- vnclisten = '0.0.0.0'
- vncpasswd = ''
- stdvga = '0'
- usb = '1'
- usbdevice = 'tablet'
Administración de las máquinas virtuales
Uso de la máquina virtual
- Arrancarla
xm create /etc/xen/xen-server.salud.gob.sv.cfg
- Entrar a la máquina (para salir de la consola usar ctrl+])
xm console xen-server.salud.gob.sv
- Arranque automático:
mkdir /etc/xen/auto ln -s /etc/xen/xen-server.salud.gob.sv.cfg /etc/xen/auto
Agregar partición
Ejecutar en bash de la dom0
LVM_VG=$(/bin/grep lvm /etc/xen-tools/xen-tools.conf | /bin/sed -e 's/lvm = //') XEN_HOSTNAME=xen-server.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
Parar la máquina virtual, pues vamos a hurgar en sus particiones:
xm shutdown $XEN_HOSTNAME
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 xen-server.salud.gob.sv xm create /etc/xen/xen-server.salud.gob.sv.cfg
Aumentar tamaño de una partición
Para aumentar el tamaño de una partición (NO reducir, se corrompe el sistema de archivos irremediablemente)
Por ejemplo agregar 100 Gb al /var de una máquina virtual.
xm shutdown xen-server.salud.gob.sv lvresize -L +100G /dev/VG01/xen-server.salud.gob.sv-var e2fsck -f /dev/VG01/xen-server.salud.gob.sv-var resize2fs /dev/VG01/xen-server.salud.gob.sv-var xm create xen-server.salud.gob.sv.cfg
Núcleos dedicados para cada máquina virtual
Puede usar el núcleo del CPU a usar por cada máquina virtual. Un primer vistazo a la forma en que se reparten por defecto los núcleos puede verse a continuación
xm vcpu-list prueba01.salud.gob.sv
Muestra la configuración de VCPU para el host prueba01.salud.gob.sv
Name ID VCPU CPU State Time(s) CPU Affinity prueba01.salud.gob.sv 3 0 1 -b- 5.1 any cpu
Configurando con vcpu-pin
xm vcpu-pin prueba02.salud.gob.sv all 1
Al verificar el estado se puede apreciar que se asignó el núcleo especificado
Name ID VCPU CPU State Time(s) CPU Affinity prueba02.salud.gob.sv 1 0 1 -b- 8.2 1
Aunque la configuración parece ser permanente y sobrevivir al reinicio, puede asegurarse modificando el archivo de configuración de cada equipo en /etc/xen
Otras órdenes importantes
- Apagado forzado
xm destroy <name>
- Apagado normal
xm shutdown <name>
- Listar todas las máquinas virtuales
xm list
- Listado de todas las órdenes
xm help
Restaurar contraseña de máquina virtual
Iniciar la máquina virtual de la siguiente manera:
xm create -c /etc/xen/xen-server.salud.gob.sv.cfg extra=1
Editar la contraseña del usuario root con:
passwd
Migración en caliente de Squeeze a Wheezy
En primer lugar, se deben seguir los pasos descritos a continuación:
- Hacer respaldo de la información
- No olvidar hacer un respaldo de la información.
- Es importante hacer respaldo.
Si ya se completaron los pasos anteriores, a continuación hay que realizar las pruebas necesarias en otro equipo antes de hacerlo en el sistema real.
La migración en caliente de Xen desde la versión que se encuentra en Squeeze hacia la versión que se encuentra en Wheezy implica los siguientes pasos:
- Actualización de las máquinas virtuales de Squeeze a Wheezy.
- Actualización del servidor físico de Squeeze a Wheezy.
- Configuración de las máquinas virtuales para que utilicen el nuevo Kernel.
En este artículo no se describe el proceso de actualización de las máquinas virtuales y se asume que son, originalmente, máquinas con Debian Squeeze.
Actualización del sistema físico
- Configurar los repositorios de Squeeze a Wheezy.
- Actualizar la lista de paquetes con
aptitude update
- Instalar los keyring, tal como se describe en Actualizaciones y sources.list
- Hacer una actualización de manera segura con Prestar especial cuidado al listado de paquetes que se eliminarán
aptitude safe-upgrade
- Durante el proceso de actualización hay archivos que modifican sus opciones, por lo que es necesario configurarlos nuevamente para que se ajusten a las necesidades particulares.
- Hacer una actualización completa con Prestar especial cuidado al listado de paquetes que se eliminarán.
aptitude full-upgrade
- Instalar los paquetes de Xen que se encuentran en Wheezy. Ver en la parte superior del artículo.
- Realizar los ajustes necesarios descritos para configurar Xen. Principalmente, lo que se encuentra en /etc/xen/xend-config.sxp
- Cambiar la prioridad de arranque del Kernel para que cargue el de Xen
mv /etc/grub.d/10_linux /etc/grub.d/50_linux
update-grub2
Configuración de las máquinas virtuales
En /etc/xen/ se encuentran los archivos de configuración de cada máquina virtual.
Para el caso de ejemplo descrito anteriormente en este artículo, es el archivo /etc/xen/xen-server.salud.gob.sv.cfg. La parte relevante a modificar se muestra a continuación:
kernel = '/boot/vmlinuz-2.6.32-5-xen-amd64' ramdisk = '/boot/initrd.img-2.6.32-5-xen-amd64'
Hay que editarlo como se muestra a continuación:
#kernel = '/boot/vmlinuz-2.6.32-5-xen-amd64' #ramdisk = '/boot/initrd.img-2.6.32-5-xen-amd kernel = '/boot/vmlinuz-3.2.0-4-amd64' ramdisk = '/boot/initrd.img-3.2.0-4-amd64'
ls /boot/
Es recomendable dejar comentada la configuración anterior para poder revertir los cambios en caso de ser necesario.
Finalizada la configuración de todas las máquinas virtuales, se reinicia el servidor físico y se verifica que todas las máquinas virtuales cargan correctamente.
Fuentes
- http://www.howtoforge.com/paravirtualization-with-xen-4.0-on-debian-squeeze-amd64
- http://www.howtoforge.com/paravirtualization-with-xen-4.0-on-debian-squeeze-amd64-p2
- http://wiki.debian.org/Xen#Configure_Networking
- http://wiki.xen.org/wiki/Network_Configuration_Examples_%28Xen_4.1%2B%29#Example_Debian-style_bridge_configuration_.28e.g._Debian.2C_Ubuntu.29
- http://wiki.stocksy.co.uk/wiki/Creating_Xen_Machines_on_Debian_Lenny#Creating_a_.2Fvar_partition_for_the_domU