Xen

De WikiEtl
Saltar a: navegación, buscar

Introducción

Xen es una máquina virtual de código abierto desarrollada por la Universidad de Cambridge. La meta del diseño es poder ejecutar instancias de sistemas operativos con todas sus características, de forma completamente funcional en un equipo sencillo.

La técnica utilizada por Xen se denomina para-virtualizacióon, lo que consigue comportamientos de las máquinas virtuales cercanos al de una máquina real. Para realizar dicha para-virtualización, es necesario cargar en modo núcleo (kernel space) el denominado “hypervisor” que se encarga de la gestión de recursos para los diferentes sistemas operativos de una misma máquina. La contrapartida en el caso de Xen es que el sistema operativo huésped (guest) debe modificarse para trabajar con el hypervisor en lugar de con el hardware directamente.

Las diferentes máquinas virtuales que se ejecutan en una máquina reciben el nombre de dominios en la terminología de Xen. Existe un dominio privilegiado que es sobre el que se instala el “hypervisor” de Xen y que equivale al sistema operativo anfitrión (host) de otros monitores de máquinas virtuales como los de la empresa VMware. Este dominio privilegiado recibe el nombre de dom0 y el resto de dominios reciben el nombre genérico de domU.

Esquema de los elementos que intervienen y la relación entre los dominios y el hardware


Instalación

Para poder utilizar Xen, se deben instalar los siguientes paquetes:

- xen-hypervisor-3.2

- xen-utils-3.2

- linux-image-2.6.24-17-xen (ubuntu) linux-image-2.6.18-6-xen-686 (debian)


El método de instalación es el siguiente:

Configuramos la red e instalar el servidor SSH para conectarnos al servidor de forma remota.

~$ apt-get install ssh openssh-server 

Actualizamos la lista de paquetes:

~$sudo apt-get update 


Buscamos los paquetes que nos interesan:

~$ apt-cache search xen

Instalamos los paquetes que queremos:

~$ sudo apt-get install xen-utils-3.2 xen-hypervisor-3.2 linux-image-2.6.24-17-xen

Instalamos los paquetes que necesitamos para completar el proceso de instalación:

~$ apt-get install iproute bridge-utils python-twisted binutils

zlib1g-dev python-dev transfig bzip2 screen ssh debootstrap libcurl3-dev libncurses5-dev x-dev build-essential gettext gawk mercurial yaird

Instalamos los siguientes paquetes si vamos a utilizar HVM. ~$ bcc libsdl1.2debian-all libsdl1.2-dev libx86-dev libvncserver-dev

Actualizamos el GRUB (gestor de arranque):

~$ sudo update-grub
Searching for GRUB installation directory ... found: /boot/grub
Searching for default file ... found: /boot/grub/default
Testing for an existing GRUB menu.lst file ... found: /boot/grub/menu.lst
Searching for splash image ... none found, skipping ...
Found Xen hypervisor 3.2,  kernel: /boot/vmlinuz-2.6.24-17-xen
Found kernel: /boot/vmlinuz-2.6.24-16-generic
Found kernel: /boot/memtest86+.bin
Updating /boot/grub/menu.lst ... done

Se comprueba que aparece la linea correspondiente a:

Found Xen hypervisor 3.2-1-amd64,  kernel: /boot/vmlinuz-2.6.26-1-xen-amd64


Reiniciamos el equipo y arrancamos con el nuevo kernel.

Una vez arrancado podemos ver si estamos en el kernel recién instalado:

~$ uname -a
Linux ubuntu 2.6.24-17-xen #1 SMP Thu May 1 16:58:53 UTC 2008 i686 GNU/Linux


Para ver si el dom0 está corriendo ejecutamos:

~$ sudo xm list
Name                                        ID   Mem VCPUs      State   Time(s)
Domain-0                                     0   370     2     r-----    662.9


Instalamos el paquete xen-tools para crear las máquinas virtuales.

~$ apt-get install xen-tools

Configuramos Xen, editando el fichero /etc/xen/xend-config.sxp indicando el modo en el que se crearán las máquinas virtuales:

#
# Xend configuration file.
#
(loglevel DEBUG) # descomentamos esta linea para obtener más información de depuración en los logs del sistema.
(network-script network-bridge)   #red en modo bridge
#(network-script network-dummy) # red en no dummy
(vif-script vif-bridge) #vif-scritp reconoce el modo bridge.
(dom0-min-mem 196) #minimo de memoria para el dom0.
(dom0-cpus 0) #permitimos que el dom0 use todas las cpus.
(vnc-listen '0.0.0.0') # habilitamos la consola VNC desde el exterior.
(vncpasswd ) # sin password


Xen se encuentra instalado en vm1 y vm2

ssh vm1.lab.it.uc3m.es -p7000


Post instalación

Cambio de contraseña

Desde la máquina que virtualiza (dom0). Localizamos donde se encuentra la imagen de la máquina virtual.

cat /etc/xen/pandereta.cfg 

En nuestro caso, tendremos que montar /xen-disks/domains/pandereta/disk.img

mkdir /tmp/montar
mount -o loop /xen-disks/domains/pandereta/disk.img /tmp/montar/
chroot /tmp/montar
passwd root # Introducimos la nueva contraseña
exit
umount /tmp/montar

Acceso por SSH

Es necesario acceder a la máquina en modo consola e instalar udev

xm create -c viola.cfg extra="init 1"
apt-get update
apt-get install udev build-essentials

Configuración del domU

domU en paravirtualización -- kernel modificado

Editar el fichero /etc/xen-tools/xen-tools.conf

######################################################################
#  		MÁQUINA VIRTUAL	 DEBIAN x64 (64bits)			#
#									#
dir = /var/xen-gests  #donde se almacenan las máquinas virtuales.	#
debootstrap = 1 	# indicamos que haremos deboot			#
memory = 128MB 	# tamaño de la memoria a utilizar		#
swap = 128MB 		# tamaño de la swap				#
size = 4GB 		# tamaño de disco				#
fs = ext3 		# tipo de sistema de ficheros			#
dist = lenny 		# distribución de GNU/Linux			#
arch = amd64 		# arquitectura					#
passwd = 1 		# habilitada petición de contraseña		#
mirror = http://ftp.rediris.es/debian # mirror			#
#									#
#####################################################################

Crear la imagen de la máquina virtual.

~@xen-create-image --dir /xen-disks --hostname=solfeo --ip=163.117.139.142 --netmask=255.255.255.0 --gateway 163.117.171.2 -force -dist lenny

Lanzar la máquina virtual

~$ xm create solfeo.cfg
Using config file "./solfeo.cfg".
Started domain solfeo
vm1:/etc/xen# xm list
Name                                        ID   Mem VCPUs      State   Time(s)
Domain-0                                     0  4818     8     r----- 477013.5
arpa                                         1  2048     2     -b---- 737219.0
balafon                                      2  1024     1     -b---- 531966.6
solfeo                                       3   128     1     -b----      1.3  xm create /etc/xen/tania_x64.cfg

domU con HVM (virtualización completa) -- kernel sin modificar

Comprobamos que tenemos soporte en el procesador.Si no obtenemos ningún resultado, podemos tener deshabilitada la bios o en el peor caso, no podemos instalar HVM en Xen.

~$ egrep '^flags.*(vmx|svm)' /proc/cpuinfo

Podemos usar qemu, con el paquete kqemu para una mejor actuación.


PROCESO DE CREACIÓN DEL domU Windows 2003 x64 SP2

1 – Creamos espacio para 20G.

~$qemu-img create -f qcow tania_win.img 20G

2- Creamos las imágenes en disco.

~$dd if=/dev/cdrom of=/xen-disk/ win2003_x64_sp2_cd1.iso
~$dd if=/dev/cdrom of=/xen-disk/  win2003_x64_sp2_cd2.iso

3 - Añadimos el fichero /etc/xen/tania_win.cfg.:

kernel="/usr/lib/xen-3.2-1/boot/hvmloader"
builder='hvm'
device_model='/usr/lib/xen-3.2-1/bin/qemu-dm'
memory=256
name='win1'
vif=[ 'type=ioemu, bridge=eth0' ]
disk=['file:/xen-disk/tania_win.img,ioemu:hda,w','file:/xen-disk/es win2003_x64_sp2_cd1.iso,hdc:cdrom,r' ]
cdrom='/dev/hdc'
boot='d' 
#snapshot=1 
acpi=1
apic=1
sdl=1   
vnc=0 
vncviewer=0 

Procedemos a la instalación del sistema operativo.

~$ xm create tania_win.cfg

Cerramos la máquina virtual y volvemos a editar el fichero de configuración para cambiar al segundo cd y proseguir con la instalación.

disk=['file:/xen-disk/tania_win.img,ioemu:hda,w','file:/xen-disk/es win2003_x64_sp2_cd2.iso,hdc:cdrom,r' ]
boot=’c’ # cambiamos al arranque de la unidad “c:” en lugar de la “d:”

Arrancamos la máquina virtual desde la unidad c y una vez dentro del sistema operativo instalamos el cd2 desde MiPC.

PROCESO DE CREACIÓN DEL domU Debian

Realizamos todos los pasos anteriores, cambiando los siguientes parámetros en /etc/xen/tania_debian.cfg.

acpi=0
apic=0
sdl=0


DISEÑO DEL LANZAMIENTO DE 4 MÁQUINAS VIRTUALES CON XEN

800px


Common 'xm' commands:

console              Attach to <Domain>'s console.
create               Create a domain based on <ConfigFile>.
new                  Adds a domain to Xend domain management
delete               Remove a domain from Xend domain management.
destroy              Terminate a domain immediately.
dump-core            Dump core for a specific domain.
help                 Display this message.
list                 List information about all/some domains.
mem-set              Set the current memory usage for a domain.
migrate              Migrate a domain to another machine.
pause                Pause execution of a domain.
reboot               Reboot a domain.
restore              Restore a domain from a saved state.
resume               Resume a Xend managed domain
save                 Save a domain state to restore later.
shell                Launch an interactive shell.
shutdown             Shutdown a domain.
start                Start a Xend managed domain
suspend              Suspend a Xend managed domain
top                  Monitor a host and the domains in real time.
unpause              Unpause a paused domain.
uptime               Print uptime for all/some domains.
vcpu-set             Set the number of active VCPUs for allowed for
                     the domain.


Problemas conocidos

Falla el debootstrap al crearse

Durante la instalación obtenemos un mensaje como este

I: Retrieving Release
E: Failed getting release file http://ftp.us.debian.org/debian/dists/edgy/Release

Es debido a que el repositorio que se está utilizando no es el adecuado. Hay que editar el archivo

/etc/xen-tools/xen-tools.conf

Y configuramos una entrada para dicha distro, en este caso el archive de debian

mirror_lenny=http://archive.debian.org/debian

Ralentización de la máquina virtual (Ubuntu)

Tal vez vaya un poco lento al arrancar el kernel de la máquina virtual (detectado sólo en Ubuntu). En ese caso ejecutar:

~$ mv /lib/tls /lib/tls.disabled

Ejecución en remoto

Si queremos ejecutarlo en remoto, debemos exportar la variable DISPLAY

~$ export DISPLAY=<máquina local>:0.0

Problemas con el hardware

Algunas placas no soportan tecnología de virtualización, o se deben activar en las BIOS. Concretamente IntelVT (Vanderpool) y AMD-V (Pacífica).

Configuración Multi-bridge

Xen sólo configura una interfaz de red por defecto, en nuestro caso eth0. Para añadir más de una tarjeta de red ethernet, podemos configurar varios puentes de red virtualizados en Xen. En este caso, vamos a proceder a la explicación de cómo en xen se añadiría una interfaz de red, eth1, a nuestra interfaz eth0 por defecto.

Crear el siguiente script y guardarlo en /etc/xen/scripts/networkxenmulti-bridge

set -e
# El primer argumento es la operación.
OP=$1
shift
script=/etc/xen/scripts/network-bridge.xen
case ${OP} in
start )
$script start vifnum=0 netdev=eth0
$script start vifnum=1 netdev=eth1
;;
stop )
$script stop vifnum=1 netdev=eth1
$script stop vifnum=0 netdev=eth0
;;
status )
$script status vifnum=1 netdev=eth1
$script status vifnum=0 netdev=eth0
;;
* )
echo 'Unknown command: ' ${OP}
echo 'Valid commands are: start, stop, status'
exit 1
esac

Copiamos el fichero /etc/xen/scripts/network-bridge a /etc/xen/scripts/network-bridge.xen.

Editamos el fichero de configuración de xen /etc/xen/xend-config.sxp y añadimos una línea a su nuevo script del puente de red (este ejemplo utiliza "network-virtualization-multi-bridge" ).

En el archivo xend-config.sxp, la nueva línea debe reflejar el nuevo script:

network-script network-xen-multi-bridge

Nos aseguramos de comentar las líneas que digan:

network-script network-bridge

Ejecutamos los comandos siguientes para ver la resolución:

~$brctl show
bridge name     bridge id               STP enabled     interfaces
eth0            8000.001fc6a8f1c7       no              peth0
~$/etc/init.d/xend stop
~$/etc/init.d/xend start
~$brctl show 
bridge name     bridge id               STP enabled     interfaces
eth0            8000.001fc6a8f1c7       no              peth0
eth1            8000.000a5e4ce8ff       no              peth1


Para configurar la nueva interfaz en las máquinas virtuales añadimos la siguiente linea al fichero maquinavirtual.cfg en el directorio /etc/xen/

vif=[ 'type=ioemu,bridge=eth0','type=ioemu,bridge=eth1']

Procedimiento de arranque desde imagen de live-cd

Con estos pasos se puede solucionar un problema con una imagen xen que se lanza desde un fichero hvm (balafon, arpa).

El problema consiste en que la máquina virtual que soporta balafon o arpa no arranca, y mostrará en pantalla un mensaje similar a este:

vm1:/etc/xen> sudo xm create balafon.hvm
Using config file "./balafon.hvm".
Error: Kernel image does not exist: /boot/vmlinuz-2.6.18-6-xen-686

Este error se puede presentar tanto en vm1 como en vm2. Hay que reinstalar el grub después de arrancar con una instalación de debian en modo rescue.

Hide quoted text
grub> device (hd0) /dev/hda
grub> root (hd0,0)
grub> setup (h0)

Para restaurar el MBR con el grub hay que habilitar nographic=0 (por defecto a nographic=1) y boot='d' para arrancar de cd-rom. Esto se edita en el archivo /etc/xen/balafon.hvm en el caso de ser balafon lo que soporta la máquina virtual, o en otro archivo .hvm o .cfg si es otra imagen xen distinta.

Archivo /etc/xen/balafon.hvm:

...
# enable spawning vncviewer(only valid when vnc=1), default = 1
vncdisplay=2
vnclisten="0.0.0.0"
keymap = 'es'
vncviewer=0
#----------------------------------------------------------------------------
# no graphics, use serial port
nographic=1   #Aquí cambiamos el valor de 1 a 0 y ponemos: nographic=0 de forma que habilitamos la consola gráfica de la máquina virtual.
#-----------------------------------------------------------------------------
# serial port re-direct to pty deivce, /dev/pts/n
# then xm console or minicom can connect
serial='pty'
...

Una vez habilitada la consola gráfica (sea balafon, arpa o cualquier otra) ( ver siguiente apartado ), en caso de ser balafon la máquina virtual, se podrá reiniciar para que su comportamiento vuelva a la normalidad:

>> reboot balafon

Otra opción es lanzar una imagen xen desde un fichero hvm, para ello hay que seguir estos pasos:

1.) Crear la imagen de disco. Se creará un fichero con extensión .img, que posteriormente se puede comprimir en formato .vhd para ahorrar espacio:

dd if=/dev/zero of=balafon.img bs=1 count=1 seek=30G

2.) Editar el contenido del fichero balafon.img viendo el código en su archivo correspondiente ( vm1:/etc/xen/balafon.hvm ) (o la máquina virtual que sea, arpa, pandereta, solfeo...)

3.) Instalar un cliente de escritorio remoto

4.) Arrancar la máquina virtual de la forma habitual y arrancar el cliente de escritorio remoto.

5.) Deben quitarse todos los dispositivos de almacenamiento excepto el disco duro, modificando la línea disk = del fichero de configuración (balafon.hvm).

6.) Configurar el arranque para que sólo se utilice el disco duro

# boot on floppy (a), hard disk (c) or CD-ROM (d)
boot='c'

7.) Comprimir la imagen de disco y borrar la antigua (que tiene extensión .img), mediante el comando:

qemu-img convert balafon.img -O qcow2 balafon.qcow2

8.) Modificar el fichero de configuración para que utilice la nueva imagen.

disk        = [ 'file:/xen-machines/domains/balafon/vdisk.hvm,ioemu:hda,w','file:/xen-machines/domains/balafon/debian-40r6-i386-netinst.iso,ioemu:hdc:cdrom,r' ]

Alternativas y opciones avanzadas

a) Transformar un servidor físico Linux en servidor virtual.

Utilizando la herramienta Virt-P2V para migrar a XEN (Virt-P2V es un "Live CD" que convierte máquinas físicas para ejecutar en KVM). Los pasos a seguir son:

1. Meter el cd en el servidor a clonar y reiniciarlo

2. En el menú que aparece se introduce la ip del servidor XEN y se configura la conexión ssh (usuario y contraseña), y se indica en que carpeta remota del servidor XEN se tiene que dejar la imagen.

3. Una vez finalizado el paso anterior, en la carpeta del servidor XEN que se ha configurado habrá dos archivos: una imagen en formato IMG y un fichero de configuración XML. Se puede optar por quedarse con el archivo IMG y eliminar el XML, para a continuación crear un fichero de configuración con el que usarlo en XEN con los 8 pasos mencionados anteriormente.

b) Migrar un servidor virtual de formato IMG a LMV.

1. Si en el fichero de configuración del servidor se usa una imagen como disco en este formato o similar:

disk = [ 'vm1:/etc/xen/.../imagenDeDisco.img,hda,w']

2. Se puede crear un nuevo volumen lógico con el tamaño que tiene la imagen (en este ejemplo ocuparía 4.2 Gb la imagen )

#lvcreate -L 4.2G -n imagenDeDisco volgroupxen

3. Hay que parar el servidor virtual que corre sobre esa imagen antes de hacer la copia. Una vez parado, se usa el comando dd para la copia.

dd if= /etc/xen/..../imagenDeDisco.img   of=/dev/volgroupxen/imagenDeDisco bs=16M

4. Cuando finaliza la copia modificamos el fichero de configuración, y donde antes hacía referencia a la imagen IMG, ponemos la referencia al volumen LVM.

disk = [ 'vm1:/dev/volgroupxen/imagenDeDisco,hda,w']

c) Si queremos que cuando arranque el servidor físico XEN, arranquen también las máquinas virtuales, tenemos que añadir un enlace por cada servidor virtual, por ejemplo:

root@vm1:/etc/xen# ln -s /etc/xen/XenNagios.cfg /etc/xen/auto/

Consola gráfica de la máquina virtual: (En este caso, Balafon.it.uc3m.es)

Xen nos proporciona una forma de acceder a la consola de las maquinas virtuales, que es usando el comando xm console nombre-de-maquina-virtual, en el caso de que no funcione, y se quede a la espera, como ocurre en está imagen:

ConsolaGrafica.png


Existe otra forma de ver la consola de una máquina virtual (Usando la consola gráfica de la máquina).

Tendremos que:

Tenemos que usar el comando xhost + en la máquina local desde la que nos estamos conectando a VM1.

Ahora nos conectamos por ssh (con la opción -X) a VM1 y accediendo al directorio /etc/xen/auto/

Modificamos el fichero de balafon.hvm añadiendo la linea :

nographic=0

y cambiando la linea :

boot='c'  

por esta otra linea :

boot='d' 


Después hay que arrancar usando el CD live (Arranca automáticamente con la opción boot='d' , no es necesario cambiar nada más) (La contraseña del usuario del CD live, es "live", por si se bloquea la pantalla).

Una vez en el sistema live, abrimos una terminal, nos hacemos root usando el comando "sudo su" y montamos :

sudo su
mount -o bind /dev /target/dev
mount -o bind /proc /target/proc
mount -o bind /sys /target/sys

Ahora hacemos un chroot a /target (Que es donde el CD live monta el disco duro de balafon).

chroot /target

Usamos el comando grub

grub

Una vez dentro de la consola de grub ejecutamos estos comandos:

device (hd0) /dev/hda
root (hd0,0)
setup (hd0)

Una vez hecho esto, se sale del chroot, se desmonta /target, se cambia el fichero de balafon para que arranque normal, es decir, se quita la linea de "nographic=0" y se pone la opcion boot='c' de nuevo.

Ahora ya podemos reiniciar la máquina.

La maquina virtual se queda colgada durante el arranque

En ocasiones la mv (Linux en este caso), se queda dolgada durante el proceso de arranque del sistema y la consola (-c) no responde.

Una posibilidad es arracar el sistema en modo singel, utilziando la opción extra, Ej.:

 xm create -c viola.cfg extra="init 1"
 ...
 INIT: Sending processes the TERM signal
 error: 'single' exited outside the expected code flow.
 INIT: Sending processes the KILL signal
 Press enter for maintenance
 (or type Control-D to continue):



--Tania 12:26 6 feb 2009 (UTC)