domingo, 18 de abril de 2021

Copia de Seguridad Incremental con RSync

El comando rsync se suele utilizar para mantener copias de archivos sincronizadas de forma local o remota. rsync minimiza los datos a transferir con un sistema que detecta las diferencias entre archivos y solo necesita hacer la copia de los datos cambiados en lugar del archivo completo. Además de esto tiene algunas opciones que permiten hacer copias de seguridad incrementales guardando las diferentes versiones de los archivos.

Para hacer la copia de un directorio solo debemos ejecutar rsync y pasarle como parámetros el directorio origen y el destino. Con el parámetro -r se le indica que haga la copia de forma recursiva del contenido del directorio.

# mkdir directorio1
# rsync -r directorio1 directorio2

Si escribimos un archivo en directorio1 y volvemos a hacer una copia recursiva se copiará el nuevo archivo creado. Para que se copie el contenido del directorio y no el propio directorio es necesario escribir el carácter "/" al final de su nombre. De lo contrario se copiaría directorio1 dentro de directorio2.

# echo "Prueba 1" > directorio1/archivo1.txt
# rsync -r directorio1/ directorio2

Si modificamos el archivo y volvemos a hacer la copia el archivo en directorio2 se actualizará con los cambios.

# echo "Prueba 2" > directorio1/archivo1.txt
# rsync -r directorio1/ directorio2
# cat directorio2/archivo1.txt 

Prueba 2

Para que cuando se elimine un archivo en directorio1 también se elimine en directorio2 es necesario añadir el parámetro --delete.

# rm directorio1/archivo1.txt
# rsync -r --delete directorio1/ directorio2
# ls -l directorio2/

total 0

Esto es lo básico para sincronizar dos directorios. Si queremos que antes de modificarse o eliminarse un archivo se guarde una copia debemos usar el parámetro -b. Además el parámetro --backup-dir permite indicar un directorio donde guardar las copias. Si la ruta es relativa este directorio se creará en el directorio de destino. Si queremos que se guarde en otro directorio debemos indicar una ruta completa. En el nombre del directorio podemos indicar la fecha y hora para saber cuando se hizo la copia.

De esta forma tendremos un directorio sincronizado y una serie de directorios con copias de los archivos antes de ser modificados o eliminados en el directorio sincronizado. Estos directorios los podemos agrupar en otro directorio que se crea automáticamente al indicarlo como destino, le podemos poner por ejemplo el nombre backup. Guardaremos el directorio a sincronizar con su nombre y no su contenido, para ello no hay que escribir el carácter "/" al final de su nombre. Se debe utilizar el parámetro -t para preservar la fecha y hora de modificación de los archivos y directorios.

# echo "Prueba 1" > directorio1/archivo1.txt
# rsync -r -t --delete directorio1 backup
# echo "Prueba 2" > directorio1/archivo1.txt
# rsync -r -t --delete -b --backup-dir backup-2021-04-15_12-20-10 directorio1 backup
# ls -l backup/

total 8
drwxr-xr-x 3 root root 4096 abr 15 12:20 backup-2021-04-15_12-20-10
drwxr-xr-x 2 root root 4096 abr 15 12:20 directorio1

Además de sincronizar directorios localmente podemos hacerlo remotamente a través de SSH.

# rsync -r -t --delete -b --backup-dir backup-2021-04-15_12-20-10 directorio1 user@192.168.1.10:/tmp/backup

Para poder ejecutar el comando desde un "script" podemos pasar la contraseña de SSH con el comando sshpass.

# sshpass -p "aaaaaa" rsync -r -t --delete -b --backup-dir backup-2021-04-15_12-20-10 directorio1 usuario@192.168.1.10:/tmp/backup

Con estas tecnologías ya tenemos las herramientas necesarias para crear un sistema de copias de seguridad incremental utilizando algunos archivos de configuración, "scripts" y servicios del sistema operativo de forma similar a lo explicado en el artículo Copia de Seguridad Incremental con Tar.

En el ordenador remoto debemos crear un directorio donde se podrán guardar las copias de seguridad de varios directorios.

# mkdir /var/incremental-backup
# ls -ld /var/incremental-backup

drwxr-xr-x 2 root root 4096 abr 15 13:14 /var/incremental-backup

Debemos crear un usuario remoto y otro local con los que hacer las copias de seguridad. Al usuario remoto le podemos llamar rsync-backup y al local rsync-client. Como contraseña de ejemplo para rsync-backup se utiliza "aaaaaa".

# adduser rsync-backup

Añadiendo el usuario `rsync-backup' ...
Añadiendo el nuevo grupo `rsync-backup' (1001) ...
Añadiendo el nuevo usuario `rsync-backup' (1001) con grupo `rsync-backup' ...
Creando el directorio personal `/home/rsync-backup' ...
Copiando los ficheros desde `/etc/skel' ...
Nueva contraseña: 
Vuelva a escribir la nueva contraseña: 
passwd: contraseña actualizada correctamente
Cambiando la información de usuario para rsync-backup
Introduzca el nuevo valor, o pulse INTRO para usar el valor predeterminado
	Nombre completo []: 
	Número de habitación []: 
	Teléfono del trabajo []: 
	Teléfono de casa []: 
	Otro []: 
¿Es correcta la información? [S/n] s

A continuación debemos darle permisos de escritura sobre el directorio de copias.

# chgrp rsync-backup /var/incremental-backup
# chmod g+w /var/incremental-backup
# ls -ld /var/incremental-backup

drwxrwxr-x 2 root rsync-backup 4096 abr 15 13:14 /var/incremental-backup

En el ordenador local necesitamos un directorio donde guardar los archivos de configuración, por ejemplo /etc/incremental-backup. El usuario local que va a hacer las copias de seguridad solo necesita permisos de lectura sobre este directorio y sus archivos.

En primer lugar crearemos un archivo de configuración con nombre incremental-backup.conf y las mismas variables que en el sistema de copias incrementales con tar.

DATETIME=`date +%F_%H-%M-%S`
DIRECTORIES=/etc/incremental-backup/directories.conf
INCREMENTAL_BACKUP_DIRECTORY=/var/incremental-backup

A estás variables habrá que añadirle las variables HOST, USER Y PASSWORD con la dirección del ordenador remoto y el usuario y contraseña del usuario remoto que escribe las copias de seguridad.

HOST=backup.cuadernoinformatica.com
USER=rsync-backup
PASSWORD=aaaaaa

En el sistema de copias incrementales con tar el archivo de la variable DIRECTORIES contiene en cada línea un directorio del que se quiere hacer copia precedido del nombre que se quiere dar al archivo de copia. Para el sistema con rsync el nombre del archivo de copia se utiliza para el nombre del directorio contenedor donde se guardan el directorio sincronizado y los directorios de copias de archivos.

data-users:/data/users
company-database:/var/database

Con la configuración preparada ya podemos hacer un "script" en /urs/local/bin que realice las copias de seguridad. Le podemos dar el nombre rsync-incremental-backup.sh para diferenciarlo del "script" usado con tar. El "script" será muy similar al usado con tar pero más sencillo ya que todas las copias son incrementales, no hay copias totales. Básicamente el "script" lee el archivo de directorios y por cada directorio ejecuta el comando rsync usando las variables del archivo de configuración incremental-backup.conf. Finalmente muestra un mensaje con fecha y hora indicando el directorio del que se ha hecho la copia.

#!/bin/bash

. /etc/incremental-backup/incremental-backup.conf

while IFS=":" read container directory
do
        backup_directory=$INCREMENTAL_BACKUP_DIRECTORY/$container

        sshpass -p "$PASSWORD" rsync -r -t --delete -b --backup-dir backup-$DATETIME  $directory  $USER@$HOST:$backup_directory

        echo "$DATETIME - RSYNC INCREMENTAL BACKUP: $container"

done < $DIRECTORIES

Desde el usuario local rsync-client debemos conectar con el ordenador remoto para que se añada su dirección y clave pública a la lista de servidores conocidos. No es necesario iniciar sesión, solo aceptar la clave.

# su rsync-client
$ ssh backup.cuadernoinformatica.com

The authenticity of host '192.168.1.36 (192.168.1.36)' can't be established.
ECDSA key fingerprint is SHA256:Yj+NhmpZOOdxiryiKA5r2VhfWl86iUoMn8MyT0Ubo1Q.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.1.36' (ECDSA) to the list of known hosts.

Ahora podemos ejecutar el "script" con el usuario rsync-client para realizar las copias de los archivos. Este usuario debe tener permisos de lectura sobre los archivos a copiar.

# su rsync-client -c rsync-incremental-backup.sh

2021-04-17_12-12-16 - RSYNC INCREMENTAL BACKUP: data-users
2021-04-17_12-12-16 - RSYNC INCREMENTAL BACKUP: company-database

En el ordenador remoto se habrán creado en el directorio de copias de seguridad los directorios data-users y company-database.

# ls -l /var/incremental-backup/

total 8
drwxr-xr-x 3 rsync-backup rsync-backup 4096 abr 17 12:12 company-database
drwxr-xr-x 3 rsync-backup rsync-backup 4096 abr 17 12:12 data-users

Una vez que tenemos todo preparado podemos utilizar los programas cron y logrotate para programar la ejecución del "script", guardar un registro de su actividad en un archivo "log" y archivar o eliminar los registros antiguos. Al igual que con el "script", el archivo de cron es más sencillo que el de tar ya que solo hay copias incrementales.

# Incremental Backup Tuesday - Saturday 04:00
0  4 * * 2-6 rsync-client /usr/local/bin/rsync-incremental-backup.sh >> /var/log/rsync-incremental-backup.log 2>&1

Para tener un sistema de copias de seguridad más versátil y completo se pueden mezclar características de tar y rsync. Por ejemplo se puede usar tar para archivar los directorios creados por rsync.

No hay comentarios:

Publicar un comentario