Imprimir

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:~$

15 Comentarios en “Máquina virtual Xen en Linux”

  • cesar augusto gonzalez dice:

    Para realizar la instalación de la maquina virtual me pide conexión a Internet para acceder a los repositorio, ¿como puedo hacer esto si mi acceso a Internet es por medio de red inalámbrica? Tengo los paquetes para el kernel xen, pero cuando configura la tarjeta esta se conecta y desconecta constantemente sin permitir la conexión correctamente. Tengo una tarjeta de red ipw3945 de un laptop y con esta me conecto correctamente desde un kernel distinto a el xen. Estoy tratando de configurarla para la conexión peth2 para mi caso. Agradezco de antemano a los que me puedan colaborar.

  • joseph dice:

    mmm creo q tienes q descargarte los bootstrap, los cuales yo tambien quiero y no se como conseguirlos… si alquien sabe como instalar los domU sin tener conexion a internet…
    APOOOOOOOOOOOOOOOOOOOYENNOS!!!!
    mi correo es [email protected]

  • Juanmi dice:

    Hola, lo primero felicitarte por el gran documento. Te escribo para ver si me das luz en mi problema. Llevo 5 dias intentando instalar Windows (lo he intentado con 2000, xp, xp sp2, 2000 server) en Xen.

    Todo funciona a la perfección con maquinas virtuales GNU/Linux (knoppix, wifiway, debian desde cd) pero al meter el cd de XP (por ejemplo ya que en todas hace lo mismo) comienza la instalacion sin ningun problema, me sale el “Pulse F6 para drivers de otro fabricante” el “F2 para ASR” se pone a cargar archivos y de repente, antes de sacara el “Lea el Cluster y pulse F8″ casca y se reinicia.

    Mi sistema es Debian 4.0r3 etch. He probado con Xen 3.2 (de backports) con Xen 3.0.3.1 (estable a este momento en debian) con amd64, con i686 y ocurre lo mismo siempre.

    Podrias arrojar algo de luz a mi Xen ;-)

    Mil gracias por adelantado.

  • pablolibo dice:

    Juanmi date una vuelta por aca, para ver si te sirve: http://doc.pablolibo.com.ar

  • Maria dice:

    hola,tengo un problema con mi maquina virtual instalada, mi host es una suse linux enterprise server 10 y tengo mi máquina virtual igual con suse, todo funciona bien pero cuando apago mi máquina host o se va la luz, pierdo mi máquina virtual,hay una opción donde dice que puedo guardar mi máquina virtual…intento guardarla y se queda haciendo el proceso pero no aparece nada más…¿como puedo resolver este problema y con que extensión guardo mi máquina?¿Hay alguna otro procedimiento para no tener que instalarla de nuevo?

  • CARLOS CRUZ dice:

    primeramente, instala debian etch 4.0 y ya tengo instalado xen y ya pude crear mi maquina virtual en xen
    lo que no se hacer es como poder instalar un sistema operativa dentro de mi maquina virtual xen
    quisiera instalar un debian ahi en mi maquina virtual
    gracias espero y me puedan dar unos tips, soy principiante en linux

  • 4170R dice:

    Hola,
    Primeramente felicitarte por esta guia tan lograda.
    Mi duda es la siguiente, tengo un PC con dos particiones (una Linux y una Windows) y me gustaria crear un servidor como el que explicas en la particion Linux (solo es para pruebas, un trabajo de la uni, pero tiene que funcionar claro), entonces mi duda es:
    ¿puedo montar el servidor sin problemas o corro el riesgo de perder la particion Windows, o no poder arrancarla, o algo por el estilo? ¿me seguira dando a elegir que SO ejecutar al arrancar el PC?
    Espero que no tardes mucho en contestar.
    Gracias anticipadas.

  • [...] Cómo instalar y configurar Xen sobre debian lenny [...]

  • eldespojo dice:

    Hola..

    y como uso el puerto serie fisico desde la maquina virtual.. ?

    estoy usando minicom con ttyS0, hvc0, y no funciona..

    alguna idea..

    saludos y gracias..

  • Pablo dice:

    Hola,
    quería saber si es posible de alguna forma configurar Xen para que se cargue una máquina virtual y esa sea posible verla desde el mismo equipo local. Lo que querría es digamos tener una máquina virtual creada que sea independiente del hardware subyacente. Esa independencia la daría Xen. De forma que el ordenador cargara Xen, luego la máquina virtual, pero que se pudiera acceder directamente a esta máquina virtual como cuando carga una sistema operativo normal. No se si me he explicado bien.

    Un saludo

  • Leonardo dice:

    Felicitaciones por el post!! muy bueno!
    a ver si alguien me puede iluminar, me es IMPOSIBLE conectarme por vnc al domU en el que estoy instalando WinXP
    > que tengo que instalar?
    > que tengo que configurar?
    > como me tengo que conectar?

    luego de “xm create win.cfg”, me fijo con “netstat -na” y no veo ningun puerto vnc abierto…

    Saludos!
    Muchas Gracias!

  • Orlando dice:

    Hola felicitaciones, ahora la pregunta…como puedo instalar una maquina virtual sin que me pida una repo de red, tengo la iso en el equipo pero cuando trato de instalar me pide http
    Gracias

  • Javier dice:

    Buenas.. Primeramente felicitarte por el post y mi pregunta es: tengo instalado un Debian 6 y en esta version vienen supuestamente los paquetes de xen pero el tipo de grub es diferente ya no lleva el menu.lst si no que es un follon de algo de exportar algo desde 40_custom como instalo xen en mi maquina? espero me puedas contestar mis dudas me mandes un mail o lo que sea
    gracias de antemano

  • Juan dice:

    Muy buen documento, bien explicado y entendible, ahora sólo falta ponerlo en práctica.

  • Drogacho dice:

    Enhorabuena por el post, me ha servido de mucha ayuda. Pero tengo una duda:

    -Cómo accedo a una máquina virtual que ya está encendida? Es decir, imaginemos que quiero administrar mi servidor web virtual: Arranco la máquina con ‘xm create virtualweb’ y accedo desde consola con ‘xm console virtualweb’, hago lo que tengo que hacer y hago un ‘logout’. Entonces vuelvo a la pantalla de login. Cierro la terminal y mi servidor queda corriendo.

    ¿Cómo accedo de nuevo a la máquina virtual? Si hago un ‘xm console virtualweb’ no responde y no se cómo hacerlo!

    Saludos!

Deja un comentario