martes, 31 de mayo de 2016

Sincronizando archivos y directorios

Una estrategia común para mantener una copia de seguridad de un sistema implica mantener uno o más directorios sincronizados con otro directorio (o directorios) localizados en el sistema local (normalmente algún tipo de dispositivo extraíble de almacenamiento) o en un sistema remoto. Podríamos, por ejemplo, tener una copia local de un sitio web en desarrollo y sincronizarlo de vez en cuando con la copia "live" en un servidor web remoto.

En el mundo tipo Unix, la herramienta preferida para esta tarea es rsync. Este programa puede sincronizar tanto directorios locales como remotos usando el protocolo de actualización remota (remote-update protocol) rsync, que permite que rsync detecte rápidamente las diferencias entre los dos directorios y realice la cantidad mínima requerida de copiado para sincronizarlos. Esto hace a rsync muy rápido y económico de usar, comparado con otros tipos de programas de copiado.

rsync se invoca así:

rsync opciones origen destino

donde origen y destino son uno de los siguientes:
  • Un archivo o directorio local
  • Un archivo o directorio remoto en la forma [usuario@]host:ruta
  • Un servidor rsync remoto especificado con una URI de rsync://[usuario@]host[:puerto]/ruta
Fíjate que o el origen o el destino deben ser un archivo local. La copia remoto-a-remoto no está soportada.

Probemos rsync en archivos locales. Primero, limpiemos nuestro directorio foo:

[me@linuxbox ~]$ rm -rf foo/*

A continuación, sincronizaremos el directorio playground con su copia correspondiente en foo:

[me@linuxbox ~]$ rsync -av playground foo

Hemos incluido tanto la opción -a (para archivar - que produce recursividad y conservación de los atributos de los archivos) como la opción -v (salida detallada) para hacer un espejo del directorio playground dentro de foo. Mientras el comando se ejecuta, veremos una lista de los archivos y directorios que se están copiando. Al final, veremos un mensaje de resumen como este:

sent 135759 bytes received 57870 bytes 387258.00 bytes/sec
total size is 3230 speedup is 0.02

indicando la cantidad de copia realizada. Si ejecutamos el comando de nuevo, veremos un resultado diferente:

[me@linuxbox ~]$ rsync -av playgound foo
building file list ... done
sent 22635 bytes received 20 bytes 45310.00 bytes/sec
total size is 3230 speedup is 0.14

Fíjate que no había listado de archivos. Esto es porque rsync detectó que no había diferencias entre ~/playground y ~/foo/playground, y por tanto no necesitaba copiar nada. Si modificamos un archivo en playground y ejecutamos rsync de nuevo:

[me@linuxbox ~]$ touch playground/dir-099/file-Z
[me@linuxbox ~]$ rsync -av playground foo
building file list ... done
playground/dir-099/file-Z
sent 22685 bytes received 42 bytes 45454.00 bytes/sec
total size is 3230 speedup is 0.14

vemos que rsync detectó el cambio y copió sólo el archivo actualizado.

Como ejemplo práctico, consideremos el disco duro externo imaginario que usamos anteriormente con tar. Si conectamos el disco a nuestro sistema y, de nuevo, se monta en /media/BigDisk, podemos realizar una útil copia de seguridad del sistema creando primero un directorio llamado /backup en el disco externo, y luego usando rsync para copiar lo más importante de nuestro sistema en el disco externo:

[me@linuxbox ~]$ mkdir /media/BigDisk/backup
[me@linuxbox ~]$ sudo rsync -av --delete /etc /home /usr/local /media/BigDisk/backup

En este ejemplo, hemos copiado los directorios /etc, /home, y /usr/local de nuestro sistema a nuestro dispositivo de almacenamiento imaginario. Hemos incluido la opción --delete para eliminar archivos que existieran en el dispositivo de copia y que ya no existieran en el dispositivo original (esto es irrelevante la primera vez que hacemos una copia de seguridad, pero será útil en sucesivas copias). Repitiendo el procedimiento de conectar el disco externo y ejecutar este comando rsync sería una forma útil (aunque no ideal) de mantener un pequeño sistema respaldado. De acuerdo, un alias también aquí sería muy útil: Podríamos crear un alias y añadirlo a nuestro archivo .bashrc para proporcionar esta característica:

alias backup='sudo rsync -av --delete /etc /home /usr/local
/media/BigDisk/backup'

Ahora, todo lo que tenemos que hacer es conectar nuestro disco externo y ejecutar el comando backup para realizar el trabajo.

No hay comentarios:

Publicar un comentario