Conversión P2V de RHEL en VMware

Cada día es más común realizar la migración de servidores físicos a virtuales (P2V). Aunque existen herramientas específicas para ello, como VMware Converter, muchas veces es más sencillo usar una forma manual que no tener que montar una nueva infrastructura de software para 1 ó 2 migraciones.

En este artículo vamos a ver cómo migrar una instalación de RHEL4 en físico (servidor HP Proliant) a máquina virtual bajo vSphere 4.1. El proceso descrito es similar a una Cold migration, es decir, una mgiración con la máquina de origen apagada (y por tanto, con pérdida de servicio).

Los pasos a realizar serán :

  • Preparar la máquina física de origen con los drivers necesarios de VMware (initrd)
  • Crear de una máquina virtual en VMware
  • Arrancar la máquina virtual con un LiveCD
  • Arrancar la máquina física con un LiveCD
  • Copiar por red cada uno de los discos de la máquina de origen a la máquina virtual
  • Editar ficheros de configuración y ver que la VM arranca correctamente
  • Instalación de VMware Tools

Más en detalle:

Preparación de la máquina de origen

Esta será la única modificación que se realiza en la máquina de origen; consiste en incluir los módulos necesarios para que la máquina pueda arrancar con su futuro hardware virtual. Para ello es necesario editar el fichero /etc/modprobe.conf de la siguiente manera:

#alias eth0 tg3  
#alias eth1 tg3  
alias scsi_hostadapter cciss  
alias scsi_hostadapter1 mptspi  
alias scsi_hostadapter2 mptscsih  
alias scsi_hostadapter3 ata_piix

Se han comentado las líneas 1 y 2 para evitar introducir los módulos de las tarjetas de red en el initrd, así como añadido las lineas 4 y 5 que son los módulos de la controladora SCSI virtual de VMware. Una vez realizado esto se procede a construir un initrd nuevo y a añadirlo en la configuración de GRUB :

root@server /boot # uname -a  
Linux server 2.6.18-92.1.6.el5 #1 SMP Fri Jun 20 02:36:16 EDT 2008 i686 i686 i386 GNU/Linux  
root@server /boot $ mkinitrd initrd-2.6.18-92.1.6.el5-vmware.img 2.6.18-92.1.6.el5  
root@server /boot $ cat /etc/grub.conf  
[...]  
# entrada con nuevo initrd  
title Red Hat Enterprise Linux Server (vmware)  
root (hd0,0)  
kernel /vmlinuz-2.6.18-92.1.6.el5 ro root=/dev/vg00/lvol00 rhgb quiet  
initrd /initrd-2.6.18-92.1.6.el5-vmware.img  
#entrada con initrd original  
title Red Hat Enterprise Linux Server (2.6.18-92.1.6.el5)  
root (hd0,0)  
kernel /vmlinuz-2.6.18-92.1.6.el5 ro root=/dev/vg00/lvol00 rhgb quiet  
initrd /initrd-2.6.18-92.1.6.el5.img

Creación de la máquina virtual

La única consideración a tener en cuenta es crear los discos de, al menos, el mismo tamaño que los discos de la máquina física de origen.

Arranque de las máquinas con un LiveCD

En principio, nos vale cualquier LiveCD que tengamos a mano, pero recomiendo SysRescCD debido a su pequeño tamaño (~250MB), soporte simultáneo de 32 y 64 bits y gran cantidad de utilidades embebidas. Una vez arrancadas ambas máquinas, deberemos asignarles a cada una de ellas una IP temporal y verificar que se vean entre sí (por ejemplo, a través de ping).

Transferencia de datos

Usaremos pv para leer los contenidos del disco y netcat para transferirlos por red. PV es una herramienta muy cuca que te aporta información en tiempo real de tamaño leído, velocidad de transferencia actual, tiempo restante (si se conoce el tamaño total del stream); aunque podríamos usar perfectamente cosas más simples como cat ó dd.

En la máquina virtual de destino: Dejamos escuchando un netcat en un puerto TCP arbitrario que queramos, y redirigimos su salida hacia el disco de destino. Ejemplo:

nc -l -p 5000 > /dev/sda

En el servidor físico de origen: Iniciamos la lectura y la enviamos con netcat hacia la IP y puerto de destino, ejemplo:

pv /dev/cciss/c0d0 | nc ipdestino 5000

Algunas notas sobre este proceso: Si tenemos varios discos de origen, podemos paralelizar el proceso cambiándo de TTY y lanzando simultáneamente varios netcats (cambiando los puertos TCP de destino). En pruebas realizadas, hemos visto velocidades combinadas de hasta 70 MB/s (250 GB/hora) para conexiones Gigabit, aunque depende lógicamente de la red y el hardware origen y destino.

Una vez realizado esto, podremos apagar la máquina física de origen y proceder a verificar el estado de la copia. Deberemos recargar la tabla de particiones en la máquina virtual para que se aplique lo escrito a disco y, si usamos LVM, activar los Volume Groups correspondientes.

# cat /proc/partitions  
major minor #blocks name

8 0 244198584 sda  
# partprobe  
# cat /proc/partitions  
major minor #blocks name

8 0 244198584 sda  
8 1 1024000 sda1  
8 2 243172001 sda2  
# vgchange -ay  
# cat /proc/partitions  
major minor #blocks name

8 0 244198584 sda  
8 1 1024000 sda1  
8 2 243172001 sda2  
253 0 16777216 dm-0  
253 1 7864320 dm-1  
253 2 10485760 dm-2  
253 3 2097152 dm-3  
253 4 4194304 dm-4  
253 5 80740352 dm-5  
253 6 52428800 dm-6  
253 7 27262976 dm-7  
253 8 13631488 dm-8

Además, deberemos revisar la configuración de /etc/fstab para verificar que no haya referencias a dispositivos incorrectos (en Proliant el primer disco del sistema es /dev/cciss/c0d0 mientras que en VMware es /dev/sda). Para ello, deberemos montar el filesystem raid en un directorio temporal (por ejemplo mkdir /test ; mount /dev/sda1 /test) y editar los ficheros necesarios. Además, en RHEL deberemos editar los ficheros /test/etc/sysconfig/network-script/ifcfg-eth* para verificar que no tengan asociada ninguna MAC Address concreta, o bien reemplazar las existentes por las de la nueva VM).

Finalmente, reiniciaremos la máquina virtual y comprobaremos si todo levanta correctamente. Si es así, procederemos a quitar todas las herramientas que dependan de un hardware concreto (por ejemplo Proliant Support Pack en HP, OpenManage en Dell, etc) e instalar las VMware Tools.