Copias de seguridad de máquinas kvm

Intro

El procedimiento descrito en este tutorial funciona para copias de seguridad de VMs creadas con HDDs como volúmenes lvm. No sirve para los HDDs creados como archivos de imagen. Para eso recomiendo consultar el siguiente artículo.

En el caaso de tener los HDDs de las VMs como lvm podemos crear snapshot de los mismos y realizar la copia de seguridad de éstos. De ese modo las copias de seguridad se realizarían en caliente.

Sistema base

El sistema base empleado en un CentOS 7, disco duro de 3TB y 7GB de RAM

El SO está montado en una partición / de 100GB y otra swap de 8GB. El resto del HDD se deja sin particionar durante la instalación del sistema. Una vez instalado éste y funcionando se crea una partición (/dev/sda4) de tipo Linux LVM (8E00) con gdisk y se crea un VG llamado virtual_vg sobre esta partición.

Podemos ver como quedan los VGs:

[root@cectnode1 isos]# vgs
VG         #PV #LV #SN Attr   VSize   VFree
centos       1   2   0 wz--n- 128,91g    0
virtual_vg   1   7   1 wz--n-   2,60t 1,98t

El VG virtual_vg contendrá los volúmenes de los HDDs de las máquinas virtuales.

En virt-manager añadimos un ‘grupo de almacenamiento‘ de tipo ‘logical: Grupo de Volumen LVM‘ al que llamaremos virtual_vg (Fig. 1)

captura de pantalla 2015-05-14 a las 10.21w
Fig. 1

 

En este grupo de almacenamiento pondremos los HDDs de nuestras VMs. El propio virt-manager se encarga de crear los lvm necesarios. He comprobado que con este sistema es posible añadir HDDs a las VMs ‘en caliente’, sin tener que parar la máquina virtual.

En el siguiente enlace se explica con detalle como crear las VMs empleando este sistema.

 

Creando copias de seguridad

Para crear copias de seguridad crearemos un snapshot del/los HDD/s del sistema a incluir en la copia de seguridad. Supongamos que queremos copiar la máquina virtual CentOS7samba. Su HDD es el volumen CentOSsamba (Fig. 2).

Fig. 2
Fig. 2

 

Para ello crearíamos un snapshot de la lvm /dev/virtual_vg/CentOS7samba con la siguiente instrucción:

[root@cectnode1 ~]# lvcreate -L1G -s -n /dev/virtual_vg/CentOS7samba-20150514 /dev/virtual_vg/CentOS7samba
Logical volume "CentOS7samba-20150514" created.

De manera que nuestro listado de lvs en virtual_vg sería:

[root@cectnode1 ~]# lvs virtual_vg
LV                    VG         Attr       LSize   Pool Origin              Data%  Meta%  Move Log Cpy%Sync Convert
CentOS7samba          virtual_vg owi-aos---  10,00g
CentOS7samba-20150514 virtual_vg swi-a-s---   1,00g      CentOS7samba        0,00
FreeNAS10             virtual_vg swi-a-s---   8,00g      [FreeNAS10_vorigin] 29,15
KNOPPIXTMP            virtual_vg -wi-a-----   8,00g
Proxmox3.4_HDD        virtual_vg -wi-ao---- 250,00g
TOTEST                virtual_vg -wi-a-----   8,00g
temp_lv               virtual_vg -wi-ao---- 300,00g
virtual_isos          virtual_vg -wi-ao----  50,00g

El siguiente paso sería copiar este snapshot (CentOS7samba_20150514) a una imagen de disco, lo que haríamos con la siguiente instrucción:

[root@cectnode1 ~]# dd if=/dev/virtual_vg/CentOS7samba-20150514 of=CentOS7samba-20150514.img bs=512K

Como el sistema no ofrece nungún tipo de información mientras realiza la copia, podemos forzar la salida de ésta añadiendo:

& pid=$!;  sleep 1; while [[ -d /proc/$pid ]]; do kill -USR1 $pid && sleep 1; done

Con lo que quedaría:
[root@cectnode1 ~]# dd if=/dev/virtual_vg/CentOS7samba-20150514 of=CentOS7samba-20150514.img bs=512K& pid=$!;  sleep 1; while [[ -d /proc/$pid ]]; do kill -USR1 $pid && sleep 1; done
Y el resultado sería algo así:

[root@cectnode1 ~]# dd if=/dev/virtual_vg/CentOS7samba-20150514 of=CentOS7samba-20150514.img bs=512K& pid=$!;  sleep 1; while [[ -d /proc/$pid ]]; do kill -USR1 $pid && sleep 1; done
[2] 32268
263+0 registros leídos
262+0 registros escritos
137363456 bytes (137 MB) copiados, 0,986745 s, 139 MB/s
549+0 registros leídos
548+0 registros escritos
287309824 bytes (287 MB) copiados, 1,98821 s, 145 MB/s
828+0 registros leídos
827+0 registros escritos
433586176 bytes (434 MB) copiados, 2,99202 s, 145 MB/s
1102+0 registros leídos
1101+0 registros escritos

Si queremos exportar la configuración de la máquina virtual a un xml tendríamos que ejecutar:
virsh dumpxml CentOS7samba > CentOS7samba.xml
Ahora podríamos combinar el archivo de imagen del HDD y la configuración de la máquina en un solo archivo bz2 con:

tar -cvjf CentOS7samba-20150514.tar.bz2 CentOS7samba.xml CentOS7samba-20150514.img --remove-files

Se podría poner todo junto en una única línea:

[root@cectnode1 NFS]# virsh dumpxml CentOS7samba > /home/NFS/CentOS7samba.xml && dd if=/dev/virtual_vg/CentOS7samba-20150514 of=/home/NFS/CentOS7samba-20150514.img bs=512K && tar -cvjf /home/NFS/CentOS7samba-20150514.tar.bz2 /home/NFS/CentOS7samba.xml /home/NFS/CentOS7samba-20150514.img --remove-files

 

Recogiendo la casa

Una vez finalizada la copia de seguridad habría que eliminar el snapshot creado para evitar consimir recursos del sistema:

[root@cectnode1 NFS]# lvremove /dev/virtual_vg/CentOS7samba-20150514

Resultado:

[root@cectnode1 NFS]# lvremove /dev/virtual_vg/CentOS7samba-20150514
Do you really want to remove active logical volume CentOS7samba-20150514? [y/n]: y
Logical volume "CentOS7samba-20150514" successfully removed

Enlaces

Sobre la copia de las VMs