Rsync 01 – Hablemos de Rsync

Hace tiempo que empecé a utilizar Rsync para sincronizar mis archivos de forma local entre varios discos duros y de forma remota entre varios equipos. Hoy quiero empezar una serie de artículos para hablar sobre las bondades de este fantástico software.

Yo uso rsync porque confío en que hará una copia exacta de mis archivos, es rápido, puedo usarlo junto con ssh, puedo hacer scripts para automatizar tareas y porque ¡es muy chulo!, por qué no decirlo.

Sin extenderme demasiado hablaré sobre el uso básico de rsync ya que me servirá como base para futuros posts.

 

¿Qué es Rsync?

Rsync es un programa ideado principalmente para sincronizar archivos y directorios haciendo que las transferencias sean lo más pequeñas posible. ¿Y cómo lo hace? Pues usando un algoritmo llamado “Delta encoding” que permite sincronizar ficheros y directorios minimizando el volumen de datos transferidos.
El algoritmo obtiene solamente los bloques de datos que han sido modificados desde la última versión del archivo, permitiendo reducir considerablemente el uso de la red en el momento de realizar la transferencia.
Decir también que rsync está licenciado bajo una licencia GPL v3 y que sus autores originales fueron Andrew Tridgell y Paul Mackerras aunque actualmente es mantenido por Wayne Davison.

Entre las muchas características que podemos encontrar en rsync figuran:

  • Soporte para copiar enlaces, ficheros de dispositivo, propietarios, grupos y permisos
  • Opciones de exclusión de archivos y directorios similares a las del GNU tar
  • No es necesario ser root para usarlo
  • Se puede usar junto con ssh o rsh

Para más información podéis visitar su web oficial o su man page.

 

Instalando Rsync

Rsync se puede instalar desde los repositorios de cualquier distribución, o en su defecto descargando el código fuente de su página web y a compilar se ha dicho.

 

Uso básico

La forma más sencilla de usar rsync sería:

rsync /ruta/origen /ruta/destino

Pero si no usamos ningún parámetro rsync no respetaría el propietario (si lo hiciésemos con otro usuario claro) ni los permisos ni las fechas, y por otro lado esto no funcionaría con directorios. Está claro que si quisiéramos hacer un backup de archivos de varios usuarios esto no nos valdría ya que todos los archivos en el destino serían propiedad del usuario que lanzase rsync.

Veamos pues las opciones básicas de rsync:

-a, –archive modo archivo; lo mismo que -rlptgoD (no -H).

Esta opción (-a) combina los siguientes parámetros:

-r recorre toda la estructura de directorios
-l copia enlaces simbólicos
-p mantiene los permisos
-t mantiene la hora del fichero
-g mantiene el grupo
-o mantiene el propietario
-D mantiene los ficheros de dispositivo (sólo para root).
No mantiene los hard links (-H).

Otros parámetros interesantes son:
-v, –verbose nos da información del proceso
-u, –update ignora los archivos que son más nuevos en el receptor

La opción -u es muy útil por ejemplo si modificamos los archivos de la copia (los del destino) desde otro sitio o a mano y por tanto serían más actuales que los del origen. Con esta opción rsync ignorará los archivos que sean más actuales en el destino que en el origen ya que de lo contrario aplicaría los cambios que hubiese en el origen perdiendo las modificaciones que hicimos a mano en el destino.

Por tanto la forma de hacer una copia exacta de los ficheros y directorios incluyendo propietario, grupos, permisos, enlaces simbólicos, hora y que nos informe de lo que está pasando sería:

rsync -av /ruta/origen /ruta/destino

Se pueden hacer muchas combinaciones jugando con los parámetros vistos arriba. Copiar archivos sin respetar usuario, sin copiar enlaces simbólicos, copiando enlaces duros (añadiendo -H), etc.

Por poner un ejemplo, tengo un script para copiar mis archivos a un disco duro con formato NTFS porque necesito acceder a él desde Windows por temas de trabajo. Como a NTFS le da igual el usuario y grupo de Unix no uso la opción -a (de hecho genera advertencias). No uso -o, -g ni -D y le añado -u para asegurarme que en el disco NTFS tendrá la versión más moderna de los archivos.

La línea que uso sería así:

rsync -vrlptu /ruta/origen /ruta/destino

 

Notas sobre Origen y Destino

Cuando en las líneas anteriores uso /ruta/origen y /ruta/destino para generalizar estos bien pueden ser ficheros y/o directorios.

Es muy recomendable no usar rutas relativas ya que para rsync siempre serán relativas al directorio desde donde se ejecuta rsync. Es mejor para evitar sustos usar rutas absolutas.

Hay que puntualizar y es muy importante tener en cuenta que si hablamos de directorios, colocaremos / al final para referirnos al contenido del directorio y sin / nos referiremos al directorio en sí.

Ejemplos:

  • Copiar Directorio1 dentro de Directorio2:
rsync -av /ruta/Directorio1 /ruta/Directorio2/

Directorio2 quedaría:

Directorio2
     |___ Directorio1
               |___ Archivo1
               |___ Archivo2
  • Copiar contenido de Directorio1 dentro de Directorio2:
rsync -av /ruta/Directorio1/ /ruta/Directorio2/

Directorio2 quedaría:

Directorio2
     |___ Archivo1
     |___ Archivo2

 

Borrando archivos en el Destino

Rsync además de copiar archivos de un sitio a otro nos permite borrar en el destino los archivos que no se encuentren en el origen con la opción –delete. De esta forma origen y destino estarían sincronizados (mismo contenido).
Hay que tener mucho cuidado con esta opción ya que borrará de nuestra copia todo archivo que no se encuentre en el origen. Si por error borramos algo del origen y no nos damos cuenta, al realizar la sincronización también se borrará en el destino.
Para evitar desastres es preferible usar la opción -n o –dry-run junto con –delete. Esto hará una simulación de lo que va a ocurrir pero no modificará nada y cuando comprobemos que no ocurrirá ningún desastre lanzamos la misma linea sin -n para que se efectúen los cambios.

 

Excluyendo archivos

Otra característica muy útil de rsync es la posibilidad de excluir archivos.

Para ello disponemos de dos opciones:
–exclude
–exclude-from

Nota: Las rutas para exclude siempre son relativas al origen.

–exclude:
Para excluir un archivo o directorio:

 rsync -av --exclude 'archivo' /ruta/origen/ /ruta/destino/
 rsync -av --exclude 'directorio' /ruta/origen/ /ruta/destino/

Otra manera:

 rsync -av --exclude='archivo' /ruta/origen/ /ruta/destino/
 rsync -av --exclude='directorio' /ruta/origen/ /ruta/destino/

Para excluir varios archivos y/o directorios usaremos { }:

 rsync -av --exclude={'archivo1','directorio1','archivo2'} /ruta/origen/ /ruta/destino/

–exclude-from:
También podemos crear un archivo txt con todos los archivos y directorios a excluir

Contenido de excluidos.txt:
archivo1
archivo2
directorio1

Y pasárselo a rsync así:

 rsync -av --exclude-from='excluidos.txt' /ruta/origen/ /ruta/destino/

 

Cómo trabaja rsync y copia local

Por defecto rsync compara el tamaño y la fecha de los archivos para saber cuales han cambiado, ya que es muy difícil que dos archivos con la misma fecha y hora y el mismo tamaño sean distintos y extrae de ellos los bloques del archivo que han cambiado que son los que copiará. Este comportamientos se puede cambiar con la opción -c (checksum) que hará que rsync calcule un hash para cada archivo e ignore los archivos con el mismo hash.

Otro comportamiento curioso de rsync es que si la copia es local copiará los archivos enteros y no las partes que hayan cambiado. Esto no es un error sino que rsync considera que en local es más rápido copiar el archivo entero que el tiempo que tardaría en calcular que partes han cambiado.
Sin embargo cuando la copia es en red sí hace uso de su algoritmo para minimizar las transferencias, ya que en red son más lentas que en local. Si queremos que rsync copie archivos enteros usaremos -W que en local es la opción por defecto y no es necesario indicarlo y si queremos que use su algoritmo usaremos –no-whole-file que en red es la opción por defecto.

 

Copiando a través de la red

Donde rsync es capaz de sacar todo su potencial es en las copias en red. Para ello tan sólo debemos indicar un origen o un destino remotos y él sabrá que la copia será en red y usará ssh por defecto. Rsync usará la opción -e o –rsh, pero no es necesaria ponerla a no ser que queramos especificar el puerto.

 rsync -av /ruta/origen/ usuario@host_destino:/ruta/destino/
 rsync -av usuario@host_origen:/ruta/origen/ /ruta/destino/

Otras maneras:

 rsync -av -e ssh /ruta/origen/ usuario@host_destino:/ruta/destino/
 rsync -av --rsh="ssh" /ruta/origen/ usuario@host_destino:/ruta/destino/

Si queremos indicar el puerto:

 rsync -av -e "ssh -p puerto" /ruta/origen/ usuario@host_destino:/ruta/destino/
 rsync -av --rsh="ssh -p puerto" /ruta/origen/ usuario@host_destino:/ruta/destino/

 

GUI

Para terminar comentaros que hay varias GUI’s para rsync por si preferís usarlo en un entorno de escritorio como pueden ser Grsync o GAdmin-Rsync.
Personalmente no uso ninguna y prefiero crear scripts para mis copias.

Esto ha sido todo por hoy. Al final me extendí un poco más de lo que tenía pensado, pero es que las posibilidades que brinda rsync son casi infinitas y hablaré un poco más de rsync en futuros posts.

Para cualquier duda podéis dejarme un comentario y para saber más no dudéis en consultar el manual de rsync.

Nos vemos en el próximo post.

 

Saludos linuxeros.

 


Serie Rsync:

Rsync 01 – Hablemos de Rsync
Rsync 02 – Migrando de un HDD a un SSD sin reinstalar

2 comentarios en “Rsync 01 – Hablemos de Rsync

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *