Rsync

Concepto
Rsync es una herramienta para sincronizar los ficheros y directorios que tenemos almacenados en un sitio en otro diferente minimizando la transferencia de datos. En realidad, rsync son dos cosas: un algoritmo de delta compression para sincronizar dos ficheros similares y una utilidad que usa dicho algoritmo junto con otras técnicas para hacer mirroring de ficheros y directorios en otro sitio transfiriendo la mínima cantidad de datos posible.

A nivel de un árbol de directorios con sus ficheros, la idea es sencilla. rsync nos copiará esos ficheros y directorios tal y como estaban en el nuevo sitio pero sin copiar todo, sino sólo lo que ha cambiado en el origen respecto al destino. Hacer lo mismo copiando los ficheros y directorios, incluso en remoto usando una carpeta compartida, sería equivalente si nos fijamos únicamente en el resultado, pero tenemos que transferir mucha más información.

A nivel de ficheros individuales, podemos imaginar un fichero muy grande (p.e. de varios GiB) de una base de datos. Si quisiéramos hacer backup de él sin tener herramientas como rsync, tendríamos que copiarlo cada vez, cuando en realidad en muchos casos la inmensa mayoría de bloques del fichero no habrá cambiado. rsync, en cambio, analiza el fichero en origen y en destino y sólo transmite (de forma comprimida, además) las partes que realmente hayan cambiado.

Características

 * 1) Soporte para copiar enlaces, ficheros de dispositivo, propietarios, grupos y permisos
 * 2) Opciones de exclusión (exclude y exclude-from) similares a las del GNU tar
 * 3) Modo CVS para ignorar los fichero que CVS ignoraría
 * 4) Se puede usar cualquier shell remota transparente, como ssh o rsh
 * 5) No es necesario ser root para usarlo
 * 6) pipelining de los ficheros transferidos para minimizar la latencia
 * 7) Soporte para usuarios anónimos o autentificados usando el demonio de rsync (ideal para hacer mirroring)

Sincronizar un fichero en otro:

$ ll fichero1 -rw-r- 1 vicente users 7625431 2008-01-13 11:40 fichero1 $ rsync -v fichero1 fichero2 fichero1

sent 7626448 bytes received 42 bytes  15252980.00 bytes/sec total size is 7625431 speedup is 1.00

$ ll fichero? -rw-r- 1 vicente users 7625431 2008-01-13 11:40 fichero1 -rw-r- 1 vicente users 7625431 2008-01-13 11:41 fichero2

Un ejemplo de sincronización de un directorio llamado dirA que contiene otros directorios y ficheros en otro llamado dirB que, de momento, aún no existe: $ rsync -av dirA/ dirB/ building file list ... done created directory dirB dirA/ dirA/fichero1 dirA/fichero2 dirA/dirA1/ dirA/dirA1/fichero3 dirA/dirA2/ dirA/dirA2/fichero4

sent 6540542 bytes received 126 bytes  13081336.00 bytes/sec total size is 6539349 speedup is 1.00

Si modificamos un poco sólo uno de los ficheros y volvemos a ejecutar exactamente el mismo comando, veremos que esta vez sólo se copia el fichero modificado: $ echo prueba >> dirA/fichero1 $ rsync -av dirA dirB building file list ... done fichero1

sent 65884 bytes received 42 bytes  131852.00 bytes/sec total size is 6539356 speedup is 99.19

Aunque le fichero fue ligeramente distinto, lo copia todo de nuevo, pero solo ese fichero en vez de todo el directorio; es que para un uso en local, rsync usa la opción -W por defecto, ya que considera que el esfuerzo en calcular la diferencia entre los ficheros es mayor que copiar directamente todo el fichero:

-W, --whole-file           copy files whole (without rsync algorithm)

Si contrarrestamos la -W con --no-whole-file veremos que que ahora sí que sólo copia el bloque donde ha encontrado el cambio.Y si además usamos la opción -z, comprimirá el bloque antes de pasarlo:

$ echo prueba >> fichero1 $ rsync -avz --no-whole-file fichero1 fichero2 building file list ... done fichero1

sent 843 bytes received 16620 bytes  34926.00 bytes/sec total size is 7625466 speedup is 436.66

El uso de la opción -z puede ser beneficioso o perjudicial, ya que la menor transferencia de datos redunda en un mayor consumo de CPU.

La barra al final de los nombres de directorio
Respecto a cómo pasarle los nombres de los directorios, hay que tener una especial atención respecto a si ponemos una barra al final del nombre del directorio o no, ya que significan cosas distintas. Este es el uso más estándar en el que sincronizamos dos directorios (dirA y dirB) para que sean exactamente iguales (“rsync -av dirA/ dirB/” o “rsync -av dirA/ dirB“):

$ rm -rf dirB $ rsync -av dirA/ dirB/ building file list ... done created directory dirB ./ fichero1 fichero2 dirA1/ dirA1/fichero3 dirA2/ dirA2/fichero4

sent 6540550 bytes received 126 bytes  13081352.00 bytes/sec total size is 6539363 speedup is 1.00

$ ll dirB total 164 drwxr-xr-x 4 vicente users 4096 2008-01-13 11:48 ./ drwxr-xr-x 4 vicente users 4096 2008-01-13 14:00 ../ drwxr-xr-x 2 vicente users 4096 2008-01-13 11:48 dirA1/ drwxr-xr-x 2 vicente users 4096 2008-01-13 11:59 dirA2/ -rwxr-xr-x 1 vicente users 65638 2008-01-13 13:59 fichero1* -rw-r--r-- 1 vicente users 71033 2008-01-13 11:39 fichero2

En cambio, si lo que queremos es que que copie dirA dentro de dirB, tenemos que poner “rsync -av dirA dirB/” o “rsync -av dirA dirB“