Sincronización de datos con rsync

rsync es una herramienta versátil que simplifica la transferencia de archivos a través de conexiones de red y acelera la sincronización de directorios locales. Su gran flexibilidad convierte a esta herramienta de sincronización en una opción excelente para una gran variedad de operaciones con archivos.

¿Qué es rsync?

rsync, abreviatura de remote synchronisation (sincronización remota), es una herramienta de sincronización flexible y compatible con redes en Linux. Este programa de código abierto puede utilizarse para sincronizar archivos y directorios entre sistemas locales o a través de redes. La herramienta utiliza una técnica de transferencia diferencial de datos en la que solo se transfieren las secciones de datos que realmente han cambiado. Esto minimiza el intercambio de datos y acelera considerablemente el proceso de sincronización. Gracias a una gran variedad de opciones, rsync permite controlar con precisión el comportamiento de la sincronización. La sintaxis flexible permite tanto copias locales sencillas como sincronizaciones de red complejas.

La sintaxis de rsync

La sintaxis de comandos de rsync tiene una estructura sencilla y es similar a la de SSH, SCP y CP. La estructura básica es la siguiente:

rsync [OPTION] source destination
bash

La ruta de origen desde la que se van a sincronizar los datos se introduce en source, mientras que la ruta de destino se introduce como destination. Para ello, rsync ofrece una variedad de opciones con las que se puede adaptar el proceso de sincronización a las necesidades respectivas. Las opciones más utilizadas son:

  • -a (Archive): conserva recursivamente los permisos de los archivos, las marcas de tiempo, los grupos, los propietarios y las propiedades especiales de los archivos.
  • -v (Verbose): muestra información detallada sobre el proceso de sincronización.
  • -r (Recursive): sincroniza los directorios y su contenido de forma recursiva.
  • -u (Update): solo transfiere aquellos archivos más nuevos que los que se encuentran en el directorio de destino.
  • -z (Compress): reduce el tráfico de datos a través de la red.
  • -n –itemize-changes: muestra una lista de cambios a realizar.
  • --delete: elimina ficheros del directorio destino que ya no existen en el origen.
  • --exclude: excluye determinados ficheros o directorios de la sincronización.
  • --dry-run: simula el proceso de sincronización sin transferir los ficheros.
  • --progress: muestra el progreso de la transferencia de ficheros.
  • --partial: los ficheros que se han transferido parcialmente permanecen en el directorio de destino si se interrumpe la transferencia. Cuando se reanuda la transferencia, el fichero se reanuda desde su último estado.

Ejemplo de sintaxis de rsync

La sintaxis de rsync puede comprenderse fácilmente con un ejemplo. El siguiente comando crea el directorio dir1 con cien archivos de prueba vacíos y un segundo directorio vacío dir2:

$ cd ~
$ mkdir dir1
$ mkdir dir2
$ touch dir1/file{1..100}
bash

El contenido de dir1 puede sincronizarse en el mismo sistema con dir2 utilizando la opción -r:

$ rsync -r dir1/ dir2
bash

Como alternativa, se puede utilizar la opción -a, que sincroniza recursivamente y contiene enlaces simbólicos, archivos de dispositivos especiales, tiempos de modificación, grupos, propietarios y autorizaciones:

$ rsync -a dir1/ dir2
bash

Nota. La barra (/) al final del directorio de origen en un comando rsync es importante porque indica que se deben sincronizar los contenidos del directorio, no el directorio en sí.

$ rsync -a dir1/ dir2
Output
sending incremental file list
./
file1
file10
file100
file11
file12
file13
file14
file15
file16
file17
file18
. . .
bash

Sin la barra final en el directorio de origen, el contenido del directorio de origen se copia en el directorio de destino:

$ rsync -a dir1/ dir2
Output
sending incremental file list
dir1/
dir1/file1
dir1/file10
dir1/file100
dir1/file11
dir1/file12
dir1/file13
dir1/file14
dir1/file15
dir1/file16
dir1/file17
dir1/file18
. . .
bash

En la práctica, por tanto, tiene sentido utilizar la barra al final del directorio de origen para garantizar que el proceso de sincronización se ejecuta como se espera y que el contenido del directorio de origen termina correctamente en el directorio de destino.

rsync: sincronización con un sistema remoto

Sincronizar un sistema remoto con rsync no suele ser difícil, siempre que se tenga acceso SSH al ordenador remoto y se conozca la información de autenticación necesaria. rsync suele utilizar SSH (Secure Shell) para la comunicación segura con sistemas remotos. La herramienta también debe estar instalada en ambos lados.

Si se verifica el acceso SSH entre los dos ordenadores, se puede sincronizar la carpeta dir1 en un ordenador remoto. En este caso, se transferirá el directorio real, por lo que se omite la barra final en el siguiente comando:

$ rsync -a ~/dir1 username@remote_host:destination_directory
bash

Cuando se traslada un directorio de un sistema local a un sistema remoto, se habla de una operación “push”. En cambio, cuando se sincroniza un directorio remoto con un sistema local, se habla de una operación “pull”. La sintaxis es la siguiente:

$ rsync -a username@remote_host:/home/username/dir1 place_to_sync_on_local_machine
bash
Servidores virtuales VPS
Virtualización completa con acceso root
  • Ancho de banda de hasta 1 Gb/s y tráfico ilimitado
  • Almacenamiento SSD NVMe ultrarrápido
  • Incluye: edición Plesk Web Host

Uso de otras opciones en rsync

El comportamiento estándar de rsync puede adaptarse aún más utilizando las opciones presentadas anteriormente.

Transferencia de archivos no comprimidos con rsync

La carga de red al transferir archivos sin comprimir puede reducirse de la siguiente manera utilizando la opción -z:

$ rsync -az source destination
bash

Visualizar el progreso y reanudar las transmisiones interrumpidas

Con -P puedes combinar las opciones --progress y --partial. Esto te da una visión general del progreso de las transferencias y te permite reanudar las transferencias interrumpidas al mismo tiempo:

$ rsync -azP source destination
Output
sending incremental file list
./
file1
    0 100%    0.00kB/s    0:00:00 (xfer#1, to-check=99/101)
file10
    0 100%    0.00kB/s    0:00:00 (xfer#2, to-check=98/101)
file100
    0 100%    0.00kB/s    0:00:00 (xfer#3, to-check=97/101)
file11
    0 100%    0.00kB/s    0:00:00 (xfer#4, to-check=96/101)
. . .
bash

Ejecuta el comando de nuevo para obtener un resultado más corto. Esto permite a rsync determinar si se han realizado cambios basándose en los tiempos de cambio.

$ rsync -azP source destination
Output
sending incremental file list
sent 818 bytes received 12 bytes 1660.00 bytes/sec
total size is 0 speedup is 0.00
bash

Mantener los directorios sincronizados con rsync

Para asegurar que dos directorios se mantienen realmente sincronizados, es necesario borrar ficheros en el directorio destino que han sido eliminados del origen. Por defecto, sin embargo, rsync no elimina ningún fichero del directorio destino. Este comportamiento puede modificarse con la opción --delete. Sin embargo, es aconsejable utilizar esta opción con precaución, ya que elimina archivos en el directorio de destino que ya no existen en el origen.

Antes de utilizar esta opción, debes utilizar la opción --dry-run. Esto te permite realizar una simulación del proceso de sincronización sin borrar los archivos reales. Así, te aseguras de que solo se realizan los cambios deseados sin perder accidentalmente datos importantes:

$ rsync -a --delete source destination
bash

Excluir archivos y directorios de la sincronización con rsync

En rsync puedes utilizar la opción --exlude para excluir determinados ficheros y directorios de la sincronización. Esto es útil si, por ejemplo, archivos temporales, archivos de registro u otros contenidos no deben ser sincronizados.

$ rsync -a --exclude=pattern_to_exclude source destination
bash

Si has especificado un patrón para excluir archivos, puedes sobrescribir esta exclusión para los archivos que coincidan con un patrón diferente utilizando la opción --include=.

$ rsync -a --exclude=pattern_to_exclude --include=pattern_to_include source destination
bash

Guardar copias de seguridad con rsync

La opción --backup permite guardar copias de seguridad de archivos importantes. Se utiliza junto con la opción --backup-dir. Esta opción especifica el directorio en el que se guardarán los archivos de copia de seguridad:

$ rsync -a --delete --backup --backup-dir=/path/to/backups /path/to/source destination
bash

Encontrarás una descripción detallada de los distintos escenarios de copia de seguridad en nuestro artículo “Crear backups del servidor con rsync”.

¿Le ha resultado útil este artículo?
Page top