Introducción
Rsync, que significa sincronización remota, es una herramienta de sincronización de archivos remotos y locales. Utiliza un algoritmo para minimizar la cantidad de datos copiados moviendo solo 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.
Implemente sus aplicaciones frontend desde GitHub usando Plataforma de Aplicaciones de DigitalOcean. Deje que DigitalOcean se encargue de escalar su aplicación.
Prerrequisitos
Para practicar el uso de rsync
para sincronizar archivos entre un sistema local y remoto, necesitará dos máquinas para actuar como su computadora local y su máquina remota, respectivamente. Estas dos máquinas podrían ser servidores virtuales privados, máquinas virtuales, contenedores o computadoras personales, siempre y cuando estén configuradas correctamente.
Si planea seguir esta guía utilizando servidores, sería prudente configurarlos con usuarios administrativos y configurar un firewall en cada uno de ellos. Para configurar estos servidores, siga nuestra Guía de Configuración Inicial del Servidor.
Independientemente de qué tipos de máquinas utilice para seguir este tutorial, necesitará haber creado claves SSH en ambos. Luego, copie la clave pública de cada servidor al archivo authorized_keys
del otro servidor como se describe en Paso 2 de esa guía.
Esta guía fue validada en máquinas que ejecutan Ubuntu 20.04, aunque debería funcionar en general con cualquier computadora que ejecute un sistema operativo basado en Linux y tenga rsync
instalado.
Definición de Rsync
Rsync es una herramienta de sincronización muy flexible habilitada para la red. Debido a su ubicuidad en sistemas Linux y similares a Unix y su popularidad como herramienta para scripts del sistema, está incluido en la mayoría de las distribuciones de Linux por defecto.
Entendiendo la Sintaxis de Rsync
La sintaxis para rsync
opera de manera similar a otras herramientas, como ssh
, scp
y cp
.
Primero, cambie al directorio de inicio ejecutando el siguiente comando:
Luego, cree un directorio de prueba:
Cree otro directorio de prueba:
Ahora agregue algunos archivos de prueba:
Ahora hay un directorio llamado dir1
con 100 archivos vacíos en él. Confirme enumerando los archivos:
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 tiene un directorio vacío llamado dir2
. Para sincronizar el contenido de dir1
con dir2
en el mismo sistema, ejecutará rsync
y usará la bandera -r
, que significa “recursivo” y es necesario para la sincronización de directorios:
Otra opción es usar la bandera -a
, que es una combinación de banderas y significa “archivo”. Esta bandera sincroniza de forma recursiva y conserva enlaces simbólicos, archivos especiales y de dispositivo, tiempos de modificación, grupos, propietarios y permisos. Se usa más comúnmente que -r
y es la bandera recomendada para usar. Ejecute el mismo comando que el ejemplo anterior, esta vez usando la bandera -a
:
Tenga en cuenta que hay una barra diagonal al final del primer argumento en la sintaxis de los dos comandos anteriores y resaltada aquí:
Esta barra diagonal final significa el contenido de dir1
. Sin la barra diagonal final, 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 dos veces tus argumentos antes de ejecutar un comando rsync
. Rsync proporciona un método para hacer esto pasando las opciones -n
o --dry-run
. La bandera -v
, que significa “verboso”, también es necesaria para obtener la salida apropiada. Combinarás las banderas a
, n
, y v
en el siguiente comando:
Outputsending incremental file list
./
file1
file10
file100
file11
file12
file13
file14
file15
file16
file17
file18
. . .
Ahora compara esa salida con la que recibes al eliminar la barra diagonal al final, como en el siguiente:
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 el directorio mismo fue transferido, en lugar de solo los archivos dentro del directorio.
Usando Rsync para Sincronizar con un Sistema Remoto
Para usar rsync
para sincronizar con un sistema remoto, solo necesitas tener configurado el acceso SSH entre tu máquina local y remota, así como tener rsync
instalado en ambos sistemas. Una vez que tengas verificado el acceso SSH entre las dos máquinas, puedes sincronizar la carpeta dir1
de la sección anterior a una máquina remota usando la siguiente sintaxis. Por favor nota en este caso, que deseas transferir el directorio real, así que omitirás la barra diagonal al final:
Este proceso se llama una operación de push porque “empuja” un directorio desde el 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 directorio dir1
estuviera en el sistema remoto en lugar de en su sistema local, la sintaxis sería la siguiente:
Al igual que cp
y 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 han sido comprimidos, como archivos de texto, puede reducir la transferencia de red agregando compresión con la opción -z
:
La bandera -P
también es útil. Combina las banderas --progress
y --partial
. Esta primera bandera proporciona una barra de progreso para las transferencias, y la segunda bandera le permite reanudar las transferencias interrumpidas:
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 ejecuta el comando nuevamente, recibirá una salida abreviada ya que no se han realizado cambios. Esto ilustra la capacidad de Rsync para usar los tiempos de modificación para determinar si se han realizado cambios:
Outputsending incremental file list
sent 818 bytes received 12 bytes 1660.00 bytes/sec
total size is 0 speedup is 0.00
Supongamos que actualizara la hora de modificación en algunos de los archivos con un comando como el siguiente:
Entonces, si ejecutas rsync
con -azP
nuevamente, notarás en la salida cómo Rsync inteligentemente vuelve a copiar solo los archivos modificados:
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 verdaderamente sincronizados, es necesario eliminar archivos del directorio de destino si se eliminan del origen. Por defecto, rsync
no elimina nada del directorio de destino.
Puedes cambiar este comportamiento con la opción --delete
. Antes de usar esta opción, puedes usar -n
, la opción --dry-run
, para realizar una prueba y evitar pérdida de datos no deseada:
Si prefieres excluir ciertos archivos o directorios ubicados dentro de un directorio que estás sincronizando, puedes hacerlo especificándolos en una lista separada por comas después de la opción --exclude=
:
Si tienes un patrón especificado para excluir, puedes anular esa exclusión para archivos que coincidan con un patrón diferente usando la opción --include=
:
Finalmente, la opción --backup
de Rsync se puede utilizar para almacenar copias de seguridad de archivos importantes. Se utiliza en conjunto con la opción --backup-dir
, que especifica el directorio donde se deben almacenar los archivos de copia de seguridad:
Conclusión
Rsync puede optimizar las transferencias de archivos sobre conexiones de red y agregar robustez a la sincronización de directorios locales. La flexibilidad de Rsync lo convierte en una buena opción para muchas operaciones diferentes a nivel de archivos.
A mastery of Rsync allows you to design complex backup operations and obtain fine-grained control over how and what is transferred.