Sincronizar directorios remotos con rsync vía SSH

Rsync es una herramienta de copia y sincronización de archivos locales y remotos muy utilizada para mantener copias sincronizadas (mirrors) y realizar backups. Permite copiar localmente o desde/hacia otro host remoto sobre una shell. Posee un gran número de opciones que posibilitan controlar cada aspecto del conjunto de archivos a ser copiado. A su vez, utiliza un algoritmo que transmite sólo las diferencias entre archivos, lo que optimiza el uso de la red.

Para identificar qué archivos necesitan ser copiados, rsync utiliza un algoritmo de verificación rápida, el cual compara las fechas de modificación y tamaño.

Este artículo explica cómo sincronizar una copia remota de un directorio utilizando rsync a través de SSH.







Supongamos que en el sistema "devuan.linuxito.com" existe un directorio /backups/ del cual se desea mantener una copia local sincronizada:

root@devuan:~# ls -l /backups/ total 932 -rw-r--r-- 1 root root 952727 sep 7 12:59 etc.tar.gz

Se observa que inicialmente cuenta con un único archivo.

El sistema local es "hal9000" y se desea mantener una copia del directorio remoto en /data/backups :

emi@hal9000:/data/backups % ls -l /data/backups/ total 0

El uso típico de rsync tiene la forma:

rsync -av <ORIGEN> <DESTINO>

La opción -v indica que la salida sea verbosa (informativa), mientras que -a (modo de archivo) es una opción que engloba varias opciones comunes ( -rlptgoD ):

-r : modo recursivo.

: modo recursivo. -l : copiar enlaces simbólicos.

: copiar enlaces simbólicos. -p : preservar los permisos.

: preservar los permisos. -t : preservar fechas de modificación.

: preservar fechas de modificación. -g : preservar el grupo.

: preservar el grupo. -o : preservar el dueño.

: preservar el dueño. -D : preservar dispositivos y archivos especiales.

Para realizar la copia de archivos a través de SSH, es necesario utilizar la opción -e . Como parámetro a esta opción es posible agregar cualquier parámetro u opción necesaria para SSH, como por ejemplo el puerto (si se utiliza uno personalizado).

La sintaxis para especificar un host remoto es idéntica a la de, por ejemplo, scp:

usuario@host:ruta

De esta forma, para actualizar nuestro directorio local /data/backups/ según el directorio /backups/ del host "devuan.linuxito.com" a través de SSH (y autenticando como el usuario "emi"), se ejecuta el siguiente comando:

emi@hal9000:/data/backups % rsync -av -e 'ssh -p22' emi@devuan.linuxito.com:/backups/ /data/backups/ emi@devuan.linuxito.com's password: receiving incremental file list ./ etc.tar.gz sent 46 bytes received 953,074 bytes 272,320.00 bytes/sec total size is 952,727 speedup is 1.00

emi@hal9000:/data/backups % ls -l total 992 -rw-r--r-- 1 emi wheel 952727 Sep 7 12:59 etc.tar.gz

Se observa que se ha traído el archivo "etc.tar.gz".

Prueba de concepto

Veamos qué sucede si se agregan nuevos archivos en el directorio remoto (origen):

root@devuan:~# echo hola > /backups/hola1.txt root@devuan:~# echo hola > /backups/hola2.txt root@devuan:~# ls -l /backups/ total 940 -rw-r--r-- 1 root root 952727 sep 7 12:59 etc.tar.gz -rw-r--r-- 1 root root 5 sep 7 13:02 hola1.txt -rw-r--r-- 1 root root 5 sep 7 13:03 hola2.txt

Al sincronizar nuevamente, sólo se traen desde el host remotos los nuevos archivos:

emi@hal9000:/data/backups % rsync -av -e 'ssh -p22' emi@devuan.linuxito.com:/backups/ /data/backups/ emi@devuan.linuxito.com's password: receiving incremental file list ./ hola1.txt hola2.txt sent 65 bytes received 214 bytes 111.60 bytes/sec total size is 952,737 speedup is 3,414.83 emi@hal9000:/data/backups % ls -l total 1000 -rw-r--r-- 1 emi wheel 952727 Sep 7 12:59 etc.tar.gz -rw-r--r-- 1 emi wheel 5 Sep 7 13:02 hola1.txt -rw-r--r-- 1 emi wheel 5 Sep 7 13:03 hola2.txt

El archivo "etc.tar.gz" no se trae nuevamente porque simplemente no ha cambiado.

En cambio si se modifica un archivo existente:

root@devuan:~# echo hola >> /backups/hola1.txt root@devuan:~# ls -l /backups/ total 940 -rw-r--r-- 1 root root 952727 sep 7 12:59 etc.tar.gz -rw-r--r-- 1 root root 10 sep 7 13:03 hola1.txt -rw-r--r-- 1 root root 5 sep 7 13:03 hola2.txt root@devuan:~# cat /backups/hola1.txt hola hola

Al sincronizar nuevamente, este sí se actualiza (su tamaño se ha modificado):

emi@hal9000:/data/backups % rsync -av -e 'ssh -p22' emi@devuan.linuxito.com:/backups/ /data/backups/ emi@devuan.linuxito.com's password: receiving incremental file list hola1.txt sent 49 bytes received 167 bytes 86.40 bytes/sec total size is 952,742 speedup is 4,410.84 emi@hal9000:/data/backups % ls -l total 1000 -rw-r--r-- 1 emi wheel 952727 Sep 7 12:59 etc.tar.gz -rw-r--r-- 1 emi wheel 10 Sep 7 13:03 hola1.txt -rw-r--r-- 1 emi wheel 5 Sep 7 13:03 hola2.txt

Borrar archivos en el destino

Si luego de sincronizar se borran archivos en el origen:

root@devuan:~# rm /backups/hola* root@devuan:~# ls -l /backups/ total 932 -rw-r--r-- 1 root root 952727 sep 7 12:59 etc.tar.gz

Estos no serán borrados en el destino durante la próxima sincronización:

emi@hal9000:/data/backups % rsync -av -e 'ssh -p22' emi@devuan.linuxito.com:/backups/ /data/backups/ emi@devuan.linuxito.com's password: receiving incremental file list ./ sent 27 bytes received 72 bytes 28.29 bytes/sec total size is 952,727 speedup is 9,623.51 emi@hal9000:/data/backups % ls -l total 1000 -rw-r--r-- 1 emi wheel 952727 Sep 7 12:59 etc.tar.gz -rw-r--r-- 1 emi wheel 10 Sep 7 13:03 hola1.txt -rw-r--r-- 1 emi wheel 5 Sep 7 13:03 hola2.txt

Estos archivos presentes en el destino, pero que no existen en el origen, se denominan "extraños". Rsync tiene la capacidad de borrar archivos extraños (si se desea mantener una sincronización exacta) gracias a la opción --delete :

emi@hal9000:/data/backups % rsync -av --delete -e 'ssh -p22' emi@devuan.linuxito.com:/backups/ /data/backups/ emi@devuan.linuxito.com's password: receiving incremental file list deleting hola2.txt deleting hola1.txt sent 20 bytes received 69 bytes 35.60 bytes/sec total size is 952,727 speedup is 10,704.80 emi@hal9000:/data/backups % ls -l total 992 -rw-r--r-- 1 emi wheel 952727 Sep 7 12:59 etc.tar.gz

Sin embargo, cabe destacar que se debe utilizar con mucho cuidado, especialmente cuando se utiliza junto con el modo recursivo ( -a o -r ).

En conclusión, rsync es una excelente herramienta para mantener copias actualizadas y realizar copias de seguridad. Si se desea ejecutar este tipo de sincronización de manera programada y desatendida, será necesario autenticar el usuario remoto a través de SSH mediante clave pública.



Tal vez pueda interesarte

