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:
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.