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)
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).
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