Migrar un domU Xen en frío Posted on 12 septiembre 2008 by ortegaga Xen proporciona una mecanismo de migración de máquinas virtuales en caliente, pero para ello necesitamos algún medio de almacenamiento compartido (SAN, iSCSI, etc) para que funcione. Veremos que es posible migrar máquinas virtuales entre servidores Xen sin almacenamiento compartido, eso sí, en frío y tardando un poco más que la migración en caliente. Como requisito claro está, es tener un par de servidores ya funcionando como dom0 en Xen, y memoria y espacio de almacenamiento suficiente en el servidor de destino para ejecutar la máquina virtual que vamos a migrar. En mi caso se trata de dos servidores corriendo bajo Debian Etch en arquitectura x86-64, con máquinas virtuales usando volúmenes LVM, y que llamaremos xen1 y xen2 para simplificar. El primer paso es crear en el servidor de destino los volúmenes lógicos necesarios con el mismo tamaño que en el servidor origen. Para ello miramos el número de logical extends que emplea cada partición en el servidor original. Así, suponiendo que queremos migrar una máquina virtual llamada vm1, que usa dos volúmenes lógicos vm1-disk y vm1-swwap, usaremos el siguiente comando: xen1:~# lvdisplay -c vg00/vm1-disk vg00/vm1-swap /dev/vg00/vm1-disk:vg00:3:1:-1:0:8388608:1024:-1:0:0:254:10 /dev/vg00/vm1-swap:vg00:3:1:-1:0:2097152:256:-1:0:0:254:11 El valor que estamos buscando es el sexto empezando por el final, es decir, 1024 para la partición vm1-disk y 256 para la partición vm1-swap. Con estos valores, ejecutamos los siguientes comandos en el servidor de destino: xen2:~# lvcreate -l 1024 -n vm1-disk vg00 Logical volume "vm1-disk" created xen2:~# lvcreate -l 256 -n vm1-swap vg00 Logical volume "vm1-swap" created El siguiente paso es preparar el área de swap que acabamos de crear en el servidor de destino: xen2:~# mkswap /dev/vg00/vm1-swap El paso que nos llevará más tiempo es la transferencia de la máquina virtual del servidor origen al de destino. Este tiempo dependerá del tamaño de la partición (o particiones) que tengamos que transferir. Para realizar la transferencia, usaremos la herramienta netcat. En primer lugar preparamos el servidor de destino: xen2:~# netcat -l -p 12345 > /dev/vg00/vm1-disk Con esto, estamos abriendo un puerto de escucha, el 12345, en el servidor de destino, y le decimos que todo lo que reciba por ese puerto lo escriba en el volumen lógico /dev/vg00/vm1-disk. Hemos de tener cuidado ya que cualquiera podría conectarse con ese puerto y mandarnos basura a la partición. Ahora toca la parte en el servidor origen: xen1:~# dd if=/dev/vg00/vm1-disk | netcat xen2 12345 Ahora estamos diciendo que el servidor origen lea la partición /dev/vg00/vm1-disk y la envíe mediante el comando netcat al servidor xen2 (el servidor de destino) que está escuchando en el puerto 12345. Este comando debemos ejecutarlo con la máquina virtual completamente parada (no suspendida, si no tendríamos que transferir también el archivo que se crea con el estado de la máquina virtual cuando se suspende, aunque esto no lo he probado). Cuando termine la transferencia (dd muestra las estadísticas de lectura y escritura), pulsamos Ctrl+C para terminar netcat. Automáticamente se cierra la conexión en destino. El último paso es transferir el archivo de configuración de la máquina virtual, normalmente /etc/xen/vm1.cfg, y arrancar la máquina virtual en el servidor remoto comprobando que todo ha funcionado perfectamente.