Introducción
Muchos administradores de red a menudo invierten en herramientas comerciales robustas y de alto costo para realizar copias de seguridad, sincronizaciones y espejos de datos. Sin embargo, rsync ofrece estas mismas funcionalidades de forma gratuita, con la ventaja de ser altamente personalizable.
Rsync puede integrarse fácilmente en scripts, permitiendo la automatización de tareas complejas y la creación de soluciones personalizadas para satisfacer las necesidades específicas de cada entorno. Por ejemplo, puede combinarse con cron para programar copias de seguridad automáticas, enviar notificaciones por correo electrónico o generar registros detallados que facilitan el monitoreo de las operaciones.
Principales características
Rsync (remote sync) es una herramienta de línea de comandos ampliamente utilizada para sincronizar archivos y directorios entre dos ubicaciones, ya sea en el mismo sistema o a través de una red.
Es conocido por las siguientes características:
- Eficiencia
- Compara los archivos de origen y destino, transfiriendo solo las diferencias.
- Ofrece compresión de datos durante la transferencia.
- Seguridad
- Utiliza SSH para transferencias remotas.
- Preserva permisos, propietarios, grupos, marcas de tiempo y otros atributos de los archivos.
- Permite simular operaciones sin realizar cambios reales.
- Flexibilidad
- Permite excluir archivos en el destino que ya no existen en el origen.
- Ofrece control granular sobre el ancho de banda utilizado durante la transferencia.
- Soporta sincronización recursiva de directorios, incluidos subdirectorios y archivos.
- Versatilidad
- Puede usarse para hacer copias de seguridad, copiar archivos, espejar servidores, sitios web, para sincronización bidireccional y más.
- Se integra fácilmente en scripts, permitiendo la automatización de tareas complejas.
- Está disponible en diversas plataformas, incluyendo Linux, BSD (FreeBSD, OpenBSD, NetBSD), Windows (vía Cygwin o WSL), macOS y Solaris.
- Confiabilidad
- Tiene mecanismos para verificar la integridad de los datos transferidos, asegurando que los archivos se copien correctamente.
- Muestra informes detallados, incluyendo el número de archivos transferidos y el tamaño total de los datos.
Sintaxis y uso básico
La sintaxis general de rsync es:
rsync [opciones] origen destino
1 - Ejemplo para copiar directorios locales:
rsync -av /origen/ /destino/
- -a (archivo): Preserva la estructura de directorios, permisos, atributos, marcas de tiempo y habilita el modo recursivo.
- -v (verbose): Muestra detalles de la transferencia, facilitando el seguimiento de las operaciones.
Rsync trata de manera diferente los directorios de origen que contengan una barra (/) al final. Si la barra está presente, el comando copia solo el contenido de la carpeta de origen al destino. De lo contrario, la propia carpeta de origen será copiada al destino.
Ejemplo:
- rsync -av /origen/ /destino/: Copia solo el contenido de /origen/ a /destino/.
- rsync -av /origen /destino/: Copia la carpeta /origen (y su contenido) a /destino/.
Si el directorio de destino no existe, rsync lo creará automáticamente durante la operación.
2 - Copiar archivos:
Para copiar un archivo preservando su nombre original:
rsync -av /origen/nombre-del-archivo.txt /destino/
Para renombrar el archivo, especifique el nuevo nombre en la ruta de destino:
rsync -av /origen/nombre-del-archivo.zip /destino/nuevo-nombre.zip
Sincronizar con una computadora remota a través de SSH
Para sincronizar archivos de un directorio local con una computadora remota a través de SSH:
rsync -avz /origen/ usuario@servidor:/destino/
- -z (compress): Comprime los datos durante la transferencia.
Para copiar archivos de una computadora remota al sistema local, invierta el origen y el destino:
rsync -avz usuario@servidor:/ruta/remota/ /ruta/local/
Si el servidor SSH está configurado para usar un puerto diferente al predeterminado (22), especifique el puerto en el comando utilizando la opción -e:
rsync -e "ssh -p puerto-ssh" -avz /origen/ usuario@servidor:/destino/
Reemplace puerto-ssh con el número del puerto configurado en el servidor.
Ignorar archivos o directorios durante la copia
Para no copiar archivos temporales, use el comando:
rsync -av --exclude='*.tmp' /origen/ /destino/
- --exclude: Permite especificar patrones para omitir archivos o directorios. En este ejemplo, ningún archivo con la extensión .tmp será incluido en la copia.
Para omitir un directorio específico durante la sincronización:
rsync -av --exclude='dir/' /origen/ /destino/
Este comando ignora el directorio dir/ (y todo su contenido) de la copia, pero incluye todos los demás archivos y directorios de /origen/.
Eliminar archivos en el destino que no existen en el origen
Para mantener una copia exacta del origen en el destino:
rsync -av --delete /origen/ /destino/
- --delete: Elimina archivos en el destino que no están presentes en el origen. Esta opción es útil para mantener el destino como una copia exacta del origen, eliminando archivos que fueron borrados o renombrados en el origen.
Simular la operación sin ejecutarla
Para probar un comando, use:
rsync -av --dry-run /origen/ /destino/
- --dry-run: Muestra lo que se haría, pero no ejecuta ningún cambio. Esta opción es útil para probar comandos y verificar el impacto antes de aplicarlos.
Lista de parámetros
A continuación, una lista de opciones para ser usadas en el comando rsync y sus funciones:
- a (archive): Equivalente a -rlptgoD. Habilita el modo recursivo, transfiere dispositivos especiales y de bloques (por ej., sda, tty), preserva la estructura de directorios, permisos, atributos, enlaces simbólicos y fechas de modificación.
- --append: Continúa una transferencia donde quedó, en caso de que haya un archivo parcialmente copiado en el destino.
- --checksum: Verifica la integridad de los archivos copiados. Aumenta significativamente el tiempo de ejecución, ya que calcula el checksum de todos los archivos en el origen y el destino. Útil al continuar transferencias interrumpidas abruptamente.
- --delete: Elimina archivos en el destino que no están presentes en el origen. Esta opción es útil para mantener el destino como una copia exacta del origen.
- --dry-run: Simula la operación, mostrando lo que se haría, pero sin ejecutar ningún cambio. Ideal para probar comandos antes de aplicarlos.
- --exclude='PATRÓN': Ignora archivos y carpetas que coincidan con un patrón específico. Permite el uso de comodines, como * y ?.
- -e: Especifica el shell remoto a ser usado y permite incluir parámetros adicionales. Ejemplo: -e "ssh -p 22" para especificar un puerto SSH personalizado.
- -h: Muestra la salida en un formato legible por humanos. En lugar de mostrar los datos transferidos en bytes, muestra valores en KB, MB, GB, etc.
- -P (--partial --progress): Muestra una barra de progreso y preserva, en el destino, archivos parcialmente transferidos. Para continuar una transferencia interrumpida, combínelo con la opción --append.
- -q (quiet): Suprime mensajes, mostrando solo errores durante la ejecución.
- -u (update): No sobrescribe archivos en el destino si son más recientes que los del origen.
- -v (verbose): Muestra detalles de la transferencia.
- -z (compress): Comprime los datos durante la transferencia.
Ejemplo práctico
A continuación, se creará una estructura de directorios y archivos para demostrar el funcionamiento de rsync en la práctica. Se creará una carpeta llamada rsync/ en el directorio home del usuario, y dentro de ella, las subcarpetas origen/, donde se almacenarán varios archivos y subdirectorios, y destino/, inicialmente vacía, donde se copiarán los archivos y carpetas desde el origen.
El script a continuación crea la estructura utilizada en este ejemplo, permitiéndole ejecutar las mismas pruebas. Entre en el home del usuario, cd /home/usuario/, cree un archivo para el script: vi crear-estructura-rsync.sh, y agregue el contenido:
crear-estructura-rsync.sh
#!/bin/bash
# Crea la estructura de directorios mkdir -p rsync/{origen,destino} mkdir -p rsync/origen/fotos/cache mkdir -p rsync/origen/documentos/backup
# Entra en el directorio "origen" cd rsync/origen/
# Crea archivos de ejemplo touch archivo1.txt archivo2.log archivo3.tmp fotos/cache/cache_fotos.txt documentos/notas.txt
# Crea archivos binarios de ejemplo con tamaños específicos dd if=/dev/zero of=fotos/foto1.jpg bs=512K count=1 dd if=/dev/zero of=fotos/foto2.png bs=512K count=3 dd if=/dev/zero of=documentos/reporte.pdf bs=512K count=2 dd if=/dev/zero of=documentos/backup/backup_antiguo.zip bs=512k count=4
El comando dd en el script crea archivos que ocupan espacio en disco para enriquecer las pruebas. Agregue permiso de ejecución al script y ejecútelo para crear la estructura que se utilizará en los ejemplos:
$ bash
chmod +x crear-estructura-rsync.sh ./crear-estructura-rsync.sh
Después de ejecutar el script, se crearán archivos en varios formatos y organizados en diferentes carpetas.
Estructura de directorios y archivos creada
rsync/ ├── destino └── origen ├── archivo1.txt ├── archivo2.log ├── archivo3.tmp ├── documentos │ ├── backup │ │ └── backup_antiguo.zip │ ├── notas.txt │ └── reporte.pdf └── fotos ├── cache │ └── cache_fotos.txt ├── foto1.jpg └── foto2.png
Los siguientes comandos se ejecutarán en la carpeta rsync/ dentro del home del usuario. Acceda al directorio base, dentro de él podrá visualizar las carpetas origen/ y destino/.
$ bash
cd /home/usuario/rsync
ls
destino origen
Para hacer una copia completa de la carpeta origen/ a destino/, use el comando:
$ bash
rsync -avh origen/ destino/
Tenga en cuenta que en la salida del comando rsync se enumeran los archivos y carpetas transferidos, además de información como los bytes enviados y recibidos, velocidad de transferencia y tamaño total.
sent 5.24M bytes received 222 bytes 10.49M bytes/sec total size is 5.24M speedup is 1.00
Para mostrar la estructura de archivos y directorios en las carpetas origen/ y destino/ en formato de árbol, use el comando tree:
$ bash
tree origen/ tree destino/
Repita el comando rsync -avh origen/ destino/ y observe que solo algunos bytes serán transferidos. Esto ocurre porque rsync verifica si los archivos en el destino son idénticos a los del origen. En la segunda ejecución, ningún archivo será transferido, ya que ninguna modificación ha sido realizada en el origen desde la primera sincronización.
Borre todos los archivos en la carpeta destino/ para iniciar una nueva prueba. Luego, repita el comando rsync, ahora usando la opción -z para activar la compresión.
$ bash
rm -rf destino/* rsync -avhz origen/ destino/
Tenga en cuenta que, en la salida, los datos transferidos fueron comprimidos y que solo se enviaron 954 bytes, en lugar de los 5.24MB del primer comando.
sent 954 bytes received 214 bytes 2.34K bytes/sec total size is 5.24M speedup is 4,488.77
Agregue algún texto al archivo archivo2.log. Luego, repita el comando rsync y verifique que solo el archivo archivo2.log será copiado.
$ bash
echo "Nueva entrada" >> origen/archivo2.log rsync -avhz origen/ destino/
Borre el archivo archivo2.log en el origen y ejecute rsync con la opción --delete. Esto eliminará el archivo en el destino, manteniendo una copia exacta del origen.
$ bash
rm origen/archivo2.log rsync -avhz --delete origen/ destino/
Creando un script con rsync
En los ejemplos anteriores, es posible verificar el comportamiento básico de rsync y ya tener alguna inspiración para usarlo en su día a día. Por ejemplo, puede mantener una copia exacta de su sitio hospedado en Internet en una computadora local.
Sin embargo, imagine que existen archivos o carpetas enteras que no desea copiar. El siguiente script copia el contenido de origen/ a destino/, con excepción de archivos con las extensiones .tmp y .log, además de la carpeta cache/ y su contenido. El script también usa la opción --delete para eliminar archivos en el destino que no existan en el origen.
sincroniza.sh
#! /bin/bash rsync -avzh --delete origen/ \ --exclude "*.tmp" \ --exclude "*.log" \ --exclude "cache/" \ destino/
Cree el archivo sincroniza.sh y agregue el contenido del script. Luego, conceda permiso de ejecución y ejecútelo desde la carpeta rsync/ en nuestro ejemplo para probar su funcionamiento:
chmod +x sincroniza.sh ./sincroniza.sh
En los ejemplos anteriores, rsync está siendo usado para copiar datos localmente. Recuerde: para copias remotas, basta con agregar usuario@servidor: antes de la ruta de la carpeta remota.
Archivos grandes y conexiones lentas
Si una transferencia se interrumpe, el comportamiento predeterminado de rsync es descartar el archivo parcialmente copiado. Para evitar esto, utilice la opción -P. Esta opción preserva el archivo parcialmente transferido en el destino y muestra una barra de progreso durante la operación.
rsync -avP origen/archivo-grande.zip destino/
Al usar el comando anterior, si la conexión se interrumpe, el archivo parcialmente transferido permanecerá en el destino. Para continuar la transferencia desde donde quedó, utilice la opción --append. Si repite el comando anterior sin este parámetro, la copia comenzará desde cero nuevamente.
Otra opción útil en escenarios donde ocurren fallas durante la transferencia es --checksum. Esta opción compara los archivos en el origen y el destino para confirmar su integridad. El mecanismo de verificación predeterminado de rsync consulta el tamaño del archivo y la fecha de la última modificación para determinar si el archivo ha cambiado, pero no verifica la integridad de los datos.
Para continuar la transferencia interrumpida del comando anterior, use:
rsync -avP --append --checksum origen/archivo-grande.zip destino/
La opción --checksum no es obligatoria y aumentará significativamente el tiempo de ejecución del script, dependiendo del tamaño del archivo a verificar.
Sincronización bidireccional
Imagine un escenario en el que necesita mantener dos copias de los mismos archivos en dos ubicaciones distintas, como en casa y en el trabajo. Durante la semana, edita los archivos en la computadora de la empresa, mientras que por la noche o los fines de semana, trabaja en los archivos en casa.
Rsync reemplazará los archivos en el destino si son diferentes del origen, a menos que utilice la opción -u. Esta opción instruye a rsync a no sobrescribir archivos en el destino que sean más recientes que los del origen.
Aunque esta aproximación resuelve parte del problema, evitando la sobrescritura de archivos más recientes en el destino, rsync es una herramienta de sincronización unidireccional. Al ejecutar rsync origen/ destino/, los archivos en el destino se actualizan con las versiones más recientes del origen, pero el inverso no ocurre automáticamente.
Para mantener ambos lados actualizados (origen y destino), debe ejecutar el comando dos veces, invirtiendo el origen y el destino:
$ bash
# Actualiza el directorio en CASA con archivos modificados en el TRABAJO rsync -avu usuario@trabajo:archivos-mios/ /home/usuario/archivos-mios/
# Actualiza el directorio en el TRABAJO con archivos modificados en CASA rsync -avu /home/usuario/archivos-mios/ usuario@trabajo:archivos-mios/
Conclusión
Rsync es una herramienta indispensable para administradores de sistemas y usuarios que necesitan gestionar grandes volúmenes de datos de manera eficiente. Su capacidad de sincronización incremental, junto con el soporte a conexiones seguras vía SSH, lo convierte en una elección popular para copias de seguridad, replicación de datos y mantenimiento de sistemas distribuidos.
Referencias
- https://rsync.samba.org/
- https://download.samba.org/pub/rsync/rsync.1
- https://linuxize.com/post/how-to-use-rsync-for-local-and-remote-data-transfer-and-synchronization/