Respaldando con rsync

rsync es una herramienta para respaldar y sincronizar archivos. (Puede ejecutarse en muchas variedades de *nix).

Una limitación de rsync es que NO puede copiar de un sistema remoto a otro sistema remoto. Si necesita hacer esto, tendrá que copiar uno de los remotos a un sistema local, y entonces copiarlo del local al otro sistema remoto. Esto es una limitación del rsync.

Con aptosid puede seleccionar cómo iniciar el proceso: desde la línea de comandos, o a través de un paquete deb en Debian sid:

Para el paquete deb:
apt-get install luckybackup

Página web de luckybackup.

Lo que sigue aquí es la versión de línea de órdenes

Lo siguiente le dará un conocimiento funcional de las capacidades de rsync, y algunos ejemplos de código para usar en un script propio de respaldo.

rsync es un programa para hacer copias de seguridad muy fácil de utilizar, que puede respaldar archivos y directorios rápidamente. Esto se logra a través de una rutina muy inteligente para detectar cuándo los archivos han cambiado para que solamente estos archivos sean seleccionados para copiar. El rsync también utiliza una utilidad de compresión para agilizar el proceso de copiado (cuando es lanzado con la opción -z especificada). Esto puede ser explicado muy sencillamente:

El programa rsync detecta archivos y carpetas que necesitan ser copiados porque uno o más de sus atributos han cambiado (por ejemplo, la fecha/hora de la última modificación, o el tamaño del archivo), en cualquier caso, algo ha cambiado desde el último respaldo. Este proceso de selección es muy rápido.

cuando el rsync ha terminado de preparar la lista que va a utilizar, la copia de estos archivos cambiados es realizada mucho más rápidamente a causa de una rutina de compresión realizada durante el copiado. El rsync comprime antes de enviar y descomprime en el destino, 'sobre la marcha'.

rsync puede copiar archivos desde:
* sistema local a otro sistema local,
* sistema local a un sistema remoto,
* sistema remoto a un sistema local.

Se utiliza el cliente, ssh de forma preseleccionada, o a través de un daemon rsync que se ejecuta tanto en el sistema local como en el remoto. Las páginas man dicen que si puede usar ssh en el sistema, entonces rsync también puede usar ssh.

Una limitación de rsync es que NO puede copiar de un sistema remoto a otro sistema remoto. Si necesita hacer esto, tendrá que copiar uno de los remotos a un sistema local, y entonces copiarlo del local al otro sistema remoto. Esto es una limitación del rsync.

Para darle un ejemplo, digamos que tenemos tres sistemas;

neo --el sistema local
morpheus --un sistema remoto
trinity --otro sistema remoto

Supongamos que desea utilizar rsync para copiar o sincronizar las carpetas /home/[user]/data de todos los sistemas en los otros. Cada sistema tiene un dueño específico, en otras palabras, un usuario distinto utiliza cada sistema específicamente, y por eso es aquel sistema el que debe ser usado como 'fuente' para los otros dos sistemas. Además, estará ejecutando el comando rsync en el sistema local solamente, que es el 'neo':

el usuario principal de neo es cuddles,
el usuario principal de morpheus es tartie, y
el usuario principal de trinity es taylar

Entonces, lo que necesita hacer es copias de seguridad o sincronización de los siguientes:

El área /home/cuddles/Data de neo copiado a morpheus y trinity,
el área /home/tartie/Data de morpheus a neo y trinity, y
el área /home/taylar/Data área de trinity a neo y morpheus.

El problema de rsync de no poder copiar de un sistema remoto a otro sistema remoto surge cuando llegamos al punto de respaldar trinity a morpheus, o de morpheus a trinity (los dos sistemas fuente y destino son remotos) por ejemplo:

neo --> morpheus --bien, es local a remoto
neo --> trinity --bien, es local a remoto
morpheus --> neo --bien, es remoto a local
trinity --> neo --bien, es remoto a local
morpheus --> trinity --remoto a remoto --no funciona
trinity --> morpheus --remoto a remoto --no funciona

Para resolver esta limitación, necesita cambiar un poco el esquema de rsync. Lo siguiente haría esto;

morpheus --> trinity --será:  morpheus --> neo & neo --> trinity
trinity --> morpheus --será:  trinity       --> neo & neo --> morpheus

Es un paso extra, obviamente, pero considerando que desea llevar los archivos también a neo, es solamente un cambio del origen de la fuente y no cambiará el resultado final. Así nuestro respaldo será bueno y no faltará nada.

Deberá tener en cuenta esta limitación de rsync cuando diseñe el proceso de respaldo.

Utilizando hostnames con hostnames con rsync.

Como hemos descrito arriba, usar neo, morpheus o trinity en lugar de sus direcciones IP físicas es un método limpio y fácil para hacer las cosas más fáciles de leer y entender. Poder utilizar la sintaxis nombre de máquina a nombre de máquina con rsync es fácil de hacer.

Necesitará editar el archivo /etc/hosts y agregar los hostnames y las direcciones IP correspondientes. Aquí está una pequeña porción de las primeras líneas del archivo /etc/hosts, mostrando las traducciones:

192.168.1.15	 neo
192.168.1.16	 morpheus
192.168.1.17	 trinity

La primera línea traduce la dirección IP 192.168.1.15 al nombre de 'neo', la segunda traduce 192.168.1.16 al nombre 'morpheus', y la tercera traduce la dirección IP 192.168.1.17 al nombre 'trinity'. Después de agregar lo de arriba y guardar el /etc/hosts, puede utilizar el nombre en vez de la dirección IP o puede seguir utilizando la dirección IP. Lo que hace esto realmente brillante es cuando cambia la dirección IP. Para darle un ejemplo, vamos a suponer que la dirección IP de neo ha cambiado de 192.168.1.15 a 192.168.1.25

Si tiene todos los scripts usando la dirección IP actual, tendrá que ubicarla en todos y cambiarlos a la nueva dirección. Pero si, de otra manera, en todos los scripts usa el 'nombre', lo único que tendrá que hacer es cambiar el archivo /etc/hosts para reflejar este cambio y todos los scripts seguirán funcionando. Esto puede ser muy útil cuando tiene muchos scripts para conexiones remotas a otros sistemas, o viceversa. El método de 'nombres' también hace que los scripts sean más fáciles de leer y seguir porque está usando un nombre reconocible asociado a la dirección IP en vez de una cadena de números.

rsync, y los dos maneras de utilizarlo.

Una manera es 'push' (empujar) archivos a un destino y el otro es 'pull' (halar, tirar) archivos desde la fuente o origen. Cada uno tiene sus ventajas y algunas desventajas. Vamos a estudiar cada una (para esta explicación, asumimos que uno de los sistemas es local y que el otro es un sistema remoto para mejor clarificar algo de la terminología.)

'push' (empujar) - el sistema local tiene los archivos y directorios de fuente u origen (source) en él, y la localización destinaria es un sistema remoto. El comando rsync es ejecutado en el sistema local, y 'empuja' sus archivos al sistema destinario (target).

Ventajas:
* Es posible tener más de un sistema respaldándose a un sistema destinario.
* El proceso de respaldo es distribuido sobre los sistemas de computación y no solamente un sistema haciendo todo el trabajo.
* Si un sistema es más veloz que otro, puede terminar antes de los demás y seguir con otras tareas.

Desventajas:
* Si esta usando un script y programándolos con el 'cron', necesitará actualización y el cambio de múltiples 'crontabs' en cada sistema, además de actualizar las versiones múltiples del script.
* El respaldo no puede verificar si el sistema remoto tiene la partición destinaria montada, por lo que puede no estar respaldando nada.

'pull' (tirar, halar) -- el sistema remoto tiene los archivos y directorios fuente u origen y el sistema destinario está en el sistema local. El comando rsync se ejecuta en el sistema local y 'tira' (pulls) los archivos desde el sistema fuente u origen.

Ventajas:
* Un sistema es convertido en el servidor, controlando todos los respaldos para todos los demás sistemas. Es un respaldo centralizado.
* Si está usando un script éste está contenido en un sólo sistema y es un solo script, lo que facilita sus actualizaciones y modificaciones.
* El script puede verificar, y montar si es necesario, la partición destinaria.

La sintaxis de rsync, como está descrita en las páginas man: (SRC = Fuente)
       rsync [OPCION]... SRC [SRC]... DEST

       rsync [OPCION]... SRC [SRC]... [USER@]HOST:DEST

       rsync [OPCION]... SRC [SRC]... [USER@]HOST::DEST

       rsync [OPCION]... SRC [SRC]... rsync://[USER@]HOST[:PORT]/DEST

       rsync [OPCION]... SRC

       rsync [OPCION]... [USER@]HOST:SRC [DEST]

       rsync [OPCION]... [USER@]HOST::SRC [DEST]

       rsync [OPCION]... rsync://[USER@]HOST[:PORT]/SRC [DEST]
Ejemplo funcional de comandos rsync:
rsync -agEvz --delete-after --exclude='*~' morpheus:/home/tartie /media/sda7/SysBackups/morpheus/home

Vamos a revisar algunas partes de este comando:

la ruta a la fuente (SRC) es: morpheus:/home/tartie
y la ruta al destinario (DEST) es: /media/sda7/SysBackups/morpheus/home

todo desde /home/tartie... será respaldado en /media/sda7/SysBackups/morpheus/home lo que resulta algo así:

/media/sda7/SysBackups/morpheus/home/tartie...

Hay que notar que la única razón por la que /tartie es ubicado en /home es por su designación como destinario y NO desde la fuente. La 'fuente' (SRC) solamente selecciona de dónde vienen los archivos, no a donde van. El destinario es lo que dice a rsync dónde debe poner los archivos que recibe de la fuente (SRC). Consideremos el siguiente ejemplo:

rsync [...] /home/user/data/files /media/sda7/SysBackups/neo

En el comando de arriba solamente el directorio /files y sus subdirectorios estarán en el directorio destinario, /neo --y no : /media/sda7/SysBackups/neo/home/user/data/files

Siempre tenga esto en consideración cuando esté creando los comandos de respaldo con el rsync.

Explicación de las opciones:
-a es utilizado para el modo de archivo. Según la página man, se explica esta opción 'en términos sencillos
como una manera de respaldar recursivamente y preservar 'casi' todo. Pero se menciona que este formato
no guarda los 'enlaces duros' (hardlinks) debido a la complejidad del proceso. La opción '-a' se describe
como la equivalente a lo siguiente: -rlptgoD lo que quiere decir: -r = recursivo – procesa sub-directorios y archivos encontrados en la ubicación de la fuente o SRC. -l = links (enlaces) – cuando los enlaces simbólicos (symlinks) se encuentran, los recrea en el sistema destinario. -p = permisos – dice a rsync a fijar los permisos en el destinaría igual que el fuente (SRC). -t = times (veces) – dice a rsync que fije la hora de los archivos en el destinario igual a la hora en la
fuente 'source' (SRC). -q = quieto – ordena a rsync dar la mínima salida en la pantalla, aunque podemos agregar un cierto nivel
de verbosidad al incluir la opción '-v' justo después del '-q'. Para hacer el proceso completamente silencioso,
borre el “v” del comando de arriba. -o = owner (dueño) – indica a rsync que si está ejecutando como superusuario (root), que fije los archivos
destinatarios con el mismo dueño que tiene la fuente (source). -D = es el equivalente de usar estos dos: --devices --specials --devices = causa que rsync transfiera archivos de dispositivos de carácter y bloque al sistema remoto para
recrear estos dispositivos. Desafortunadamente, si no incluye la opción '--super' en el mismo comando,
esto no tiene efecto. --specials = causa que rsync trasfiera archivos especiales tales como 'sockets' nombrados y fifos. -g es utilizado para preservar el atributo “group” de los archivos fuente en el destinario. -E es utilizado para preservar el atributo “executable” del archivo fuente en el archivo destinario. -v es utilizado para aumentar el nivel de verbosidad desplegado. Después, cuando estamos seguros de que está
respaldando lo que deseamos, puede quitar el 'v'. Sigue incluido en este ejemplo porque el proceso
se está ejecutado desde una tarea 'cron', y prefiere 'ver' lo que hace. Cada usuario tiene que decidir esto. -z se utiliza para comprimir los datos que serán transferidos o copiados, con el resultado de que el proceso
de copia se realice más rápidamente, porque los datos que son transferidos son más pequeños que el tamaño verdadero. --delete-after (borrar después) = borrar los archivos destinaros después de la transferencia, no antes.
Este 'después' se utiliza en caso de problemas o una rotura, y el 'delete' (borrar) es utilizado para eliminar
archivos destinatarios que ya no existen en el sistema fuente. --exclude = un patrón con el que se pueden excluir archivos o carpetas. En el ejemplo, --exclude=“*~” excluirá
CUALQUIER archivo o carpeta que termine en el carácter “~” al ser respaldado. Solamente un patrón
puede ser suministrado con la opción '--exclude', por lo que si necesita más de uno, tiene que incluir
líneas adicionales en la línea de comando.

Adicionalmente, aquí hay otras opciones útiles para la línea de comando:

-c – agrega otro nivel de verificaciones de las fuentes que se comparan con la destinaria después del proceso
de copiado, pero implica más tiempo para el proceso de copiado, y el rsync ya hace sus propias
comparaciones de los archivos fuente y destinario, entonces esta opción no fue incluída porque se retrasa
el proceso completo y es solamente una redundancia innecesaria. --super – implica, como dice la página man, que el sistema destinario intenta realizar funciones
del superusuario, 'root'. --dry-run – hace un simulacro de lo que será transferido sin transferir ningún archivo. Es similar al uso de la
opción -s con el apt-get install o el apt-get dist-upgrade.

El resto de nuestro comando es el archivo/directorio de la fuente (SRC) y después la ubicación del destino.

Ejemplos de algunos comandos:
rsync -agEvz --delete-after --exclude='*~' morpheus:/home/tartie /media/sda7/SysBackups/morpheus/home

Este comando respalda todos los archivos y todas las carpetas y sus contenidos por debajo de /home/tartie en el sistema de nombre 'morpheus', y los coloca en el directorio /media/sda7/SysBackups/morpheus/home – dejando fuera la estructura del árbol del directorio /tartie.

rsync -agEvz --delete-after --exclude='*~' /home/tartie' 'neo:/media/sda7/SysBackups/morpheus/home

Este comando es el contrario del anterior, 'empuja' (push) el directorio /home/tartie y todo su contenido y subdirectorios hacia el sistema nombrado neo en la mismo carpeta --tome nota de que un sistema se considera remoto cuando tiene dos puntos ':' (colon) al frente de la ruta.

rsync -agEvz --delete-after --exclude='*~' /home/cuddles /media/sda7/SysBackups/neo/home

Este comando realiza un respaldo local hacia un sistema local; note que no existe ningún ':' (colon) ni en la fuente ni en el destinario. Este comando respalda localmente el área /home/cuddles hacia la misma área en el mismo sistema: /media/sda7/SysBackups/neo/home.

Veamos cómo es un comando rsync con exclusiones múltiples:

rsync -agEvz --delete-after --exclude='*~' --exclude='*.c' --exclude='*.o' '/*' /media/sda7/SysBackups/neo

Este comando respalda TODO desde la raíz del sistema local con todos sus archivos/directorios y lo coloca en la ubicación destinaria: /media/sda7/SysBackups/neo –pero ahora se excluye cualquier archivo o directorio que termine con '~', '.c' ó '.o'

A continuación viene un ejemplo de un comando rsync que debe dar error y debe ser evitado en lo posible. Es un ejemplo de un comando ilegal para rsync al intentar respaldar directo de un sistema remoto a otro sistema remoto:

rsync -agEvz --delete-after --exclude='*~' morpheus:/home/tartie' 'trinity:/home

Como hemos mencionado anteriormente, esto es una limitación de rsync.

En un último comando de ejemplo veremos cómo aparece un rsync de remoto a local si reemplazamos los 'system names” (nombres de sistemas) con el número de la dirección IP efectiva.

Este primer comando es con el método 'name' (nombre), y el segundo es el mismo comando utilizando la Dirección IP

rsync -agEvz --delete-after --exclude='*~' morpheus:/home/tartie' '/media/sda7/SysBackups/morpheus/home
rsync -agEvz --delete-after --exclude='*~' 192.168.1.16:/home/tartie /media/sda7/SysBackups/morpheus/home

Como dijimos anteriormente, no tiene que usar necesariamente los nombres traducidos pero, como puede ver en el primer ejemplo, es más claro leer y entender lo que la orden va hacer que en el segundo.

Ahora ya debe ser capaz de diseñar un comando básico a partir de los ejemplos dados aquí, o a través de una mezcla y combinación de las opciones con los comandos para conseguir el efecto y la acción deseada.

Página modificado el 14/08/2010 0100 UTC