Crear máquina virtual en CentOS usando Xen
A continuación les dejo los pasos que realicé hace algunos meses para crear una máquina virtual en un entorno Xen sobre CentOS. Existen herramientas gráficas para la creación de máquinas virtuales en Xen, pero si tienen instalado entorno gráfico, algo que no suele suceder si estamos administrando un server. Para hacerlo de forma gráfica, pueden leer éste artículo en la página de CentOS.
Si bien centos provee la herramienta virt-install para realizar el trabajo por consola, a mi no me sirvió. No logré instalar una máquina virtual utilizando dicha herramienta, y eso que lo intenté de varias formas.
Por esto, terminé recurriendo a lo básico, no utilizar ninguna herramienta más que las básicas de xen, hacer todo el resto a mano, algo que siempre da buenos resultados (si saben lo que hacen).
Igualmente no puedo asegurar nada con respecto a lo que explico a continuación, porque puede que a ustedes no les funcione. Sólo puedo decirles que a mi me funcionó perfectamente y terminé aprendiendo un montón.
Los pasos que describo son el resultado de muchas horas de búsqueda, lectura y pruebas, así que están frente a una receta que no encontré en ningún otro lugar.
En el ejemplo instalo una máquina virtual (Guest) CentOS sobre un host CentOS. Los pasos son los siguientes:

1. descargar rinse desde: http://xen-tools.org/software/rinse/releases.html.
Rinse es el equivalente a debootstrap de debian y sirve para crear la estructura de directorios básica para correr una distro basada en RPMs.

2. instalar rinse:
tar -zxvf rinse-version.tar.gz
make install
3. crear una particion para el sistema guest. En este punto hay dos opciones, usar una partición lógica o crear un archivo que sirva como imágen del sistema operativo.

3.1. para el caso de partición lógica:
lvmcreate VolGroup00 --size 2G --name virtual
donde VolGroup es el nombre del grupo de volúmenes lógicos donde crearemos la partición y 2G indica que la partición tendrá 2GB de tamaño. La partición lógica se llamará virtual (en un acto de inspiración total).
Luego formateamos esta partición con el sistema de archivos que deseamos. Para el ejemplo, utilizo ext3:
mkfs.ext3 /dev/VolGroup00/virtual
3.2. en el caso de utilizar un archivo, creamos la imagen con dd:
dd if=/dev/zero of=/media/virtual.img bs=1M seek=2047 count=1
y la formateamos con el sistema de archivos q queramos. Para el ejemplo, uso ext3:
mkfs.ext3 /media/virtual.img
4. crear una partición para swap. Otra vez, podemos elegir utilizar volumenes lógicos o una imágen en un archivo. Acosejo que sean coherentes con lo que hicieron antes, y elijan lo mismo para la swap.

4.1. Creamos el volúmen lógico de 256MB y lo formateamos para q sea swap:
lvmcreate VolGroup00 --size 256M --name swap
mkswap /dev/VolGroup00/swap
4.2. Creamos un archivo con la imágen swap
dd if=/dev/zero of=/media/virtual.swap bs=1M seek=256 count=1
mkswap /media/virtual.swap
5. Montar la partición root en algún directorio.

5.1. mount /dev/VolGroup00/virtual /mnt/virtual_base

5.2. mount -o loop /media/virtual.img /mnt/virtual_base

6. ejecutar rinse con destino el directorio que servirá como raíz del nuevo árbol de directorios y le indicamos la distribucion que vamos a instalar (opcionalmente también se puede incluir la arquitectura):
rinse --distribution centos-5 --directory /mnt/virtual_base --arch i386
Nota: si tira algún error, puede ser que les falte la librería perl-libwww-perl. Instalarla con:
yum install perl-libwww-perl
7. montar el directorio proc (comunicación con el kernel) en el árbol de directorios recién creado:
mount -t proc none /mnt/virtual_base/proc
8. hacer chroot al sistema de directorios de la máquina virtual creada:
chroot /mnt/virtual_base
9. Una vez en el árbol de directorios de la máquina guest, instalar todas los programas que deseamos, pero acuerdense de instalar el kernel xen:
yum install kernel-xen
10. modificar el /etc/fstab con "nano /etc/fstab" y dejarlo de la siguiente forma:
/dev/sda1 / ext3 defaults 1 1
/dev/sda2 none swap sw 0 0
none /dev/pts devpts gid=5,mode=620 0 0
none /dev/shm tmpfs defaults 0 0
proc /proc proc defaults 0 0
none /sys sysfs defaults 0 0
11. crear un nuevo init:
mkinitrd --omit-scsi-modules --with=xennet --with=xenblk --preload=xenblk initrd.img $(uname -r)
con esto evitamos el error:
mount: could not find filesystem '/dev/root'
switchroot: mount failed: No such file or directory
12. editar el archivo /etc/inittab y agregar una consola porque sino Xen no mostrará el promt de login. Tambien se pueden comentar las ttys dado que no serán de utilidad en la consola xen. Las primeras líneas del inittab deberían quedar similares a las siguientes:
# add a console for xen
co:2345:respawn:/sbin/mingetty console
# comment out the default TTYs
#1:2345:respawn:/sbin/mingetty tty1
#2:2345:respawn:/sbin/mingetty tty2
#3:2345:respawn:/sbin/mingetty tty3
#4:2345:respawn:/sbin/mingetty tty4
#5:2345:respawn:/sbin/mingetty tty5
#6:2345:respawn:/sbin/mingetty tty6
13. deshabilitar TLS porque alenta la máquina virtual:
# para 32 bit :
mv /lib/tls /lib/tls.disabled
# para 64 bit :
mv /lib64/tls /lib64/tls.disabled
14. deshabilitar el reloj del hardware dado que el sistema guest utilizará el reloj del sistema host. Reemplazamos el hwclock con un script vacío:
echo exit 0 > /sbin/hwclock
15. darle un password a root:
pwconv
passwd root
16. salir del chroot con exit.

17. copiar el kernel recien instalado en otro lado, como por ejemplo a /root
cp /mnt/virtual_base/boot/initrd* /root/initrd.img
cp /mnt/virtual_base/boot/vmlinuz* /root/vmlinuz
18. desmontar todo:
umount /mnt/virtual_base/proc
umount /mnt/virtual_base
19. crear el archivo con la configuración de la máquina virtual para que Xen la pueda crear. El archivo puede estar en cualquier lugar, pero lo crearemos dentro de /etc/xen porque es el primer lugar donde busca Xen al crear una VM. El archivo lo llamaremos "virtual".

19.1. en el caso que utilizaran volúmenes lógicos, el archivo debería contener lo siguiente:
kernel = "/root/vmlinuz"
ramdisk = "/root/initrd.img"
memory = 255
name = “virtual”
vif = [ 'mac=00:16:3e:21:f1:31' ]
dhcp = “dhcp”
disk = ['phy:VolGroup00/virtual,sda1,w', 'phy:VolGroup00/swap,sda2,w']
root = “/dev/sda1 ro”
19.2. en caso de haber utilizado archivos como imágenes, debería contener lo siguiente:
kernel = “/root/vmlinuz″
ramdisk = “/root/initrd.img″
memory = 255
name = “virtual”
vif = [ 'mac=00:16:3e:21:f1:31' ]
dhcp = “dhcp”
disk = ['phy:/media/virtual.img,sda1,w', 'phy:/media/virtual.swap,sda2,w']
root = “/dev/sda1 ro”
En vif pueden colocar la mac para la placa de red, y con dhcp le indicamos que obtenga la ip por dhcp. En memory le dimos 255MB y en disk le indicamos cuáles serán las particiones visibles dentro del guest.

20. crear finalmente una instancia de la máquina virtual configurada (la cual llamamos "virtual"). Una vez creada, el promt quedará dentro de la máquina virtual.
xm create virtual -c
Para salir de la máquina virtual, tipeamos Ctrl+J. Si no utilizamos el parámetro "-c", la máquina se creará en background y no veremos el promt. Para meternos en la máquina virtual, hace falta utilziar el comando:
xm console virtual
Para apagar la máquina virtual, ejecutar (desde la máquina host):
xm shutdown virtual
Otros comandos útiles son: "xm destroy " para destruir sin apagar (como si le dieramos al botón del case). "xm list" para listar las máquinas virtuales que se están ejecutando. "xm help" para listar los comandos disponibles.

21. una vez en la máquina virtual, deshabilitar HAL dado que no funcionará:
/sbin/chkconfig haldaemon off
22. si instalamos el servidor ssh y sshd falla al intentar crear la clave, es porque no existe el dispositivo /dev/urandom. Para solucionarlo, ejecutamos:
/sbin/MAKEDEV generic
/etc/init.d/sshd start

Algunas referencias:
http://segvfault.wordpress.com/2008/11/06/xen-centos-5-debian-etch-como-guest/
http://forum.slicehost.com/comments.php?DiscussionID=690
http://blog.jphoude.qc.ca/2007/10/26/centos-5-xen-images-part-1/
http://www.virtuatopia.com/index.php/Building_a_Xen_Virtual_Guest_Filesystem_using_Logical_Volume_Management_(LVM)
http://www.howtoforge.com/perfect_setup_xen3_debian
http://www.howtoforge.org/using-xen-with-lvm-based-vms-instead-of-image-based-vms-debian-etch
http://wiki.xensource.com/xenwiki/

3 comentarios:

JaviZ dijo...

Muy buena data! Thx for sharing! :)

Anónimo dijo...

muy bueno. gracias.
tengo una pregunta puedes redirecionar la salida de la maquina virtual para una consola virtual digamos la 9 0 la 10. porque tengo un CentOS instalado con 2GB RAM DDR3 con Dual Core 2.8 Ghz tengo 2 puertos de red eth0 y eht1 on board 120 Gb Hdd SSD una particion 60 GB para my CentOS y otra para la maguina virtual.
no he podido ponerle la red fisica eth1 a la maquina virtual y tampoco he podido poner la salida de la maquina virtual para una consola virtual.
muchas gracias

V3kt0r dijo...

No se si entiendo bien tu pregunta, decis que la máquina virtual quede en una tty que puedas acceder con ctrl+alt+f9 o algo así?
Para acceder a las consolas virtuales tenes que hacer:
xm console nombre-de-la-virtual
No se si hay forma de hacer que esa consola quede mapeada directamente a una tty del sistema host.

Para el problema de las placas de red, hechale una mirada al artículo oficial de xen: XenNetworking

Publicar un comentario