- Estréllate y Arde - https://www.estrellateyarde.org -

Máquina virtual Xen en Linux

Xen (xen.xensource.com) es un programa que ejecuta máquinas virtuales, de manera que permite tener funcionando varias instancias de diferentes Sistemas Operativos simultáneamente en un mismo ordenador. Se utiliza habitualmente en grandes servidores para abstraer y proteger las aplicaciones poniéndolas en máquinas virtuales diferentes (semejante a una jaula chroot). Además, la técnica utilizando por Xen, denominada paravirtualización, posibilita que las máquinas virtuales Xen pueden ser migradas en vivo entre equipos físicos sin pararlas, muy útil en clusters.

Equivalencias en Windows: VMware.

Xen está formado por los siguientes componentes:

  • el hypervisor.
  • un parche para el kernel Linux.
  • herramientas para la línea de comandos (Xen Tools) y para el entorno gráfico (Xenman).

El hypervisor es la pieza fundamental de Xen: es lo primero que ejecuta GRUB y se encarga de controlar el hardware (CPU, memoria, etc.) y distribuir su uso entre las diversas máquinas virtuales. Xen denomina a las máquinas virtuales dominios y pueden ser de dos tipos:

  • dom0: es la máquina virtual que bootea cuando arrancamos el ordenador, el anfitrión, la máquina con privilegios desde donde lanzamos las otras máquinas virtuales.
  • domU (dom1, dom2, ...): son las demás máquinas virtuales, guest, unprivileged.

Pueden establecerse varias configuraciones de red para las máquinas virtuales Xen. Nosotros instalaremos la configuración en puente (bridge) que hace que todos los dominios aparezcan en la red como hosts independientes.

Xen

Instalar Xen

  1. Instalar Xen (paquete xen-linux-system-2.6.18-5-xen-686): instalando este paquete se instalará por dependencias el hypervisor (paquete xen-hypervisor-3.0.3-1-i386), que es el archivo que cargará primero GRUB al arrancar (/boot/xen-3.0.3-1-i386.gz) y el kernel Xen (paquete linux-image-xen-686), un kernel que ya incorpora el parche Xen (podemos descargarnos el parche y compilar el kernel desde las fuentes pero es más cómodo instalar el kernel ya compilado).
  2. Configurar GRUB: después de instalar el paquete con el kernel aparecerá una entrada en /boot/grub/menu.lst donde se indica que el hypervisor debe cargarse en primer lugar, antes que el kernel y la imagen initrd.
    title       Xen 3.0.3-1-i386 / Debian GNU/Linux, kernel 2.6.18-5-xen-686
    root        (hd0,0)
    kernel      /boot/xen-3.0.3-1-i386.gz
    module      /boot/vmlinuz-2.6.18-5-xen-686 root=/dev/hda1 ro console=tty0
    module      /boot/initrd.img-2.6.18-5-xen-686
    savedefault
  3. Deshabilitar TLS: por dependencias se instalará el paquete libc6-xen, en cuyo caso no es necesario deshabilitar TLS. En caso contrario, deshabilitaremos TLS (Thread Local Storage) para que el rendimiento de Xen no se vea mermado:
    # mv /lib/tls /lib/tls.disabled
  4. Reparto de memoria entre dom0 y el resto de dominios: si al crear un nuevo dominio se nos informa de que no hay memoria disponible, se puede solucionar limitando la memoria para dom0 mediante un parámetro al arrancar el kernel, añadiendo en /boot/grub/menu.lst la opción dom0_mem a la línea kernel (por ejemplo para limitar la memoria a 256 MB):
    kernel      /boot/xen-3.0.3-1-i386.gz dom0_mem=256M
  5. Aumentar el número de dispositivos loop: dado que 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, para arrancar más de 4 máquinas virtuales tendremos que incrementar este valor. Para ello utilizaremos un parámetro al arrancar el kernel, añadiendo en /boot/grub/menu.lst la opción max_loop a la línea module (por ejemplo para permitir montar hasta 64 dispositivos loop):
    module /boot/vmlinuz-2.6.18-xen-686 root=/dev/hda1 ro console=tty0 max_loop=64

    Para crear los dispositivos loop, por ejemplo /dev/loop8, usaremos el comando:

    # mknod /dev/loop8 b 7 8
  6. Configurar la red: para que dom0 funcione en modo puente (paquete bridge-utils) editaremos /etc/xen/xend-config.sxp, comentaremos la línea:
    # (network-script network-dummy)

    y descomentaremos las siguientes líneas:

    (network-script network-bridge)
    (vif-script vif-bridge)
    (dom0-min-mem 196)
    (dom0-cpus 0)
  7. Reiniciar con el kernel Xen: reiniciamos el ordenador con el kernel Xen y veremos en los mensajes de inicio cómo se carga Xen. Para comprobar que está realmente funcionando verificaremos si aparece dom0 en la lista de máquinas virtuales:
    # xm list
    Name                          ID Mem(MiB) VCPUs State   Time(s)
    Domain-0                       0      941     2 r-----   3441.8

    Para ver los mensajes de inicio del hypervisor:

    # xm dmesg

    Para obtener información sobre Xen:

    # xm info

    Para comprobar que se ha activado el puente:

    # ifconfig
    eth0      Link encap:Ethernet  HWaddr 00:10:60:BA:05:BF
              inet addr:192.168.0.5  Bcast:192.168.0.255  Mask:255.255.255.0
              inet6 addr: fe80::210:60ff:feba:5bf/64 Scope:Link
              UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
              RX packets:2529 errors:0 dropped:0 overruns:0 frame:0
              TX packets:59 errors:0 dropped:0 overruns:0 carrier:0
              collisions:0 txqueuelen:0
              RX bytes:2312102 (2.2 MiB)  TX bytes:7933 (7.7 KiB)
     
    peth0     Link encap:Ethernet  HWaddr FE:FF:FF:FF:FF:FF
              inet6 addr: fe80::fcff:ffff:feff:ffff/64 Scope:Link
              UP BROADCAST RUNNING NOARP  MTU:1500  Metric:1
              RX packets:16467 errors:0 dropped:43520 overruns:0 frame:0
              TX packets:71 errors:0 dropped:0 overruns:0 carrier:0
              collisions:0 txqueuelen:1000
              RX bytes:14040624 (13.3 MiB)  TX bytes:8821 (8.6 KiB)
     
    vif0.0    Link encap:Ethernet  HWaddr FE:FF:FF:FF:FF:FF
              inet6 addr: fe80::fcff:ffff:feff:ffff/64 Scope:Link
              UP BROADCAST RUNNING NOARP  MTU:1500  Metric:1
              RX packets:59 errors:0 dropped:0 overruns:0 frame:0
              TX packets:2532 errors:0 dropped:0 overruns:0 carrier:0
              collisions:0 txqueuelen:0
              RX bytes:7933 (7.7 KiB)  TX bytes:2315196 (2.2 MiB)
     
    xenbr0    Link encap:Ethernet  HWaddr FE:FF:FF:FF:FF:FF
              inet6 addr: fe80::200:ff:fe00:0/64 Scope:Link
              UP BROADCAST RUNNING NOARP  MTU:1500  Metric:1
              RX packets:27 errors:0 dropped:0 overruns:0 frame:0
              TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
              collisions:0 txqueuelen:0
              RX bytes:1350 (1.3 KiB)  TX bytes:0 (0.0 b)
  8. Scrip de inicio de Xen: para arrancar/parar xend, el demonio de Xen, disponemos del script de inicio /etc/init.d/xend. Por ejemplo, si modificamos la configuración podremos reiniciar Xen con los nuevos parámetros con el comando:
    # /etc/init.d/xend restart

Crear y manejar máquinas virtuales Xen

  1. Instalar Xen Tools (xen-tools.org, paquete xen-tools): las Xen Tools son una serie de scripts que facilitan la administración de máquinas virtuales Xen.
  2. Crear la imagen de un domU: para crear la imagen de un nuevo domU el comando es:
    # xen-create-image --hostname xen01 --ip 192.168.0.130
    • --hostname: nombre del nuevo dominio.
    • --ip: dirección IP del nuevo dominio.

    Este comando hace bastantes cosas:

    • creará la imagen de xen01 en /home/xen/domains/xen01/disk.img, con formato ext3.
    • creará la swap en /home/xen/domains/xen01/swap.img
    • instalará el sistema mediante debootstrap (igual que chroot) usando el mirror seleccionado.
    • nos pedirá un password para root y creará en xen01 los mismos usuarios que tiene dom0.
    • creará el fichero de configuración /etc/xen/xen01.cfg que se usará para activar xen01.

    El archivo imagen del nuevo dominio /home/xen/domains/xen01/disk.img es la imagen de un sistema de ficheros, por lo que puede montarse y comprobarse su contenido:

    # mount -o loop /home/xen/domains/xen01/disk.img /mnt

    Vemos que tiene la estructura completa de un sistema Linux de tamaño reducido:

    # ls /mnt
    bin   dev  home    lib         media  opt   root  srv  tmp  var
    boot  etc  initrd  lost+found  mnt    proc  sbin  sys  usr
     
    # df /mnt
    S.ficheros                        Bloques  Usado   Dispon  Uso%  Montado
    /home/xen/domains/xen01/disk.img  4128448  388268  3530468  10%  /mnt

    Para comprobar que el nuevo dominio ha sido creado y su configuración:

    # xen-list-images
    Name: xen01
    Memory: 128
    IP: 192.168.0.130

    El comando que crea las imágenes de los nuevos dominios (xen-create-image) utiliza el archivo de configuración /etc/xen-tools/xen-tools.conf, que contiene los parámetros comunes a todos los domU que creemos (en la línea de comandos sólo pondremos los parámetros específicos de cada dominio, --hostname y --ip). Su contenido será similar a:

    # Directorio por defecto para las imágenes
    dir = /home/xen
     
    # Método para obtención de los paquetes
    debootstrap = 1
     
    #  Opciones de disco y tamaño
    size   = 4Gb      # Disk image size.
    memory = 128Mb    # Memory size
    swap   = 256Mb    # Swap size
    fs     = ext3     # Use the ext3 filesystem for the disk image.
    dist   = etch     # Default distribution to install.
    image  = sparse   # Specify sparse vs. full disk images.
     
    # Configuración de red
    gateway   = 192.168.0.1
    netmask   = 255.255.255.0
     
    # Establecer password para root al crear la imagen
    passwd = 1
     
    # Mismos usuarios que dom0
    accounts = 1
     
    # Kernel para el nuevo dominio
    kernel = /boot/vmlinuz-`uname -r`
    initrd = /boot/initrd.img-`uname -r`
     
    # Mirror a utilizar por debootstrap
    mirror = ftp://ftp.rediris.es/debian/
  3. Activar un domU: una vez creados los ficheros de imagen y swap del nuevo dominio usaremos el comando xm (Xen management user interface) para activarlo:
    # xm create xen01.cfg
    Using config file "/etc/xen/xen01.cfg"
    Started domain xen01

    El comando xm utiliza el archivo de configuración /etc/xen/xen01.cfg que se generó al crear la imagen del dominio y cuyo contenido será similar a:

    # Configuration file for the Xen instance xen01, created
    # by xen-tools 3.7 on Fri May 18 00:19:16 2007.
     
    #  Kernel + memory size
    kernel      = '/boot/vmlinuz-2.6.18-5-xen-686'
    ramdisk     = '/boot/initrd.img-2.6.18-5-xen-686'
    memory      = '128'
     
    # Boot device
    root        = '/dev/sda2 ro'
     
    # Storage devices
    disk        = ['file:/home/xen/domains/xen01/swap.img,sda1,w',
                   'file:/home/xen/domains/xen01/disk.img,sda2,w']
     
    #  Hostname
    name        = 'xen01'
     
    #  Networking
    vif         = [ 'ip=192.168.0.130,mac=00:16:3E:9C:64:6E' ]
     
    #  Behaviour
    on_poweroff = 'destroy'
    on_reboot   = 'restart'
    on_crash    = 'restart'

    Para comprobar que el nuevo dominio funciona:

    # xm list
    Name                               ID Mem(MiB) VCPUs State   Time(s)
    Domain-0                            0      875     2 r-----   4135.2
    xen01                               2      128     1 -b----      4.5
     
    # ping 192.168.0.130
    PING 192.168.0.130 (192.168.0.130) 56(84) bytes of data.
    64 bytes from 192.168.0.130: icmp_seq=1 ttl=64 time=0.206 ms
    ...
     
    # ssh [email protected]
    [email protected]'s password: *****
    francis@xen01:/$
  4. Manejar un domU

    Para abrir un shell e iniciar sesión en el nuevo dominio:

    # xm console xen01
    Debian GNU/Linux 4.0 xen01 tty1
     
    xen01 login: francis
    Password: *****
    francis@xen01:/$

    Para comprobar que la red está correctamente configurada haremos algunos ping (xen01 tendrá los mismos servidores DNS que dom0, de lo contrario los añadiremos a /etc/resolv.conf):

    $ ping 192.168.0.1
    PING 192.168.0.1 (192.168.0.1) 56(84) bytes of data.
    64 bytes from 192.168.0.2: icmp_seq=1 ttl=64 time=1.206 ms
    ...
     
    $ ping 80.58.61.250
    PING 80.58.61.250 (80.58.61.250) 56(84) bytes of data.
    64 bytes from 80.58.61.250: icmp_seq=1 ttl=119 time=38.2 ms
    ...
     
    $ ping www.orange.es
    PING a443.x.akamai.net (194.224.66.105) 56(84) bytes of data.
    64 bytes from 194.224.66.105: icmp_seq=1 ttl=55 time=41.6 ms
    ...

    Para salir de la consola del domU:

    francis@xen01:/$ <Ctrl + AltGr + ]>
    root@asterix:/#

    Para apagar el dominio xen01:

    # xm shutdown xen01

    Atención

    Si hacemos shutdown sobre dom0 se apagarán todos los dominios.

  5. Migrar dominios en caliente: para habilitar la posibilidad de migrar dominios en caliente a otro equipo con Xen instalado editaremos en /etc/xen/xend-config.sxp las siguientes líneas:
    (xend-relocation-port 8002)
    (xend-relocation-address '')
    (xend-relocation-server yes)
    (xend-relocation-hosts-allow '')
    (xend-address '')
    #(xend-address localhost)

    Y ejecutaremos (por ejemplo para migrar el dominio xen01 a pc300):

    # xm migrate --live xen01 pc300

    En unos segundos podremos ver con xm list que xen01 ha migrado al host pc300.

    Atención

    - La imagen del dominio tiene que estar en un filesystem compartido.
    - Ambos ordenadores tienen que tener un procesador de la misma familia.

  6. Manejar Xen desde el entorno gráfico: con Xenman (xenman.sourceforge.net, paquete xenman, ejecutarlo como root), nos permite administrar las máquinas virtuales Xen a través de una GUI.

    Xenman

  7. Ejecutar las X en un domU: en un domU no podemos arrancar las X desde una consola por la sencilla razón de que buscará la tarjeta gráfica y no la encontrará, obteniendo un error similar a:
    # startx
    Fatal server error:
    xf86OpenConsole: Cannot open /dev/tty0 (No such file or directory)

    Pero lo que sí podemos hacer es iniciar una sesión X Window remota vía SSH en un domU desde dom0: eso nos permitirá ejecutar en el domU un entorno gráfico y ver su salida en dom0.

    Las X en Xen

    También podemos iniciar una sesión X Window remota vía VNC.

    VNC-KRDC ventana

Crear un entorno de 4 máquinas virtuales Xen para un cluster

Xen nos permite crear un cluster virtual en un único ordenador sobre un grupo de máquinas virtuales Xen. Veamos cómo crear un entorno de 4 máquinas virtuales Xen (4 domU, 1 master + 3 esclavos) para poder configurar posteriormente un cluster PVM, MPI, etc.

  1. Instalamos Xen en nuestra máquina.
  2. Creamos 4 domU: uno de ellos (master) se encargará de administrar el cluster, los otros 3 (slave1, slave2, slave3) serán los esclavos.
  3. DNS local: en cada domU añadiremos en el archivo /etc/hosts sus IPs y sus nombres:
    192.168.0.200 master
    192.168.0.201 slave1
    192.168.0.202 slave2
    192.168.0.203 slave3
  4. Filesystem compartido: el master exportará mediante NFS (paquete nfs-kernel-server) su directorio /home, añadiendo en el archivo /etc/exports la línea:
    /home       192.168.0.0/255.255.255.0(rw,sync)

    En los esclavos usaremos mount para montar el directorio exportado:

    # mount -t nfs 192.168.0.200:/home /home

    Para que los esclavos lo monten al arrancar editaremos /etc/fstab y añadiremos la línea:

    # File_system            Mount_point Type Options       Dump Pass
    192.168.0.200:/home      /home       nfs  rw,hard,intr  0    0

    Comprobaremos en cada esclavo que podemos escribir en /home:

    # touch delete.me
  5. Habilitar SSH sin password: para que el master pueda ejecutar comandos remotos en los esclavos vía SSH instalaremos en los esclavos el servidor SSH (paquete openssh-server) y los configuraremos para que acepten conexiones desde el master sin pedir password ni pass-phrase (utilizaremos el mismo usuario en todas las máquinas). Para ello:

    - crearemos una clave RSA en el master:

    francis@master:~$ ssh-keygen -t rsa -f ~/.ssh/id_rsa

    - activaremos ssh-agent en el master para que no nos pida la pass-phrase:

    francis@master:~$ eval `ssh-agent -s`
    Agent pid 12297
    francis@master:~$ ssh-add
    Enter passphrase for /home/francis/.ssh/id_rsa:
    Identity added: /home/francis/.ssh/id_rsa (/home/francis/.ssh/id_rsa)

    - copiaremos la clave pública (~/.ssh/id_rsa.pub) en todos los esclavos:

    francis@master:~$ scp ~/.ssh/id_rsa.pub francis@slave1:~/.ssh/id_rsa.pub

    - la añadiremos al final del fichero ~/.ssh/authorized_keys en cada esclavo:

    francis@slave1:~$ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys

    - y comprobaremos que podemos iniciar sesión SSH en los esclavos sin que nos pida password:

    francis@master:~$ ssh slave1
    francis@slave1:~$

Article printed from Estréllate y Arde: https://www.estrellateyarde.org

URL to article: https://www.estrellateyarde.org/discover/xen

Copyright © 2010 Estrellate y Arde