Cómo clonar máquinas virtuales KVM

Valoración del Usuario:  / 2
MaloBueno 

Este artículo explica de forma detallada cómo clonar una máquina virtual KVM.



Cómo todos sabemos, una máquina virtual está compuesta por una imagen de disco y una descripción del hardware virtual. En GNU/Linux, la imagen de disco suele ser comunmente un archivo *.img o un volúmen lógico LVM. La teconogía KVM utiliza archivos XML para describir el hardware de las máquinas virtuales, estos archivos describen la tecnología de procesador, cantidad de memoria RAM, disco, interfaces de red, etc. que componen la máquina virtual. Se encuentran en el directorio /etc/libvirt/qemu/ bajo el nombre del dominio al que pertenecen (por ejemplo, la configuración de hardware virtual del dominio "servidor1" se encuentra en el archivo /etl/libvirt/qemu/servidor1.xml).

Ya sea el disco que utilice la máquina virtual un archivo *.img o un volúmen LVM, la máquina puede clonarse estando encendida. De ser posible es conveniente apagar o suspender la máquina virtual, antes de clonar el disco, para favorecer la consistencia de los archivos.

Para suspender una máquina virtual (por ejemplo "servidor1") ejecutar:

virsh suspend servidor1

Una vez suspendida es posible "clonar" o duplicar el disco. Si se trata de un archivo *.img simplemente se debe copiar el archivo de imagen (suponiendo que la máquina clonada tendrá el nombre "servidor2"):

cp /var/lib/libvirt/images/servidor1.img /var/lib/libvirt/images/servidor2.img

Si el disco es un volúmen lógico LVM, se debe crear un volúmen del mismo tamaño y luego copiar el contenido. Suponiendo que "lv_servidor1" es el volúmen lógico de la máquina virtual a clonar (cuyo tamaño es de 10 GBytes) y "vg_KVM" es el nombre del grupo LVM que contiene los volúmenes de las máquinas virtuales:

lvcreate -L10G -n lv_servidor2 vg_KVM
dd if=/dev/vg_KVM/lv_servidor1 of=/dev/vg_KVM/lv_servidor1 bs=4096 conv=sync,noerror

Al finalizar la copia es posible reanudar la máquina suspendida:

virsh resume servidor1

También es posible apagar el Sistema Operativo guest (virsh shutdown servidor1) y luego encender (virsh start servidor1) la máquina virtual, en lugar de suspender y reanudar.

La mejor alternativa para realizar el proceso de clonado de la imagen de disco virtual (sea archivo o volúmen LVM), consiste en apagar el sistema operativo del guest y luego encender la máquina virtual (en vez de suspender y reanudar), para que los archivos dentro del disco a clonar queden en un estado consistente.

Si la máquina virtual está funcionando en un entorno de producción, muy probablemente no sea posible suspenderla o apagarla, y la única alternativa sea clonarla "en vivo". Cuando se clona una máquina encendida, los archivos abiertos pueden estar en un estado inconsistente debido a que parte de su contenido puede estar alojado en buffers de escritura de disco en memoria RAM. Un ejemplo claro son los archivos de bases de datos. Es un riesgo que debemos asumir para clonar una máquina virtual que no puede ser apagada por razones operativas. Para el caso de los archivos de bases de datos, lo que se hace siempre es restaurar las bases de datos a partir de backups o dumps SQL luego de clonar la máquina virtual, para que las bases de datos sean consistentes. Esta técnica se puede aplicar para cualquier otro tipo de archivos, si la consistencia no está garantizada es conveniente recuperarlos desde un backup luego de clonar la máquina virtual.

La posibilidad de clonar máquinas virtuales "en vivo" se debe gracias a la capacidad de hacer "snapshots" (o instantáneas) de los discos. Actualmente tanto los volúmenes lógicos LVM (es una característica nativa) como los discos qcow2 (gracias a la herramienta qemu-img) permiten realizar snapshots de discos.

Las snapshots utilizan una técnica llamada CoW (Copy on Write). En el momento en que se crea la instantánea no se copia ningún bloque, por lo tanto su tamaño lógico incial es cero. Los bloques se copian a la instantánea sólo antes de ser modificados por primera vez. Es decir, antes de que se modifique un bloque se copia el original a la instantánea (de aquí surge el nombre de ésta técnica). De esta forma la instantánea es un disco ralo que sólo posee los bloques que han sido modificados. Cuando se debe leer un bloque, si ha sido modificado desde el momento en que se creó la instantánea, se lee desde la misma; de lo contrario se lee desde el volúmen origen de la snapshot. Normalmente una snapshot ocupa sólo una proporción pequeña del tamaño del disco. Aunque si hay muchas escrituras en diferentes archivos y la snapshot se mantiene por un período prolongado de tiempo, puede llegar a crecer hasta llegar a tener un tamaño considerable. Además debe tenerse en cuenta que mantener una snapshot agrega una capa de complejidad al disco virtual y puede perjudicar la performance del mismo.

El procedimiento utilizando volúmenes lógicos LVM consiste en: crear una snapshot; crear el nuevo volúmen lógico; volcar el contenido de la snapshot del volúmen lógico origen al nuevo volúmen lógico destino; y finalmente eliminar la snapshot. En el momento de crear la snapshot (mediante el parámetro -s) se debe especificar el tamaño de la misma (-L). Para evitar problemas es conveniente utilizar una snapshot del mismo tamaño del volúmen (el peor caso, en el que se modifican todos los bloques en el lapso de tiempo que existe la snapshot). Si por cuestiones de espacio no es posible utilizar una snapshot del mismo tamaño del volúmen, es posible utilizar una cantidad menor. La cantidad de espacio necesaria depende del uso de la snapshot, por lo tanto no hay una receta para calcularla.

lvcreate -L10G -s -n lv_servidor1_snap /dev/vg_KVM/lv_servidor1
lvcreate -L10G -n lv_servidor2 vg_KVM
dd if=/dev/vg_KVM/lv_servidor1_snap of=/dev/vg_KVM/lv_servidor2 bs=4096 conv=noerror,sync
lvremove -f /dev/vg_KVM/lv_servidor1_snap

Si se utilizan archivos en formato RAW (*.img) no es posible clonar la máquina virtual "en vivo" y se debe clonar el disco luego de suspender o apagar la máquina virtual, al menos es necesario ejecutar un managedsave sobre la máquina virtual.

Los discos en formato qcow2 soportan la creación de snapshots ya que incorporan la tecnología "Copy on Write", de allí su nombre "QEMU Copy on Write". El procedimiento de clonado "en vivo" utilizando discos qcow2 es el siguiente:

  • Crear una snapshot qemu interna.
  • Convertir y exportar la snapshot a un nuevo archivo.
  • Eliminar la snapshot interna del disco origen.
cd /var/lib/libvirt/images/
qemu-img snapshot -c snap1 servidor1.qcow2
qemu-img convert -f qcow2 -O qcow2 -s snap1 servidor1.qcow2 servidor2.img 
qemu-img snapshot -d snap1 servidor1.qcow2 

Una vez clonado el disco, la parte más difícil y que más tiempo lleva ha sido terminada. Resta clonar la configuración de hardware virtual. Para ello simplemente se debe copiar el archivo XML con la descripción de la máquina virtual y hacer un par de modificaciones importantes: eliminar las direcciones de hardware (libvirt asigna nuevas direcciones de hardware cuando se define la máquina virtual) y renombrar la máquina virtual.

cp /etc/libvirt/qemu/servidor1.xml /tmp/servidor2.xml
sed -i /uuid/d /tmp/servidor2.xml
sed -i '/mac address/d' /tmp/servidor2.xml
sed -i s/servidor1/servidor2 /tmp/servidor2.xml

La última línea debería actualizar automáticamente la configuración de disco, aunque es recomendable revisar el archivo XML antes de definir e iniciar la nueva máquina virtual. Por otro lado, el disco podría tener un nombre diferente lo que implica que deba ser modificado de forma manual, para ello es necesario revisar la sección "<disk>":

    <disk type='file' device='disk'>
      <driver name='qemu' type='raw' cache='none'/>
      <source file='/dev/vg_KVM/lv_servidor1'/>
      <target dev='hda' bus='ide'/>
      <address type='drive' controller='0' bus='0' target='0' unit='0'/>
    </disk>

Antes de iniciar la máquina virtual clonada es deseable modificar ciertos parámetros del Sistema Operativo guest, como por ejemplo direcciones IP, hostname, configuración de servicios, etc. Para esto hay dos opciones: montar el disco en el host y modificar los archivos de configuración necesarios (por ejemplo cambiar direcciones IP y ejecutar grep -R servidor1 /etc para buscar las apariciones de "servidor1"); o iniciar el guest y hacer los cambios desde el mismo. La elección de una de estas opciones dependerá del tipo de Sistema Operativo guest, aunque es mucho más recomendable hacer los cambios antes de iniciar la máquina virtual para evitar tener hostnames o direcciones IP duplicadas. Si el disco virtual tiene varias particiones, el montado es más complicado, pero está explicado de forma detallada en este artículo.

Por otro lado, si se opta por modificar parámetros de configuración directamente desde el Sistema Operativo guest, una buena práctica es conectar las interfaces en una red aislada. De esta forma se evita cualquier conflicto.

Crear un archivo de configuración XML para la red aislada llamada "null" (reemplazar virbrx por virbr2, virbr3, etc.):

<network>
<name>null</name>
<bridge name="virbrx" />
</network>

Definir e inciar la red "null":

# virsh net-define /tmp/virbr3.xml
Network null defined from /tmp/virbr3.xml

# virsh net-start null
Network null started

# virsh net-list
Name                 State      Autostart     Persistent
--------------------------------------------------
default              active     yes           yes
NAT1                 active     yes           yes
null                 active     no            yes
VPN                  active     yes           yes

Luego cambiar a la red "null" las interfaces de red dentro del archivo de configuración XML del guest clonado:

    <interface type='network'>
      <mac address='11:22:33:44:55:66'/>
      <source network='null'/>
      <model type='virtio'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
    </interface>

Finalmente es posible definir e iniciar la nueva máquina virtual a partir del archivo XML modificado:

virsh define /tmp/servidor2.xml
virsh start servidor2
Conclusiones

Tal vez un artículo tan extenso hace parecer que el proceso de clonado de una máquina virtual KVM no es algo sencillo (o al menos no tan sencillo como en VMware). Pero debe tenerse en cuenta que se han contemplado diferentes procedimientos para cada alternativa. Al ajustar el procedimiento para un escenario en particular, se eliminan muchas de las cuestiones incorporadas en este artículo. Inclusive no debería ser muy difícil desarrollar un script para clonar máquinas virtuales de forma automática.

Referencias
qemu.org
libvirt.org
Kashyap Chamarthy
IT FROM ALL ANGLES



Suscribirse

    Registrate para recibir las novedades y artículos por correo electrónico.

Linuxito en G+