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.gz3. 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.
make install
3.1. para el caso de partición lógica:
lvmcreate VolGroup00 --size 2G --name virtualdonde 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/virtual3.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=1y la formateamos con el sistema de archivos q queramos. Para el ejemplo, uso ext3:
mkfs.ext3 /media/virtual.img4. 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 swap4.2. Creamos un archivo con la imágen swap
mkswap /dev/VolGroup00/swap
dd if=/dev/zero of=/media/virtual.swap bs=1M seek=256 count=15. Montar la partición root en algún directorio.
mkswap /media/virtual.swap
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 i386Nota: si tira algún error, puede ser que les falte la librería perl-libwww-perl. Instalarla con:
yum install perl-libwww-perl7. montar el directorio proc (comunicación con el kernel) en el árbol de directorios recién creado:
mount -t proc none /mnt/virtual_base/proc8. hacer chroot al sistema de directorios de la máquina virtual creada:
chroot /mnt/virtual_base9. 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-xen10. modificar el /etc/fstab con "nano /etc/fstab" y dejarlo de la siguiente forma:
/dev/sda1 / ext3 defaults 1 111. crear un nuevo init:
/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
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'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:
switchroot: mount failed: No such file or directory
# add a console for xen13. deshabilitar TLS porque alenta la máquina virtual:
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
# para 32 bit :
mv /lib/tls /lib/tls.disabled# para 64 bit :
mv /lib64/tls /lib64/tls.disabled14. 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/hwclock15. darle un password a root:
pwconv16. salir del chroot con exit.
passwd root
17. copiar el kernel recien instalado en otro lado, como por ejemplo a /root
cp /mnt/virtual_base/boot/initrd* /root/initrd.img18. desmontar todo:
cp /mnt/virtual_base/boot/vmlinuz* /root/vmlinuz
umount /mnt/virtual_base/proc19. 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".
umount /mnt/virtual_base
19.1. en el caso que utilizaran volúmenes lógicos, el archivo debería contener lo siguiente:
kernel = "/root/vmlinuz"19.2. en caso de haber utilizado archivos como imágenes, debería contener lo siguiente:
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”
kernel = “/root/vmlinuz″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.
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”
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 -cPara 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 virtualPara apagar la máquina virtual, ejecutar (desde la máquina host):
xm shutdown virtualOtros comandos útiles son: "xm destroy
21. una vez en la máquina virtual, deshabilitar HAL dado que no funcionará:
/sbin/chkconfig haldaemon off22. 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
3 comentarios:
Muy buena data! Thx for sharing! :)
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
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