miércoles, 20 de noviembre de 2013

Virtualizar máquina física

Para virtualizar una máquina física, únicamente necesitamos pasar el disco duro físico a un estándar de virtualización. Esto es suficiente para sistemas operativos GNU/Linux, pero para otros sistemas operativos el proceso puede ser algo más complicado y existen herramientas especificas para este fin.

Desde GNU/Linux necesitamos clonar el disco del sistema de la máquina física al disco duro del sistema de la máquina virtual. Esto es tan simple como ejecutar el comando:
dd if=/dev/sda | ssh root@ dd of=/dev/sda
Es decir, clonamos de un disco principal (dd if=/dev/sda) al disco principal de una máquina remota (ssh root@ dd of=/dev/sda). Pero claro, esto no podemos ejecutarlo tal cual en un sistema que está ejecutándose, porque no podemos copiar directamente un disco duro mientras el sistema lo está utilizándolo. Corremos el riesgo de que se modifiquen cosas que ya hemos copiado y el disco no sería consistente.

Este proceso es recomendable hacerlo en frio, es decir, con el sistema parado. Utilizaremos un CD Live que nos permite tener funciones de red y que disponga de servidor SSH instalado. Yo he utilizado Clonezilla, lo puedes descargar desde la web oficial de clonezilla o te dejo aquí el enlace de la versión que yo utilicé clonezilla-live-2.2.0-29-i686-pae.iso

Para el que no tenga experiencia con clonezilla, os comento algunas peculiaridades; el usuario root no tiene clave de acceso, para acceder como root necesitamos entrar como usuario "user" con clave "live" y después ejecutar "sudo -s" para pasar a ser "root". Necesitarás utilizar la cuenta de "root" directamente en una conexión SSH, cambia la clave de "root" con el comando "password".

Para virtualizar una máquina física necesitaremos; por una lado la máquina física y por otro lado una máquina virtual. Las dos deben iniciarse con clonezilla, activar la red y levantar el servidor ssh.

  • Activar la red: para meter la máquina dentro de nuestra red. Si tenemos corriendo un DHCP en nuestra red, podemos solicitarle que le asigne una IP a la tarjeta de red de nuestra máquina iniciada con el CD live. Para esto utilizaremos el comando "dhclient eth0".
  • Servidor SSH: una vez tenemos la máquina dentro de la red vamos a iniciar el servidor SSH ejecutando el comando "/etc/init.d/ssh start". Ahora podemos conectarnos desde una máquina remota a esta.
Ahora desde la máquina que pretendemos virtualizar ejecutaremos el siguiente comando:
dd if=/dev/sda | ssh root@< ip &gt dd of=/dev/sda
Esto nos pedirá la clave de root de la máquina destino. Y comenzará con el proceso de clonado enviando los datos por la red, son devolver ningún tipo información sobre el estado del proceso.

Este proceso puede tardar algunas horas, dependiendo de la velocidad de nuestra red y del tamaño del disco a copiar. Recomiendo utilizar el comando "pv" entre el "dd" y "ssh" para que nos informe sobre la transferencia de datos.

"pv" nos mostrará tanto la transferencia actual, como el total de datos transferidos. Esto será bastante cómodo y nos ayuda a hacer una estimación del tiempo que le queda al proceso. El resultado es algo parecido a esto:
1,32GB 0:02:06 [10,9MB/s] [                            <=>                         ]
Cuando el proceso ha terminado tiene que mostrar un resumen total como este:

156301488+0 records in
156301488+0 records out
80026361856 bytes (80 GB) copied, 7069.71 s, 11.3 MB/s

Asegúrate de tener instalado el comando "pv" antes de lanzar el proceso. Si no lo tienes instalado no funcionará. Finalmente así queda el comando:
dd if=/dev/sda | pv | ssh root@< ip &gt dd of=/dev/sda
Recordad que este proceso es bastante largo, si lanzas el proceso desde una consola SSH es muy probable que pierdas la conexión y no puedas volver a consultar el estado del proceso. Para evitar este problema recomiendo siempre utilizar "screen" para lanzar este tipos de proceso que presumiblemente tardarán mucho en terminar. Hace ya algún tiempo que escribí un artículo sobre el uso de "screen", pero sigue estando en vigor y os puede servir de ayuda.

También es importante destacar que este proceso cargará en gran medida en hardware donde lancemos el comando "dd if=/dev/sda | ..."; ya que recorrerá por completo el disco duro y lo transferirá por la red. Si hemos decidido virtualizar una máquina física es probable que se trate de una máquina vieja y puede que este proceso termine de matarla y no sobreviva.

Para evitar matar a la máquina que pretendáis virtualizar y no hacer que toda la espera sea una perdida de tiempo, os recomiendo sacar el disco de la máquina a virtualizar y o bien montarlo en una unidad usb externa y lanzar el "dd" desde otra máquina o conectarlo directamente en la maquina que hospedará a la máquina virtual.