Script para hacer copias de seguridad con rsync

Script para hacer copias de seguridad con rsync

backup-rsync es un script para hacer copias de seguridad de tus máquinas usando el fiable rsync.

No voy a hablar de lo conveniente que es hacer una copia de seguridad, de cuándo hay que hacerla ni qué es lo que hay que copiar. Hay mucha información en la red sobre este tema. Lo esencial: copia lo que no te gustaría perder.

El script hace la copia sincronizando todos los archivos de los directorios especificados de la máquina origen en el directorio definido como destino. Es recomendable que el directorio destino se encuentre en un disco externo, porque si hacemos la copia en el disco origen y este falla, de poco nos servirá :-P

El script se puede ejecutar directamente, desde la línea de comandos, o programarlo con cron. Lo habitual es lo segundo, y se debe ejecutar como root si la copia incluye archivos a los que sólo ese usuario puede acceder.

Antes de poderlo usar, hay que configurarlo.

En primer lugar se define la dirección de correo a la que el script enviará información en el caso de que se produzca algún error en el proceso.

LOG_MAIL="admin@ejemplo.com"

Como cliente de correo está definido mutt, cámbialo por el que más te guste.

Hay que reemplazar “maquina1” y “maquina2” (que están como ejemplo) por el hostname de las máquinas de las que queremos hacer la copia en la línea:

MAQUINAS="maquina1 maquina2"

Definimos los directorios y archivos implicados:

# Directorio que contiene los ficheros de control que necesita el script
DIR_CONTROL="/home/usuario/backups/control"
# Directorio raiz donde guardar el backup
DIR_BACKUP="/mnt/Backups/backups"
# Subdirectorio para backups de ficheros borrados
BORRADOS="backup_$(date +%Y%m%d)"
# Archivo de registro
LOG_FILE="/home/usuario/backups/logs/backup-rsync.log"

El directorio de control contiene los archivos con los patrones de exclusión. Más abajo explico en qué consisten eston archivos.

El directorio raiz del backup especifica dónde se crearán las copias. Como ya he comentado, es preferible que se encuentre en un disco externo por razones de seguridad.

El script mantiene una copia de los archivos que fueron borrados entre copias. La variable BORRADOS define el nombre que tendrá el subdirectorio donde se irán guardando estos archivos.

A continuación se especifica el nombre y ubicación del archivo de registro que se creará en cada copia.

En las siguientes líneas se definen los directorios, para cada máquina, que se incluirán en la copia.

En el ejemplo, de “maquina1” se copiará todo el árbol de directorios (“/”). De “maquina2” sólo interesa copiar “/home”, “/etc”, “/usr/local/bin” y “/root”. Cuando se especifica un directorio, todo lo que cuelgue de él será incluido en la copia.

Es importante respetar el nombre de estas variables: BACKUP_hostname para que el script funcione correctamente. Se deberá crear una variable de este tipo por cada máquina.

##
# Directorios de los que hacer el backup de cada máquina
#

# maquina1
BACKUP_maquina1="/"
# maquina2
BACKUP_maquina2="/home /etc /usr/local/bin /root"

Sólo queda por definir cómo se llaman los archivos de exclusión:

 DIR_EXCLUIR=${DIR_CONTROL}/${MAQUINA}-backup-ext.excluir

Tal como está ahora, el archivo de exclusión para “maquina1” debe estar en el directorio de control y llamarse: maquina1-backup-ext.excluir.

Cuando es ejecutado, el script hace una serie de comprobaciones para determinar si todo está en su sitio y comienza a hacer la copia de cada máquina guardando el resultado de las operaciones en el archivo de registro. Al finalizar elimina las copias que tengan más de 15 días. En realidad lo que borra son los directorios “backup_*” que contienen los archivos que fueron borrados entre copias. Hay que tener en cuenta que lo que se obtiene es una foto del estado actual de los directorios implicados en el momento de hacer la copia. Si desde la copia anterior se añadieron archivos, estos serán copiados, si algunos fueron borrados, se guardarán en el directorio “backup_*” correspondiente.

rsync sólo copia aquellos archivos que han cambiado respecto a la última copia, por lo que el proceso es muy rápido. La copia diaria de mis máquinas, que contienen más de dos teras de información, no tarda más de cinco minutos. Por supuesto, la primera vez tiene que copiarlo todo por lo que el tiempo de ejecución será mucho mayor.

Los archivos de exclusión contienen los patrones que definen los archivos o directorios que queremos excluir de la copia. Dejo uno de los míos como ejemplo y os remito al manual de rsync para que conozcáis su sintaxis.

- /proc
- /sys
- /run
- /dev
- /mnt/Backups
- /lost+found
- /**/lost+found
- /**/.thumbnails
- /**/.mozilla/**/Cache
- /**/.mozilla/**/thumbnails
- /**/.Trash*
- /**/.local/share/Trash
- /**/.xsession-errors
- /**/.gvfs
- /**/Vídeos
+ /home/usuario/backups/
+ /home/usuario/backups/control
+ /home/usuario/backups/logs
- /home/usuario/backups/*

Es muy importante definir bien estos patrones para copiar sólo aquello que queremos copiar y no la basura o archivos irrelevantes de nuestras máquinas.

Las copias de las máquinas remotas se hacen a través de un túnel ssh, por lo tanto, la máquina que ejecuta el script necesita tener acceso por ssh a ellas. En mi caso, necesito que root pueda conectarse a esas máquinas pero que sólo lo pueda hacer rsync. Para ello tengo en cada máquina este script (secure-rsync) en /usr/local/bin:

#!/bin/sh

case "$SSH_ORIGINAL_COMMAND" in
        *\&*)
                echo "Rejected"
                ;;
        *\|*)
                echo "Rejected"
                ;;
        *\(*)
                echo "Rejected"
                ;;
        *\{*)
                echo "Rejected"
                ;;
        *\;*)
                echo "Rejected"
                ;;
        *\< *)
                echo "Rejected"
                ;;
        *\`*)
                echo "Rejected"
                ;;
        rsync\ --server*)
                $SSH_ORIGINAL_COMMAND
                ;;
        *)
                echo "Rejected"
                ;;
esac

En /root/.ssh/authorized_keys debemos tener la clave pública de la máquina que ejecuta el script backup-rsync. Hay que editar ese archivo y delante de esa clave añadir al principio:

from="maquina1",command="/usr/local/bin/secure-rsync",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty 

maquina1 es la máquina que ejecuta backup-rsync y la que se conectará como root a esta. Así aseguramos que root sólo se conectará a nuestra máquina con el proceso rsync.

Share on FacebookShare on Google+Tweet about this on TwitterShare on LinkedIn

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Antes de enviar el formulario: