En estas últimas semanas uGeek ha hablado sobre potentes herramientas de sincronización como Resilio, Syncthing, Nextcloud. En particular, yo he probado algunas de ellas, como puedes leer en los artículos «Sincronización entre Ubuntu y Android» o sobre Resilio cuando antes se llamaba BitTorrent Sync «Sincronizando Android y Ubuntu con BitTorrent Sync«. Sin embargo, de un tiempo a esta parte rsync se ha convertido en mi herramienta de sincronización por antonomasia. Por esta razón, quería dedicar un artículo para ver con detalle las posibilidades que nos ofrece rsync. Igualmente quería dejar algunas recetas para hacer las operaciones mas habituales.
Para mi esta es la herramienta mas potente para realizar sincronizaciones y backups, así como la mas segura. La razón de la seguridad se encuentra en que no tenemos ningún puerto abierto para realizar nuestra sincronización, y lo hacemos bajo ssh. Sin embargo, el problema con el que podemos encontrarnos es la dificultad de enfrentarnos a la cantidad de opciones y posibilidades que nos ofrece.
rsync a fondo
¿Porque utilizo rsync?
Como he comentado en la introducción, durante un tiempo he estado utilizando otras herramientas, sin embargo, finalmente me he decantado por rsync.
Para guardar toda la información, documentos, fotografías, etc, tengo un NAS de Synology, aunque esto mismo se podría aplicar a una Raspberry Pi.
En particular el NAS de Synology tiene la ventaja de que cuando no está en uso, entra en modo hibernación. En este modo, el consumo es ridículo. Detiene los discos duros, lo que lleva evidentemente a prolongar la vida de los mismos.
Sin embargo, al instalar estos servicios, he observado que el NAS nunca entra en hibernación. Siempre está monitorizando el sistema.
Por otro lado, ¿realmente estamos continuamente sincronizando nuestros equipos?. En mi caso te puedo asegurar que no. Con sincronizar una vez cuando al encender y apagar el ordenador es mas que suficiente.
Es mas, en el caso del móvil, cuando estamos fuera de una red WiFi ¿no es cierto que tenemos desactivada la sincronización? Es decir, yo siempre activo la opción sincronizar solo con WiFi. Entonces, ¿para que necesito sincronización continua?…
Pero, ¿que es rsync?
rsync es una herramienta para realizar transferencia rápida de archivos de forma incremental. Si tenemos un archivo en un directorio, y una copia del archivo en otro directorio, y modificamos el primero de los dos, para volver a tener una copia exacta en el otro directorio, o bien copiamos todo el archivo de nuevo (que es lo que haríamos con cp
) transferimos solo las partes diferentes.
Uso y funcionamiento de rsync
El inconveniente para muchos usuarios noveles reside en que es una herramienta que se utiliza desde el terminal, aunque tenemos opciones como Grsync.
Sin embargo, mi recomendación es crear sencillos scripts para realizar la sincronización, y una vez comprobado su funcionamiento, llamar a esos scripts para realizar las tareas de sincronización.
Uso básico de rsync
El uso básico de rsync es el siguiente,
rsync opciones origen destino
Las opciones básicas son las siguientes,
- -v, muestra los resultados de la ejecución.
- -a, mantiene el usuario, grupo, permisos, fecha y hora, así como los enlaces simbólicos. Esta opción es equivalente a -rlptgoD (recursivo, copia los enlaces simbólicos, mantiene los permisos, fecha y hora, grupo, propietario, archivos de dispositivos y especiales)
- -z, comprime la información antes de realizar la transferencia.
- -h, nos da las tasas de transferencia y el tamaño de los archivos en unidades razonables. Si no se especifica esta opción, todo la información nos la dará en bytes y bytes/s. Esta opción nos es tan necesaria como las demás pero siempre es una ayuda.
- –delete. Con esta opción se borrará todo lo que esté en el destino y no esté en el origen.
Así para hacer una sincronización básica, entre el directorio ~/Escritorio/FOTOS
y el escritorio ~/temporal/FOTOS
, ejecutaríamos la siguiente orden,
rsyn -avzh --delete ~/Escritorio/FOTOS/ ~/temporal/FOTOS
Atención al uso de la barra al final de los directorios. En el caso anterior copia el contenido de un directorio en otro, mientras que si ejecutamos,
rsyn -avzh --delete ~/Escritorio/FOTOS ~/temporal/FOTOS
creará el directorio ~/temporal/FOTOS/FOTOS/
. Por esta razón es interesante realizar pruebas antes de ejecutar de forma definitiva la orden.
Sincronización remota
Para realizar la sincronización con un directorio que no está en nuestro PC, lo normal es hacerlo vía ssh. Ahora bien, para esto el problema es que cada vez que vez que intentemos conectarnos nos pedirá nuestro nombre de usuario y contraseña. Evidentemente a la hora de automatizar las sincronizaciones esto es un problema.
¿Como evitar nombre de usuario y contraseña?
Para esto lo mejor es seguir lo que expliqué en el artículo «Sincronización sin contraseña«. Básicamente se trata de copiar nuestra clave pública en el archivo authorized_keys
del equipo remoto. De esta forma podemos hacer la sincronización fácilmente. Solo tendremos que ejecutar la siguiente orden,
rsync -avzhie "ssh -p 2222" usuario@192.168.1.103:/data/data/com.arachnoid/sshelper/home/SDCard/DCIM/Camera ~/temporal
¿Por que ssh -p 2222? Esto es en el caso de que el remoto no utilice el puerto 22 que es el que utiliza por defecto el ssh, si no que utiliza el puerto 2222 (o cualquier otro).
En particular te recomiendo utilizar la sincronización en este sentido, porque de otra manera se hace muy pesada.
Además en el caso de automatizar, como he comentado antes, te obliga a escribir la contraseña en texto plano, lo que es un peligro.
Sincronización con el móvil
Para realizar la sincronización con nuestro móvil Android, podemos utilizar alguna de las aplicaciones que hay en Google Play. En particular te recomiendo SSHelper, tal y como te explico en el artículo sobre «realizar copias de seguridad de Android a Ubuntu».
Una vez instalado y configurado solo tenemos que ejecutar la orden,
rsync -avzhie "ssh -p 2222" usuario@192.168.1.103:/data/data/com.arachnoid/sshelper/home/SDCard/DCIM/Camera ~/Fotos
Esto en el caso de que guardemos las fotos en nuestro equipo en el directorio ~/Fotos
.
Pero además nos interesa, como he indicado, borrar los archivos de origen, es decir, del móvil. Así vamos liberando espacio en el móvil a la vez que realizamos la sincronización,
rsync -avzhie --remove-source-files "ssh -p 2222" usuario@192.168.1.103:/data/data/com.arachnoid/sshelper/home/SDCard/DCIM/Camera ~/Fotos
OJO, en el que queráis sincronizar las fotos del móvil a vuestro ordenador, no utilizar la opción –delete, porque borrará las fotos del PC al no encontrarlas en el móvil.
Mas información con rsync
Además de la opción -i y -h que nos facilita el uso de rsync, hay dos interesantes opciones que nos van a ayudar considerablemente.
- –progress. Esta opción nos muestra información sobre l progreso de la transferencia para cada uno de los archivos que se van enviando. Así nos indica tanto el porcentaje de archivo enviado, como la tasa de trasnferencia. Por ejemplo,
4.24M 64% 2.67MB/s
Una vez terminado, veremos los resultados de la trasnferencia,
7.79M 100% 4.88MB/s 0:00:01 (xfr#8, to-chk=528/860)
- –stats. Al final de la transferencia nos muestra un resumen con todos los datos mas relevantes, como el número de archivos, los archivos creados, los archivos borrados, el tamaño total de archivos, el tamaño total transferido, el tiempo transcurrido, las tasas de transferencia, etc.
Pruebas con rsync
Para realizar pruebas debemos añadir la opción -n ó –dry-run. Además es interesante añadir la opción -i. Así en nuestro ejemplo anterior la orden a ejecutar sería,
rsyn -avzhni --delete ~/Escritorio/FOTOS ~/temporal/FOTOS
La opción -i (–itemize-changes) nos muestra un resumen de todos los cambios que se van a realizar. De esta forma, para cada uno de los archivos que se actualizan nos dará una salida de la forma YXcstpoguax.
- Y será alguna de las siguientes opciones,
- < el archivo se envía al directorio origen
- > el archivo se envía al directorio destino
- c se produce un cambio local
- h se trata de un enlace duro
- . esa opción no se modifica
- X será una de estas opciones,
- f para archivo
- d para directorio
- L para enlace simbólico
- D para dispositivo
- S archivo especial
- c significa que tienen distintos checksum
- s significa que tienen diferentes tamaños.
- t diferentes fechas y/o hora
- p diferentes permisos
- o diferente propietario
- g diferente grupo
- u está reservado para un posible uso.
- a cambia la información ACL
- x cambia la información de atributos extendidos.
Así por ejemplo un resultado podría ser…
.f...p..... IMG_20170228_110836.jpg >f+++++++++ IMG_20170228_110926.jpg
Esto significa que en el primer caso solo se cambia el permiso del archivo y que en el segundo caso se añade el archivo al directorio destino.
Esta opción -i la podemos utilizar en cualquier caso. Es decir, que no es exclusiva de pruebas. Con esta opción antes de cada una de las operaciones a realizar nos indicará que es lo que va hará.
El algoritmo de rsync
El potencial de rsync se encuentra en la velocidad de sincronización, y esto es así por su algoritmo de funcionamiento. rsync no copia un archivo completo de un sitio a otro, sino que solamente copia aquellas partes diferentes.
Así, supongamos que tenemos dos ordenadores A
y B
, que contienen dos archivos a
y b
. Estos dos archivos son similares. Lo que pretendemos es que el archivo b
que se encuentra en el ordenador B
sea exactamente igual a a
.
El funcionamiento sería algo como lo que indico a continuación,
- El ordenador
B
divide el archivob
enn
partes de un tamaño de terminado. - Para cada una de estas partes calcula una suma de comprobación o checksum (realmente hace dos).
B
envía esas sumas aA
A
busca en el archivoa
para encontrar todos los bloques con las sumas de comprobación deb
- Terminados estos pasos el ordenador
A
envía aB
las instrucciones necesarias para realizar una copia dea
. Cada una de esas instrucciones o bien hacen referencia a una parte deb
o bien son datos exactos dea
en los que la parte dea
sea distinta de la parte deb
.
Evidentemente, esto requiere de realizar una serie de cálculos en los dos equipos, pero la velocidad de cálculo es mucho mas rápida que le velocidad de transferencia de datos.
Automatización
Para hacer que la sincronización sea realmente eficaz debemos recurrir a dos opciones que nos ofrece cualquier distribución Linux, que es por un lado cron y por el otro lado los scripts. Lo mas eficaz es crear uno o varios scripts con las sincronizaciones mas frecuentes, de forma que al ejecutarlas tengamos incluidas todas las opciones que necesitemos. Así por ejemplo yo tengo creados varios scripts llamados sincroniza_xxx. Por ejemplo para sincronizar mi pc con el NAS ejecuto el comando sincroniza_pc_nas, para sincronizar el móvil con el pc ejecuto sincroniza_movil_pc, etc.
Por otro lado está el asunto de programar los trabajos de sincronización. Para esta operación podemos utilizar cron tal y como explico en el artículo sobre el clonado de Ubuntu.
Más información
Gran artículo
Gracias.
Para quienes tienen conocimientos y les guste la terminal está bien pero para los recién llegados a GNU/Linux o apurados como yo, les sugiero usar de forma gráfica FreeFileSync; lo llevo usando hace ya muchos años y es genial para sincronizar entre discos externos e internos.
FreeFileSync es una solución muy interesante. Además el proyecto está muy vivo, con lo que no se le puede perder de vista.
Saludos y gracias.
Gracias por otro magnífico artículo. Aunque hecho de menos una extensión en los gestores de archivos, como Caja, Dolphin, etc., que sean capaces de hacer algo parecido al programa FreeCommander (windows) con la comparación de carpetas y la sincronización. Aunque he encontrado Krusader 2.6 para KDE y tengo que probarlo.
Gracias de un seguidor.
Gracias! Muy claro el artículo! Me quedó la duda sobre la comparación que hace. Entendí mal o es que es solo en un solo sentido? Dropbox por ejemplo sincroniza con el servidor, y si en el servidor hay algo nuevo, lo haace en sentido inverso. Es que Rsync no puede hacerlo asi? o no lo entendi bien?
hola, en primer lugar gracias por el tutorial es muy interesante y esta muy bien explicado. Sin embargo si quisiéramos añadir la opción de encriptar(via gpg) los datos que sincronizo mediante rsync no se me ocurre ninguna solución rápida más alla de descriptar sincronizar y volver a encriptar…