Cómo configurar copias de seguridad de tus Máquinas Virtuales" class="internal-post-link">máquinas virtuales utilizando LVM snapshots

La copia de seguridad de máquinas virtuales es una tarea crítica para cualquier administrador, asegurando la posibilidad de restaurar datos en caso de fallos, errores o ataques. Existen muchas formas de hacer copias de seguridad, y en este artículo examinaremos en detalle la configuración de copias de seguridad de máquinas virtuales (VM) utilizando instantáneas de Logical Volume Management (LVM). Repasaremos todos los pasos, desde la preparación de LVM, la creación de instantáneas hasta la ejecución de las copias de seguridad y la restauración de las VM. Aprenderá a utilizar LVM snapshots para crear copias de seguridad consistentes de máquinas virtuales en ejecución, minimizando el tiempo de inactividad y garantizando la integridad de los datos.

En este artículo, nos centraremos en una técnica muy importante: LVM snapshots. Analizaremos cómo funcionan, sus ventajas y desventajas, y proporcionaremos instrucciones detalladas sobre cómo configurar copias de seguridad de VM utilizando este método. Este método es especialmente útil para las máquinas virtuales almacenadas en volúmenes LVM, ya que permite crear copias de seguridad casi instantáneamente, minimizando el tiempo de bloqueo de la VM para una copia de datos consistente.

Contenido

Configuración de LVM para máquinas virtuales

¿Cómo configurar copias de seguridad de máquinas virtuales? - Instalación y configuración de LVM en el servidor. Mostrar ejemplo de creación de volume group y logical volume para máquinas virtuales.
Antes de comenzar con la copia de seguridad utilizando LVM snapshots, debe asegurarse de que sus máquinas virtuales estén almacenadas en volúmenes lógicos (logical volumes). Si aún no está utilizando LVM, deberá configurarlo. LVM proporciona una forma flexible de administrar el espacio en disco, lo que facilita cambiar el tamaño de los volúmenes, crear instantáneas y realizar otras operaciones.

Comprobación de la presencia de LVM

Primero, asegúrese de que el paquete LVM esté instalado. En la mayoría de las distribuciones de Linux, esto se puede hacer con el administrador de paquetes. Por ejemplo, en Debian/Ubuntu:
VPS Hosting

Servidores virtuales con recursos garantizados

Elegir VPS

sudo apt update
sudo apt install lvm2
En CentOS/RHEL:

sudo yum update
sudo yum install lvm2
Después de la instalación, compruebe que LVM está funcionando con el siguiente comando:

sudo systemctl status lvm2-lvmetad.service
El resultado esperado es: active (running).

Creación de Physical Volumes, Volume Groups y Logical Volumes

Si tiene discos libres, puede utilizarlos para crear Physical Volumes (PV), luego combinarlos en un Volume Group (VG) y, finalmente, crear Logical Volumes (LV) para almacenar los datos de las máquinas virtuales.

1. Creación de Physical Volumes:

sudo pvcreate /dev/sdb /dev/sdc
Aquí, `/dev/sdb` y `/dev/sdc` son sus discos libres. Asegúrese de utilizar los nombres de disco correctos.

2. Creación de Volume Group:

sudo vgcreate vm_vg /dev/sdb /dev/sdc
`vm_vg` es el nombre de su Volume Group. Puede elegir cualquier otro nombre.

3. Creación de Logical Volumes:

sudo lvcreate -L 100G -n vm1_lv vm_vg
sudo lvcreate -L 50G -n vm2_lv vm_vg
Aquí creamos dos Logical Volumes: `vm1_lv` de 100 GB y `vm2_lv` de 50 GB en el Volume Group `vm_vg`. Los tamaños y los nombres deben cambiarse para que coincidan con las necesidades de sus VM.

4. Formateo de Logical Volumes:

sudo mkfs.ext4 /dev/vm_vg/vm1_lv
sudo mkfs.ext4 /dev/vm_vg/vm2_lv
5. Montaje de Logical Volumes:

sudo mkdir /vm1
sudo mkdir /vm2
sudo mount /dev/vm_vg/vm1_lv /vm1
sudo mount /dev/vm_vg/vm2_lv /vm2
Ahora puede usar `/vm1` y `/vm2` para almacenar imágenes de disco de sus máquinas virtuales. Es importante configurar el montaje permanente de estos volúmenes agregándolos a `/etc/fstab`.

Ejemplo de contenido de /etc/fstab:

/dev/vm_vg/vm1_lv /vm1 ext4 defaults 0 0
/dev/vm_vg/vm2_lv /vm2 ext4 defaults 0 0
Después de editar `/etc/fstab`, ejecute `sudo mount -a` para aplicar los cambios.

Migración de VM existentes a LVM (si es necesario)

Si sus máquinas virtuales ya existen y no están almacenadas en LVM, deberá migrarlas. Esto se puede hacer copiando las imágenes de disco a los nuevos Logical Volumes. Supongamos que las imágenes de disco están en `/var/lib/libvirt/images/`:

sudo virsh shutdown vm1
sudo cp /var/lib/libvirt/images/vm1.qcow2 /vm1/
sudo virsh define /etc/libvirt/qemu/vm1.xml
sudo virsh start vm1
También puede que necesite modificar el archivo de configuración de la VM (`/etc/libvirt/qemu/vm1.xml`) para especificar la nueva ruta a la imagen de disco. Encuentre la línea que contiene la ruta a la imagen de disco y cámbiela.

Por ejemplo, cambie:

<source file='/var/lib/libvirt/images/vm1.qcow2' .../>
A:

<source file='/vm1/vm1.qcow2' .../>
Importante: Antes de realizar cualquier operación con los discos, haga una copia de seguridad de los datos importantes. Los errores pueden provocar la pérdida de datos.

Consejo de experto: Al planificar LVM, asigne suficiente espacio libre en el Volume Group para futuras snapshots. El tamaño de la snapshot debe ser suficiente para almacenar los cambios realizados en el volumen original durante la copia de seguridad.

Creación de LVM snapshots para copias de seguridad

¿Cómo configurar copias de seguridad de máquinas virtuales? - Mostrar ejemplo de creación de snapshot utilizando lvcreate, y explicar cómo snapshot rastrea los cambios.
Una vez que LVM esté configurado, puede pasar a crear LVM snapshots. Los snapshots son «instantáneas» del estado de un volumen lógico en un momento determinado. Se crean muy rápidamente y utilizan una cantidad mínima de espacio en disco, ya que solo almacenan los cambios realizados después de la creación del snapshot.

Creación de Snapshot

Para crear un snapshot, se utiliza el comando `lvcreate` con la opción `-s` (snapshot). Debe especificar el nombre del snapshot, el volumen lógico original y el tamaño asignado para almacenar los cambios.

sudo lvcreate -s -L 20G -n vm1_snap /dev/vm_vg/vm1_lv
Aquí creamos un snapshot llamado `vm1_snap` para el volumen lógico `vm1_lv`. El tamaño del snapshot es de 20 GB. Este tamaño debería ser suficiente para almacenar los cambios realizados en `vm1_lv` durante la copia de seguridad. El tamaño del snapshot depende de la intensidad de la escritura en el disco de la máquina virtual. Si no está seguro, es mejor asignar más espacio que menos.

Consistencia de datos

Para garantizar la consistencia de los datos, antes de crear el snapshot se recomienda suspender la máquina virtual o al menos realizar una operación «fsync» para descargar los datos de la caché al disco. Esto minimiza el riesgo de pérdida de datos o corrupción de archivos.

Ejemplo utilizando virsh:

sudo virsh snapshot-create vm1
Este comando creará un snapshot interno de la VM. Luego:

sudo virsh shutdown vm1
sudo lvcreate -s -L 20G -n vm1_snap /dev/vm_vg/vm1_lv
sudo virsh start vm1
Luego, elimine el snapshot interno de la VM:

sudo virsh snapshot-delete vm1 1
Enfoque alternativo (fsync):

Si la suspensión de la VM no es deseable, puede utilizar el comando `fsync` para descargar los datos al disco. Sin embargo, esto no garantiza una consistencia total, especialmente si la VM está realizando transacciones activamente.

sudo virsh domfsfreeze vm1
sudo lvcreate -s -L 20G -n vm1_snap /dev/vm_vg/vm1_lv
sudo virsh domfsthaw vm1
`domfsfreeze` congela el sistema de archivos dentro de la VM, y `domfsthaw` lo descongela. Estos comandos requieren que el agente invitado esté instalado y funcionando dentro de la VM.

Montaje de Snapshot

Después de crear el snapshot, se puede montar como un volumen lógico normal para hacer una copia de seguridad de los datos.

sudo mkdir /mnt/vm1_snap
sudo mount /dev/vm_vg/vm1_snap /mnt/vm1_snap
Ahora puede acceder a los datos del snapshot como si fuera el volumen lógico original en el momento de la creación del snapshot. Importante: El snapshot se monta en modo de sólo lectura para evitar la corrupción de los datos.

Eliminación de Snapshot

Una vez finalizada la copia de seguridad, el snapshot debe eliminarse para liberar espacio en disco.

sudo umount /mnt/vm1_snap
sudo lvremove /dev/vm_vg/vm1_snap
Antes de eliminar el snapshot, asegúrese de que esté desmontado. Si no se asigna suficiente espacio al snapshot, puede llenarse, lo que provocaría su corrupción y, posiblemente, la corrupción del volumen lógico original. Supervise el uso del espacio en disco del snapshot con el comando `lvs`.

Ejemplo:

sudo lvs
En la salida del comando, preste atención a la columna «Data%». Muestra el porcentaje de uso del espacio del snapshot. Si se acerca al 100%, debe aumentar el tamaño del snapshot o realizar una copia de seguridad y eliminar el snapshot.

Ejemplo de script para crear un snapshot y una copia de seguridad:

#!/bin/bash

VM_NAME="vm1"
LV_NAME="/dev/vm_vg/vm1_lv"
SNAP_NAME="/dev/vm_vg/${VM_NAME}_snap"
SNAP_SIZE="20G"
MOUNT_POINT="/mnt/${VM_NAME}_snap"
BACKUP_DIR="/backup"

# Detenemos la VM
sudo virsh shutdown $VM_NAME

# Creamos snapshot
sudo lvcreate -s -L $SNAP_SIZE -n ${VM_NAME}_snap $LV_NAME

# Iniciamos la VM
sudo virsh start $VM_NAME

# Montamos el snapshot
sudo mkdir -p $MOUNT_POINT
sudo mount $SNAP_NAME $MOUNT_POINT -o ro

# Realizamos la copia de seguridad
sudo tar -czvf $BACKUP_DIR/${VM_NAME}_$(date +%Y%m%d).tar.gz -C $MOUNT_POINT .

# Desmontamos el snapshot
sudo umount $MOUNT_POINT

# Eliminamos el snapshot
sudo lvremove -f $SNAP_NAME

echo "Copia de seguridad de $VM_NAME completada."
Este script detiene la máquina virtual, crea un snapshot, inicia la máquina virtual, monta el snapshot, realiza una copia de seguridad utilizando `tar`, desmonta el snapshot y lo elimina. Edite las variables al principio del script para que coincidan con su configuración. Haga que el script sea ejecutable con `chmod +x script.sh`. No olvide probar el script antes de usarlo en producción.

Copia de seguridad de LVM snapshots

Después de crear y montar el LVM snapshot, debe realizar una copia de seguridad de los datos. Existen varios métodos de copia de seguridad, cada uno con sus ventajas y desventajas. La elección del método depende de sus requisitos de velocidad, eficiencia y recursos disponibles.

Copia de seguridad utilizando tar

`tar` es una utilidad estándar para archivar archivos. Es fácil de usar y le permite crear archivos comprimidos.

sudo tar -czvf /backup/vm1_backup.tar.gz -C /mnt/vm1_snap .
Este comando crea un archivo `vm1_backup.tar.gz` en el directorio `/backup`, que contiene todos los archivos del snapshot montado (`/mnt/vm1_snap`). La opción `-c` indica la creación del archivo, `-z` incluye la compresión gzip, `-v` (verbose) muestra la lista de archivos que se van a archivar y `-f` especifica el nombre del archivo. La opción `-C` permite cambiar el directorio antes de agregar archivos al archivo.

Ventajas: Facilidad de uso, amplia disponibilidad.

Desventajas: Copia de seguridad completa cada vez, funcionamiento lento con grandes volúmenes de datos.

Copia de seguridad utilizando rsync

`rsync` es una utilidad para sincronizar archivos y directorios. Le permite realizar copias de seguridad incrementales, copiando solo los archivos modificados.

sudo rsync -avz /mnt/vm1_snap/ /backup/vm1_backup/
Este comando sincroniza el contenido de `/mnt/vm1_snap` con el directorio `/backup/vm1_backup/`. La opción `-a` (archive) conserva todos los atributos de los archivos, `-v` (verbose) muestra la lista de archivos transferidos y `-z` incluye la compresión. Cuando se vuelve a ejecutar, `rsync` solo copiará los archivos modificados, lo que acelera significativamente el proceso de copia de seguridad.

Ventajas: Copia de seguridad incremental, transferencia de datos eficiente.

Desventajas: Requiere la instalación de `rsync`, un poco más difícil de configurar que `tar`.

Copia de seguridad utilizando dd

`dd` es una utilidad para copiar y convertir datos. Le permite copiar todo el volumen lógico por completo.

sudo dd if=/dev/vm_vg/vm1_snap of=/backup/vm1_backup.img bs=4M conv=sync,noerror
Este comando copia el contenido de `/dev/vm_vg/vm1_snap` al archivo `/backup/vm1_backup.img`. `if` especifica el archivo de entrada, `of` el archivo de salida, `bs` establece el tamaño del bloque (4 MB para acelerar el proceso) y `conv=sync,noerror` maneja los errores de lectura llenándolos con ceros.

Ventajas: Facilidad para copiar todo el volumen, posibilidad de crear una copia exacta.

Desventajas: Copia de seguridad completa cada vez, funcionamiento lento, gran tamaño del archivo resultante. No recomendado para grandes volúmenes lógicos.

Comparación de métodos de copia de seguridad

MétodoVentajasDesventajas
tarFácil de usar, ampliamente disponibleCopia de seguridad completa, lento
rsyncCopia de seguridad incremental, eficienteRequiere instalación, más difícil de configurar
ddCopia fácil de todo el volumen, copia exactaCopia de seguridad completa, lento, gran tamaño
Recomendación: En la mayoría de los casos, se recomienda utilizar `rsync` debido a su eficiencia y capacidad de copia de seguridad incremental. `tar` es adecuado para VM pequeñas o para crear copias de seguridad completas una vez por semana/mes. `dd` solo debe usarse en casos especiales cuando se requiere una copia exacta de todo el volumen.

Consejos adicionales:

  • Automatice el proceso de copia de seguridad con cron.
  • Verifique la integridad de las copias de seguridad después de la creación.
  • Almacene las copias de seguridad en varios lugares, incluido el almacenamiento remoto.
  • Pruebe periódicamente el proceso de restauración desde las copias de seguridad.

Restauración de una máquina virtual desde una copia de seguridad

Después de crear las copias de seguridad, debe saber cómo restaurar las máquinas virtuales desde estas copias de seguridad. El proceso de restauración depende del método utilizado para la copia de seguridad.

Restauración desde una copia de seguridad tar

Si utilizó `tar` para crear la copia de seguridad, la restauración se realiza con el comando `tar`.

sudo tar -xzvf /backup/vm1_backup.tar.gz -C /new_location/
Este comando descomprime el archivo `/backup/vm1_backup.tar.gz` en el directorio `/new_location/`. La opción `-x` indica la descompresión, `-z` incluye la descompresión gzip, `-v` muestra la lista de archivos que se van a descomprimir y `-f` especifica el nombre del archivo. Antes de la restauración, asegúrese de que el directorio `/new_location/` existe y tiene suficiente espacio. Detenga la máquina virtual antes de la restauración.

Después de descomprimir el archivo, es posible que deba modificar el archivo de configuración de la VM (`/etc/libvirt/qemu/vm1.xml`) para especificar la nueva ruta a la imagen de disco.

Restauración desde una copia de seguridad rsync

Si utilizó `rsync` para crear la copia de seguridad, la restauración se realiza con el comando `rsync`.

sudo rsync -avz /backup/vm1_backup/ /new_location/
Este comando sincroniza el contenido de `/backup/vm1_backup/` con el directorio `/new_location/`. La opción `-a` (archive) conserva todos los atributos de los archivos, `-v` (verbose) muestra la lista de archivos transferidos y `-z` incluye la compresión. Antes de la restauración, asegúrese de que el directorio `/new_location/` existe y tiene suficiente espacio. Detenga la máquina virtual antes de la restauración.

Después de sincronizar los archivos, es posible que deba modificar el archivo de configuración de la VM (`/etc/libvirt/qemu/vm1.xml`) para especificar la nueva ruta a la imagen de disco.

Restauración desde una copia de seguridad dd

Si utilizó `dd` para crear la copia de seguridad, la restauración se realiza con el comando `dd`.

sudo dd if=/backup/vm1_backup.img of=/dev/vm_vg/vm1_lv bs=4M conv=sync,noerror
Este comando copia el contenido del archivo `/backup/vm1_backup.img` al volumen lógico `/dev/vm_vg/vm1_lv`. `if` especifica el archivo de entrada, `of` el archivo de salida, `bs` establece el tamaño del bloque (4 MB para acelerar el proceso) y `conv=sync,noerror` maneja los errores de lectura llenándolos con ceros. Atención: Este comando sobrescribirá el contenido del volumen lógico `/dev/vm_vg/vm1_lv`. Asegúrese de que está especificando el volumen lógico correcto. Detenga la máquina virtual antes de la restauración.

Después de restaurar los datos, inicie la máquina virtual.

Prueba de restauración

Después de restaurar la máquina virtual, asegúrese de probar su funcionalidad. Verifique que todas las aplicaciones funcionen correctamente y que los datos estén disponibles. Esto es fundamental para garantizar la fiabilidad del proceso de restauración.

Ejemplo de script para restaurar desde una copia de seguridad tar:

#!/bin/bash

VM_NAME="vm1"
LV_NAME="/dev/vm_vg/vm1_lv"
BACKUP_FILE="/backup/${VM_NAME}_backup.tar.gz"
NEW_LOCATION="/new_location"

# Detenemos la VM
sudo virsh shutdown $VM_NAME

# Descomprimimos el archivo
sudo mkdir -p $NEW_LOCATION
sudo tar -xzvf $BACKUP_FILE -C $NEW_LOCATION

# Modificamos el archivo de configuración de la VM (ejemplo)
sudo sed -i "s/\/old_path\/${VM_NAME}.qcow2/\/new_location\/${VM_NAME}.qcow2/g" /etc/libvirt/qemu/${VM_NAME}.xml

# Iniciamos la VM
sudo virsh start $VM_NAME

echo "Restauración de $VM_NAME completada."
Este script detiene la máquina virtual, descomprime el archivo en un nuevo directorio, modifica el archivo de configuración de la VM (reemplaza la ruta antigua a la imagen de disco con la nueva) e inicia la máquina virtual. Edite las variables al principio del script para que coincidan con su configuración. Haga que el script sea ejecutable con `chmod +x script.sh`.

Importante: Siempre verifique las copias de seguridad y el proceso de restauración. No confíe en las copias de seguridad que nunca se han verificado.

Recomendaciones y optimización

Para garantizar un sistema fiable de copias de seguridad de máquinas virtuales utilizando LVM snapshots, debe seguir una serie de recomendaciones y optimizar el proceso.

Monitorización

La monitorización regular del estado de LVM, snapshots y espacio en disco es una parte importante del proceso de copia de seguridad. Debe controlar el uso del espacio en disco, el estado de los snapshots y el rendimiento del sistema.

Ejemplos de comandos para la monitorización:

sudo lvs # Muestra información sobre volúmenes lógicos y snapshots
sudo vgs # Muestra información sobre volume groups
sudo pvs # Muestra información sobre physical volumes
df -h # Muestra el uso del espacio en disco
iostat -x 1 # Muestra las estadísticas de entrada/salida del disco
Configure alertas si el uso del espacio en disco se acerca a un nivel crítico o si un snapshot se está llenando.

Automatización

Automatice el proceso de creación de copias de seguridad, eliminación de snapshots y rotación de copias de seguridad con cron. Esto evitará errores humanos y garantizará la ejecución regular de las copias de seguridad.

Ejemplo de cron job:

0 2 * * * /path/to/backup_script.sh
Esta entrada en cron ejecuta el script `backup_script.sh` todos los días a las 2 de la madrugada. Asegúrese de que el script tenga los permisos de acceso necesarios y funcione correctamente.

Rotación de copias de seguridad

Configure la rotación de copias de seguridad para evitar el desbordamiento del espacio en disco. Defina una política de retención de copias de seguridad (por ejemplo, almacenar copias de seguridad diarias de la última semana, semanales del último mes y mensuales del último año).

Ejemplo de script para la rotación de copias de seguridad: