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.
  • -l: copiar enlaces simbólicos.
  • -p: preservar los permisos.
  • -t: preservar fechas de modificación.
  • -g: preservar el grupo.
  • -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


Compartí este artículo