Cómo usar Rsync para sincronizar directorios locales y remotos

Introducción

Rsync , que significa sincronización remota , es una herramienta de sincronización de archivos remota y local. Utiliza un algoritmo para minimizar la cantidad de datos copiados, moviendo únicamente las partes de los archivos que han cambiado.

En este tutorial, definiremos Rsync, revisaremos la sintaxis al usar rsync, explicaremos cómo usar Rsync para sincronizar con un sistema remoto y otras opciones disponibles para usted.

Prerrequisitos

Para practicar rsyncla sincronización de archivos entre un sistema local y uno remoto, necesitará dos máquinas que actúen como su computadora local y su máquina remota, respectivamente. Estas dos máquinas pueden ser servidores privados virtuales, máquinas virtuales, contenedores o computadoras personales, siempre que estén correctamente configuradas.

Si planea seguir esta guía usando servidores, le recomendamos configurarlos con usuarios administrativos y un firewall en cada uno. Para configurar estos servidores, consulte nuestra Guía de configuración inicial del servidor .

Independientemente del tipo de máquina que uses para seguir este tutorial, necesitarás crear claves SSH en ambas. Luego, copia la clave pública de cada servidor al authorized_keysarchivo del otro, como se describe en el paso 2 de esa guía .

Esta guía fue validada en máquinas que ejecutan Ubuntu 20.04, aunque generalmente debería funcionar con cualquier computadora que ejecute un sistema operativo basado en Linux que lo tenga rsyncinstalado.

Definición de Rsync

Rsync es una herramienta de sincronización en red muy flexible. Debido a su ubicuidad en sistemas Linux y similares a Unix y a su popularidad como herramienta para scripts de sistema, se incluye por defecto en la mayoría de las distribuciones de Linux.

Comprensión de la sintaxis de Rsync

La sintaxis de rsyncfunciona de manera similar a otras herramientas, como ssh, scp, y cp.

Primero, cambie a su directorio de inicio ejecutando el siguiente comando:

cd ~

Luego crea un directorio de prueba:

mkdir dir1

Crear otro directorio de prueba:

mkdir dir2

Ahora agregue algunos archivos de prueba:

touch dir1/file{1..100}

Ahora hay un directorio llamado dir1con 100 archivos vacíos. Confirme listando los archivos:

ls dir1

Outputfile1    file18  file27  file36  file45  file54  file63  file72  file81  file90
file10   file19  file28  file37  file46  file55  file64  file73  file82  file91
file100  file2   file29  file38  file47  file56  file65  file74  file83  file92
file11   file20  file3   file39  file48  file57  file66  file75  file84  file93
file12   file21  file30  file4   file49  file58  file67  file76  file85  file94
file13   file22  file31  file40  file5   file59  file68  file77  file86  file95
file14   file23  file32  file41  file50  file6   file69  file78  file87  file96
file15   file24  file33  file42  file51  file60  file7   file79  file88  file97
file16   file25  file34  file43  file52  file61  file70  file8   file89  file98
file17   file26  file35  file44  file53  file62  file71  file80  file9   file99

También tienes un directorio vacío llamado dir2. Para sincronizar el contenido de dir1to dir2en el mismo sistema, ejecutarás rsyncy usarás la -rbandera, que significa “recursivo” y es necesaria para la sincronización de directorios:

rsync -r dir1/ dir2

Otra opción es usar la -abandera, que es una bandera combinada y significa “archivo”. Esta bandera se sincroniza recursivamente y conserva enlaces simbólicos, archivos especiales y de dispositivo, horas de modificación, grupos, propietarios y permisos. Se usa con más frecuencia que -rla bandera y es la bandera recomendada. Ejecute el mismo comando que en el ejemplo anterior, pero esta vez usando la -abandera:

rsync -a dir1/ dir2

Tenga en cuenta que hay una barra diagonal final ( /) al final del primer argumento en la sintaxis de los dos comandos anteriores y resaltado aquí:

rsync -a dir1/ dir2

Esta barra diagonal final representa el contenido de dir1. Sin ella, dir1, incluido el directorio, se colocaría dentro de dir2. El resultado crearía una jerarquía como la siguiente:

~/dir2/dir1/[files]

Otro consejo es verificar los argumentos antes de ejecutar un rsynccomando. Rsync proporciona un método para hacerlo pasando las opciones ` -n“ o ` `. El indicador “`, que significa “`detallado“, también es necesario para obtener la salida correcta. Combinará los indicadores “` , “` y ` ` en el siguiente comando:--dry-run-vanv

rsync -anv dir1/ dir2

Outputsending incremental file list
./
file1
file10
file100
file11
file12
file13
file14
file15
file16
file17
file18
. . .

Ahora compare ese resultado con el que recibe al eliminar la barra diagonal final, como en lo siguiente:

rsync -anv dir1 dir2

Outputsending 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
. . .

Esta salida ahora demuestra que se transfirió el directorio en sí, en lugar de solo los archivos dentro del directorio.

Uso de Rsync para sincronizar con un sistema remoto

Para rsyncsincronizar con un sistema remoto, solo necesita tener configurado el acceso SSH entre sus equipos local y remoto, e rsyncinstalado en ambos sistemas. Una vez verificado el acceso SSH entre ambos equipos, puede sincronizar la dir1carpeta de la sección anterior con un equipo remoto usando la siguiente sintaxis. Tenga en cuenta que, en este caso, desea transferir el directorio real, por lo que omitirá la barra diagonal final:

rsync -a ~/dir1 username@remote_host:destination_directory

Este proceso se denomina operación push porque envía un directorio del sistema local a un sistema remoto. La operación opuesta es pull y se utiliza para sincronizar un directorio remoto con el sistema local. Si el dir1directorio estuviera en el sistema remoto en lugar de en el sistema local, la sintaxis sería la siguiente:

rsync -a username@remote_host:/home/username/dir1 place_to_sync_on_local_machine

Al igual cpque en herramientas similares, la fuente siempre es el primer argumento y el destino siempre es el segundo.

Uso de otras opciones de Rsync

Rsync proporciona muchas opciones para alterar el comportamiento predeterminado de la utilidad, como las opciones de bandera que aprendió en la sección anterior.

Si está transfiriendo archivos que aún no están comprimidos, como archivos de texto, puede reducir la transferencia de red agregando compresión con la -zopción:

rsync -az source destination

La -Pbandera también es útil. Combina las banderas --progressy --partial. La primera bandera proporciona una barra de progreso para las transferencias, y la segunda permite reanudar las transferencias interrumpidas.

rsync -azP source destination

Outputsending incremental file list
created directory destination
source/
source/file1
              0 100%    0.00kB/s    0:00:00 (xfr#1, to-chk=99/101)
sourcefile10
              0 100%    0.00kB/s    0:00:00 (xfr#2, to-chk=98/101)
source/file100
              0 100%    0.00kB/s    0:00:00 (xfr#3, to-chk=97/101)
source/file11
              0 100%    0.00kB/s    0:00:00 (xfr#4, to-chk=96/101)
source/file12
              0 100%    0.00kB/s    0:00:00 (xfr#5, to-chk=95/101)
. . .

Si vuelve a ejecutar el comando, recibirá una salida abreviada, ya que no se han realizado cambios. Esto ilustra la capacidad de Rsync para usar las horas de modificación para determinar si se han realizado cambios:

rsync -azP source destination

Outputsending incremental file list
sent 818 bytes received 12 bytes 1660.00 bytes/sec
total size is 0 speedup is 0.00

Digamos que quieres actualizar la hora de modificación de algunos de los archivos con un comando como el siguiente:

touch dir1/file{1..10}

rsyncLuego, si lo ejecutas -azPnuevamente, notarás en la salida cómo Rsync vuelve a copiar de manera inteligente solo los archivos modificados:

rsync -azP source destination

Outputsending 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)
file2
            0 100%    0.00kB/s    0:00:00 (xfer#3, to-check=87/101)
file3
            0 100%    0.00kB/s    0:00:00 (xfer#4, to-check=76/101)
. . .

Para mantener dos directorios sincronizados, es necesario eliminar los archivos del directorio de destino si se eliminan del directorio de origen. Por defecto, rsyncno se elimina nada del directorio de destino.

Puede cambiar este comportamiento con la --deleteopción . Antes de usar esta opción, puede usar -nla --dry-runopción para realizar una prueba y evitar la pérdida de datos no deseada:

rsync -an --delete source destination

Si prefiere excluir ciertos archivos o directorios ubicados dentro de un directorio que está sincronizando, puede hacerlo especificándolos en una lista separada por comas después de la --exclude=opción:

rsync -a --exclude=pattern_to_exclude source destination

Si tiene un patrón específico para excluir, puede anular esa exclusión para los archivos que coincidan con un patrón diferente utilizando la --include=opción:

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

Finalmente, --backupla opción de Rsync permite almacenar copias de seguridad de archivos importantes. Se utiliza junto con la --backup-diropción que especifica el directorio donde se deben almacenar las copias de seguridad:

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

Conclusión

Rsync puede optimizar la transferencia de archivos a través de conexiones de red y robustecer la sincronización de directorios locales. Su flexibilidad lo convierte en una excelente opción para diversas operaciones a nivel de archivo.

El dominio de Rsync le permitirá diseñar operaciones de respaldo complejas y obtener un control detallado sobre cómo y qué se transfiere.

Leave a Reply

Your email address will not be published. Required fields are marked *

Related Post