Copias de respaldo incrementales con rsync


Este documento explicará como usar rsync para hacer copias de respaldo (backups) incrementales de la información de manera remota, es decir, aquellos que almacenan sólo la información que ha cambiado desde la última vez que la copia de seguridad fue hecha en una maquina diferente a la que tiene la informacion.

Contexto

rsync es una herramienta que nos permite sincronizar remotamente dos máquinas. Es útil para realizar copias de seguridad incrementales de nuestros datos, de este modo si una carpeta mide 3 GB y queremos almacenarla en otro computador, sólo la primera vez los 3 GB serán transferidos, luego sólo se transferirán los pequeños cambios que haya entre el servidor principal donde están los datos y la máquina donde hemos hecho nuestra copia de seguridad. Para mayor información se recomienda visitar:

Tutorial

Primero: Instalación y configuración de rsync

Para que se puedan hacer copias incrementales de la información se requiere que tanto la máquina principal (al que de ahora en adelante nos referiremos como principal.com), como la máquina de respaldo (que llamaremos respaldo.com) tengan instalado rsync. En caso de no tenerlo es necesario instalarlo (En debian basta con el clásico apt-get install rsync).

Además de eso supondremos que se tiene un usuario en el servidor principal al que llamaremos simplemente usuario-p. Para hacer un backup usando rsync basta con ejecutar desde la máquina de respaldo el siguiente comando:

rsync -avz -e ssh ejemplo@principal.com:/carpeta/para/salvar /lugar/donde/salvarla

con lo cual estamos indicando que nos conectaremos a la máquina principal.com mediante ssh con la cuenta del usuario ejemplo y haremos una sincronización mediante rsync de lo que está en la ruta /carpeta/para/salvar de ese servidor y lo dejaremos en el directorio /lugar/donde/salvarla del servidor respaldo.com. Una vez ejecutemos dicho comando, saldrá en la consola algo como esto:

The authenticity of host 'principal.com (192.168.0.100)' can't be established.
RSA key fingerprint is 32:e5:79:8e:5f:5a:25:a9:f1:0d:ef:be:5b:a6:a6:23.
Are you sure you want to continue connecting (yes/no)?

a lo que respondemos yes (perdonarán el spanglish :-P ). Colocamos la clave del usuario usuario-p, en el servidor principal que se nos preguntará después y la sincronización entonces se llevará a cabo copiando las cosas en la máquina desde la que ejecutamos el comando.

rsync via ssh sin solicitar contraseña

Ahora veremos cómo hacer para que esta comando no nos pida clave cada vez que lo ejecutemos. Para que la automatización del backup funcione más adecuadamente generaremos un par de llaves privadas y públicas en el servidor respaldo.com. Para esto hacemos lo siguiente en dicho servidor:

mkdir ~/rsync
ssh-keygen -t dsa -b 2048 -f ~/rsync/mirror-rsync-key

Veremos algo similar a esto:

Generating public/private dsa key pair.
Enter passphrase (empty for no passphrase): [press enter here]
Enter same passphrase again: [press enter here]
Your identification has been saved in /root/cron/mirror-rsync-key.
Your public key has been saved in /root/cron/mirror-rsync-key.pub.
The key fingerprint is:
68:95:35:44:91:f1:45:a4:af:3f:69:2a:ea:c5:4e:d7 root@mirror

/!\ El anterior mensaje nos pide una frase clave para la generación de los pares de llaves, pero ahí no colocaremos ninguna, de modo que la copia de respaldo se pueda hacer sin intervención humana. Presionamos entonces dos veces la tecla "Enter".

Y luego copiamos la clave pública recien generada al servidor principal:

scp ~/rsync/mirror-rsync-key.pub usuario-p@principal.com:

Ahora nos conectamos al servidor principal.com como el usuario-p usando ssh y una vez adentro creamos un archivo que tenga las llaves autorizadas para conectarse a esta máquina. Para esto, hacemos lo siguiente:

mkdir ~/.ssh
chmod 700 ~/.ssh
mv ~/mirror-rsync-key.pub ~/.ssh/
cd ~/.ssh
touch authorized_keys
chmod 600 authorized_keys
cat mirror-rsync-key.pub >> authorized_keys

El archivo authorized_keys debería lucir algo así:

ssh-dss AAAAB3NzaC1kc3MAAA[...]lSUom== usuario-r@respaldo.com

Ahora, para permitir conexiones a esta máquina sólo desde la máquina respaldo.com, como el usuario-r y a través únicamente de rsync debemos adicionar las siguientes líenas al comienzo del archivo authorized_keys

command="/home/usuario-r/rsync/checkrsync",from="respaldo.com",no-port-forwarding,no-X11-forwarding,no-pty

/!\ Obsérvese que tenemos que cambiar /home/usuario-r/rsync/checkrsync y respaldo.com en el comando anterior, por los parámetros específicos (cambios similares se aplican para todo el documento, pero en comandos tan largos puede perderse de vista).

Ahora creamos un script home/usuario-p/rsync/checkrsync que rechace todos los comandos ejecutados remotamente por el usuario-r en el servidor de respaldo, salvo el rsync

mkdir ~/rsync
nano ~/rsync/checkrsync

y allí pegamos las siguientes líneas:

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

Ahora damos los permisos adecuados a ese script:

chmod 700 ~/rsync/checkrsync

Ahora salimos de la máquina principal y luego probamos que podemos entrar sin necesidad de acreditarnos, desde la máquina de respaldo. Para esto último hacemos:

rsync -avz -e "ssh -i /home/usuario-p/rsync/mirror-rsync-key" ejemplo@principal.com:/carpeta/para/salvar /lugar/donde/salvarla

A diferencia del comando que dimos al comienzo, este no nos debe solicitar ninguna clave en principal.com para hacer la sincronización, simplemente indicará que se está llevando a cabo.

Luego veremos cómo automatizar la labor cada x minutos colocándolo en un cron.

Rsync de una carpeta con mucho uso

Este script ejecuta rsync constantemente hasta que copie exitosamente una carpeta.

salida=1
while [ $salida -ne 0 ]; do
        rsync -av /novell/CUN_SOFTWARE/ /backup/novell/latest/CUN_SOFTWARE/
        salida=$?
done

Kmilo: En mi caso lo uso para copiar una carpeta de una particion montada por red, que esta bajo fuerte uso y por ello suele presentar errores al copiar,

Imagen/borrador-avatar.png

Esta sección es un esbozo en construcción. Se aprecian tus aportes y paciencia ;)

rsyncBackups (last edited 2008-04-20 14:38:29 by localhost)