Sincronización de carpetas con rsync

24 febrero 2012 at 17:09 by Adrián Pérez

Rsync es una herramienta muy útil para sincronizar dos directorios, ya sean de diferentes máquinas o de la misma máquina. Su sintaxis es la siguiente:

Pull: rsync [OPTION...] [USER@]HOST:SRC... [DEST]
Push: rsync [OPTION...] SRC... [USER@]HOST:DEST

Así pues, si se quiere sincronizar dos directorios, con un servidor remoto, y además de forma automatizada, mediante SSH, podríamos primero copiar la clave pública de una máquina a la otra, para conectar por certificado y evitar así tener que introducir un password para la conexión SSH. Aquí (con autentificación con password) o aquí (sin autentificación con password) el cómo hacerlo.

Una vez contemos con la autentificación por certificados configurada, podremos conectar desde el servidor desde el cual iniciamos el rsync para copiar sincronizar el contenido de una carpeta local, con una carpeta de un servidor remoto (en el ejemplo, se usará como base la carpeta local, con lo que la carpeta remota quedará igual que la local).

rsync -e ssh -avz /folder/src_folder user@80.80.80.100:/another_folder/dest_folder

Con el parámetro anterior, estaremos conectando por ssh contra el servidor 80.80.80.100, logueándonos con "user", que será el usuario contra el cual habremos copiado el certificado público de la máquina local, para poder conectar por ssh mediante certificados.

Además, con "-avz" se estarán manteniendo los permisos y propietarios de los ficheros copiados, y además con "z" se estarán comprimiendo los archivos durante las transferencias.

ACTUALIZACIÓN:

La opción "-a" en realidad, ejecuta "-rlptgoD", lo cual significa:

  • -r: recursivo
  • -l: copia los links simbólicos, como eso, links simbólicos
  • -p: conserva los permisos
  • -t: conserva los tiempos de modificación
  • -g: conserva el grupo
  • -o: conserva el propietario
  • -D: conserva los ficheros de dispositivo (--devices) así como los ficheros especiales (--specials)

El comando anterior, puede estar mejor si se le añade la opción:

-u / --update: no sincroniza los ficheros que son más recientes en directorio de destino

Finalmente, un parámetro muy interesante es el "-n":

-n: combinado con el resto de parámetros, únicamente realiza el rsync en modo test, pero no efectúa ningún cambio, con lo que si se combina con la opción "-v" devolverá el resultado que obtendríamos al ejecutar el comando, pero sin realizar ninguna modificación. Si el resultado es el esperado, podremos quitar la opción "-n" y volver a ejecutar, para esta vez sí, obtener los cambios esperados.

ACTUALIZACIÓN 2:

Si queremos copiar el contenido de un directorio local (ej: /tmp/source) a otro directorio local (/tmp/dest) bastará con ejecutar:

rsync -av /tmp/source/ /tmp/dest/

ACTUALIZACIÓN 3:

También es importante señalar, que en el rsync las barras en el path son muy importantes. Si como origen se pone /tmp/ (con barra final) se copiará en el destino todo lo que hay dentro de /tmp, sin incluir el propio directorio "/tmp". Sin embargo, si como origen se pone "/tmp" sin barra final, entonces en el destino se creará el directorio "tmp" y en él se copiará todo lo que incluye el directorio tmp original.

Así pues, es importante asegurarse de que estamos especificando el path origen que queremos (con o sin barra final) antes de realizar un rsync. Si se quiere estar doblemente seguro, mejor usar el rsync la primera vez con el parámetro "-n" tal y como se ha comentado anteriormente.