Utilizar Rsync para Sincronizar Directorios Locales y Remotos en un Servidor
Introducción
Rsync , que significa "sincronización remota", es una herramienta de sincronización de archivos remota y local. Utiliza un algoritmo que minimiza la cantidad de datos copiados moviendo sólo las partes de los archivos que han cambiado.
En este tutorial, cubriremos el uso básico de esta poderosa utilidad. Vamos a usar un servidor Ubuntu 12.04 con los siguientes ejemplos, pero puede utilizar cualquier distribución moderna de Linux para seguir adelante.
¿Qué es Rsync?
Rsync es una herramienta de sincronización de red muy flexible. También puede referirse al protocolo de red desarrollado para utilizar esta herramienta.
Cuando hacemos referencia a rsync en este tutorial, nos referimos principalmente a la utilidad, y no al protocolo.
Debido al enlace en los sistemas Linux y Unix y su popularidad como herramienta para scripts de sistema, está incluido en la mayoría de las distribuciones de Linux de forma predeterminada.
Sintaxis Básica
La sintaxis básica de rsync es muy directa, y opera de una manera similar a ssh, scp y cp.
Vamos a crear dos directorios de prueba y algunos archivos de prueba con los siguientes comandos:
cd ~
mkdir dir1
mkdir dir2
touch dir1/file{1..100}
Ahora tenemos un directorio llamado dir1
con 100 archivos vacíos en él.
ls dir1
file1 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 tenemos un directorio vacío llamado dir2
.
Para sincronizar el contenido de dir1
con dir2
en el mismo sistema, escriba:
rsync -r dir1/ dir2
La opción -r significa recursivo, que es necesario para la sincronización de directorios.
También podríamos usar el indicador -a en su lugar:
rsync -a dir1/ dir2
La opción -a es un indicador de combinación.
Representa "archivar" y sincroniza recursivamente y conserva enlaces simbólicos, archivos especiales y de dispositivos, tiempos de modificación, grupo, propietario y permisos.
Es más comúnmente usado que -r y es usualmente lo que quieres usar.
Una Nota Importante
Es posible que haya notado que hay una barra diagonal final (/) al final del primer argumento en los comandos anteriores:
rsync -a dir1/ dir2
Esto es necesario para significar "el contenido de dir1
".
La alternativa, sin la barra diagonal, colocaría dir1
, incluido el directorio, dentro de dir2
. Esto crearía una jerarquía que se vería así:
~/dir2/dir1/[files]
Compruebe siempre los argumentos antes de ejecutar un comando rsync.
Rsync proporciona un método para hacer esto pasando las opciones -n o -dry-run . El indicador -v (para verbo) también es necesario para obtener la salida adecuada:
rsync -anv dir1/ dir2
sending incremental file list
./
file1
file10
file100
file11
file12
file13
file14
file15
file16
file17
file18
. . .
Compare esta salida con la salida que obtenemos cuando eliminamos la barra inclinada:
rsync -anv dir1 dir2
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
. . .
Puede ver aquí que el directorio en sí se transfiere.
Utilizar Rsync para Sincronizar un Sistema Remoto
La sincronización con un sistema remoto es trivial si tiene acceso SSH en su servidor remoto y rsync está instalado en ambos lados. Si necesita configurar las claves SSH , haga clic aquí.
Una vez que se haya verificado el acceso SSH entre los dos, puede sincronizar la carpeta dir1
de una computadora anterior usando una sintaxis (note que queremos transferir el directorio real en este caso, por lo que omitimos la
barra):
rsync -a ~/dir1 username@remote_host:destination_directory
Esto se llama una operación de "empuje" porque empuja un directorio del sistema local a un sistema remoto.
La operación opuesta es "pull". Se utiliza para sincronizar un directorio remoto con el sistema local. Si el dir1
estuviera en el sistema remoto en lugar de nuestro sistema local, la sintaxis sería:
rsync -a username@remote_host:/home/username/dir1 place_to_sync_on_local_machine
Como "cp" y herramientas similares, el origen es siempre el primer argumento, y el destino es siempre el segundo.
Opciones útiles para Rsync
Rsync ofrece muchas opciones para alterar el comportamiento predeterminado de la utilidad. Ya hemos discutido algunas de las banderas más necesarias.
Si está transfiriendo archivos que aún no han sido comprimidos, como archivos de texto, puede reducir la transferencia de red añadiendo compresión con la opción -z :
rsync -az source destination
La bandera -P es muy útil. Combina las banderas --progress y --partial . La primera de ellas le da una barra de progreso para las transferencias y la segunda le permite reanudar transferencias interrumpidas:
rsync -azP source destination
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)
. . .
Si ejecutamos el comando nuevamente, obtendremos una salida más corta, porque 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.
rsync -azP source destination
sending incremental file list
sent 818 bytes received 12 bytes 1660.00 bytes/sec
total size is 0 speedup is 0.00
Podemos actualizar el tiempo de modificación en algunos de los archivos y ver que rsync inteligentemente vuelve a copiar sólo los archivos modificados:
touch dir1/file{1..10}
rsync -azP source destination
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)
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)
. . .
Con el fin de mantener dos directorios verdaderamente en sincronía, es necesario eliminar los archivos del directorio de destino si se eliminan de la fuente. De forma predeterminada, rsync no elimina nada del directorio de destino.
Podemos cambiar este comportamiento con la opción --delete . Antes de usar esta opción, use la opción --dry-run y realice pruebas para evitar la pérdida de datos:
rsync -a --delete source destination
Si desea excluir ciertos archivos o directorios ubicados dentro de un directorio que está sincronizando, puede hacerlo especificándolos en una lista separada por comas siguiendo la opción --exclude =
rsync -a --exclude=pattern_to_exclude source destination
Si especificamos un patrón para excluir, podemos sustituir esa exclusión por archivos que coincidan con un patrón diferente usando la opción --include = .
rsync -a --exclude=pattern_to_exclude --include=pattern_to_include source destination
Conclusión
Rsync puede simplificar las transferencias de archivos a través de conexiones en red y sincronizar los directorios locales. La flexibilidad de rsync la convierte en una buena opción para muchas operaciones de nivel de archivo diferentes.
Un dominio de rsync le permite diseñar operaciones de copia de seguridad complejas y obtener un control detallado sobre lo que se transfiere y cómo.
Fuente. Artículo traducido y con muy ligeras modificaciones de: https://www.digitalocean.com/community/tutorials/how-to-install-linux-apache-mysql-php-lamp-stack-on-debian