Clonación de discos con dd

En este tutorial se utiliza el comando dd, cuya sintaxis, extraída de http://blog.desdelinux.net/uso-del-comando-dd/, es:

sudo dd if=origen of=destino

Metodología adecuada en los casos de excaso tiempo o de considerar que las particiones y el tamaño de disco son adecuados y que se quiere migrar todo tal como está. Esta migración basicamente se realiza entre dos servidores madre. Para migrar un servidor de esta forma, realizar los siguientes pasos.

  • Primero se debe enviar un comunicado a las usuarios implicados de un eminente corte de los servicios.
  • Luego se debe apagar el servidor a migrar para que los datos copiados sean consistentes, lo que bien puede hacerse a través de virt-manager o desde línea de comandos usando "virsh shutdown Guest".

Copia del disco a un archivo

A continuación, una posible solución sería hacer un dd a la partición entera y luego hacer una copia del archivo resultante a Barran de esta forma:

dd if=/dev/Schwartz/dolly-clone of=dolly-clone.iso bs=4M conv=sync,noerror

Copia directa al servidor distante

Sin embargo, esto puede ser simplificado añadiendo el upload directo del archivo. Investigando encontré una forma de combinar dd y ssh para clonar discos en esta página: http://www.fortytwo.es/web/items/250/548/copiar-particiones-de-forma-segura-usando-ssh-y-dd-en-linux. A continuación se describe como aplicar esto.

  • Dentro del servidor madre de destino, creamos un nuevo volúmen lvm para el almacenamiento que tendrá el servidor, con un tamaño mayor o igual al utilizado actualmente:
sudo lvcreate -L<tamaño> -n<nom_srvhijo> <nom_servmadre>
Logical volume "nom_srvhijo" created

Debe aparecer el mensaje anterior de creación exitosa.

  • En el servidor madre origen se debe generar una clave pública/privada para nuestro usuario y subirla para que sean reconocidas estas credenciales por el servidor madre destino. Luego además debemos habilitar que podamos entrar como root en el destino para que al ejecutar un comando con sudo evitemos el ingreso de claves dos veces (la solicitud de claves se solapa y fallan las autentificaciones).

Desde el origen:

ssh-keygen -b 8196
ssh-copy-id <yo>@<srv_destino>.csic.edu.uy

Desde el destino habilitamos el acceso sudo

echo -e  "\n## Clave para entrar como root desde <srv_origen> con el usuario <yo>\n" >> /root/.ssh/authorized_keys 
cat /home/<yo>/.ssh/authorized_keys | grep <yo>@<srv_origen> >> /root/.ssh/authorized_keys

  • Realizamos la clonación entre servidores desde el origen:
sudo dd if=/dev/<srvmadre_origen>/<servidor> | ssh root@<srvmadre_destino>.csic.edu.uy "dd of=/dev/<srvmadre_destino>/<servidor>" 
62914560+0 registros leídos
62914560+0 registros escritos
32212254720 bytes (32 GB) copiados, 1747,35 s, 18,4 MB/s
62914560+0 registros leídos
62914560+0 registros escritos
32212254720 bytes (32 GB) copiados, 1924,85 s, 16,7 MB/s

Este mensaje indica que finalmente se copió!

Tener en cuenta que al hacer un dd, el archivo resultante tendrá el tamaño total de la partición sin importar cuanto tenga ocupado, por lo que estaría bueno buscar alguna otra forma de hacerlo para ocupar menos espacio y además ahorrar tiempo al proceso.

FIXME: Se podría probar si esta modificación acelera la copia: dd if=/dev/hipatia-r5/ritchie | gzip -c | ssh "gzip -d | dd of=/dev/barran/ritchie"
Lo que hace es comprimir los datos antes de transmitirlos al otro servidor y volver a descomprimirlos cuando se reciben.

  • Luego copiamos al destino el archivo de configuración de la máquina virtual: /etc/libvirt/qemu/<servidor>.xml
sudo scp /etc/libvirt/qemu/<servidor>.xml <yo>@<srv_destino>.csic.edu.uy:/etc/libvirt/qemu/<servidor>.xml
  • Cargar la máquina en libvirt del servidor destino:

Primero hay que editar el archivo .xml para cambiar el dispositivo correspondiente a la vm (ej: cambiar /dev/hipatia-r5/ritchie por /dev/barran/ritchie) luego ejecutar los siguientes comandos.

virsh define /etc/libvirt/qemu/<servidor>.xml
virsh create /etc/libvirt/qemu/<servidor>.xml
  • Otra forma de cargar la vm es es usar virt-install, pero no se estaría utilizando el xml de la configuración original:
virt-install --connect qemu:///system --ram <tamaño> -n <servidor> --disk path=/dev/<srv_madre>/<servidor> --vnc --noautoconsole --import --force
  • Hay que asegurar la correcta configuración de red del mismo, como por ejemplo, que tenga la máscara /26.

Es necesario habilitar la ip del servidor en los firewalls, por lo que un responsable de la plataforma, debe de configurar las reglas de fwbuilder correspendientes a permitir pasar los paquetes hacia el servidor migrado a través de su servidor madre y debe revisar que este todo aplicado lo referente al Aprovisionamiento de un servidor virtual.

  • Después de esto, ya podemos reiniciar la máquina virtual en el nuevo servidor y queda funcionando.

Método utilizado en: #2677

Problemas comunes al finalizar

Verificar a través de virt-manager la configuración: puede ser necesario la re-configuración de la tarjeta de red y el disco. Si no funciona la tarjeta de red hay que borrarla y agregar una nueva.

Por problemas de red, dentro de la máquina virtual tuve también que borrar el contenido del archivo: /etc/udev/rules.d/70-persistent-net.rules