Ir al contenido
  1. Blog/

Cómo respaldar tus archivos offline

··6 mins·
Atención: Esta entrada sobre respaldos con rsync se proporciona con fines informativos. Ten precaución, comprende los comandos y verifica las rutas para evitar pérdida de datos. El autor no se hace responsable de posibles problemas. Realiza primero pruebas en datos sin importancia. Tú eres responsable de la seguridad e integridad de tus datos.

Rsync #

rsync es una herramienta de sincronización y transferencia de archivos eficiente comúnmente utilizada en sistema operativos Unix. Su característica principal es el algorithmo de diferenciación, mejor descrito en inglés como delta encoding algorithm, que tiene por objetivo obtener únicamente las partes del archivo que han sido modificados desde su última versión.

Respaldos offline #

Con el auge de la nube, respaldar tus datos en algún servicio de los gigantes de la tecnología y poder accederlos desde cualquier dispositivo conectado a internet no había sido más fácil. Basta con instalar una aplicación, seleccionar los directorios a sincronizar y dar un par de clicks más al botón siguiente. La mayoría de estos servicios incluso ofrecen una opción gratuita con cierto límite de almacenamiento el cuál puede incrementarse al pagar una suscripción.

Por otro lado, los respaldos offline tienen también sus propias ventajas. Aunque los costos iniciales por lo general son mayores, estos son más predecibles y no están vinculados a suscripciones mensuales. La privacidad es otro aspecto importante que muchos usuarios valoramos.

No quiero iniciar una guerra sin sentido entre aquellos fieles usuarios de estos servicios, que nos brindan tantas facilidades, y quienes también buscamos tener más control de nuestros datos o simplemente expandir nuestras opciones.

Let’s script #

Hasta el día de hoy había hecho mis respaldos offline manualmente. Un proceso delicado y que lleva mucho tiempo. Siendo un usuario de Linux, y después de googlear un rato, me topé con la herramienta protagonista de este post.

A continuación, escribiremos paso a paso un script de bash que nos permitirá sincronizar nuestro directorio de inicio a un dispositivo externo. Cada vez que ejecutemos el script, rsync se encargará de copiar o eliminar cualquier archivo nuevo o inexistente del directorio principal en el dispositivo externo.

Origen y destino #

Las dos variables más importantes de nuestro script son la ruta origen y la de destino. En otras palabras, el directorio que queremos respaldar y el directorio donde guardaremos el respaldo.

 1#!/bin/bash
 2
 3# Como habíamos mencionado, respaldaremos nuestro directorio de inicio.
 4source_dir="$HOME"
 5
 6# Necesitamos correr el archivo con `sudo`
 7if ! [ $(id -u) = 0 ]; then
 8  echo "The script need to be run as root."
 9  exit 1
10elif [ -n "$SUDO_USER" ]; then
11  source_dir="/home/$SUDO_USER"
12fi
13
14# Recibiremos el directorio destino como un parametro en la línea de comando.
15if [ $# -ne 1 ]; then
16    echo "La ruta del directorio de destino no ha sido específicada."
17    exit 1
18fi
19destination_dir="$1"
20
21# Nos aseguramos que dicho directory existe.
22if [ ! -d "$destination_dir" ]; then
23    echo "El directorio de destino específicado no existe. Asegúrate que tu disco externo este montado."
24    exit 1
25fi
26
27# Let's test it
28echo "$destination_dir and $source_dir"

Vamos a probarlo.

$ ./Script/sync/sync.bash /this/is/a/test
/this/is/a/test and /home/mariomenjr

Registrar progreso #

Es importante tener en cuenta que las cosas pueden no salir bien a la primera. Por esta razón el siguiente paso es indicar un nombre de archivo para registrar el progreso de rsync. Para ello, generaremos un identificador único que usaremos para nombrar el archivo de registros según el script sea ejecutado.

26
27# Generamos un identificador único para nuestro archivo de registro.
28timestamp=$(date +"%Y%m%d_%H%M%S")
29
30# Obtenemos el directorio desde el cuál nuestro script se ejecuta.
31script_dir=$(dirname "$0")
32
33# Por último, concatenamos el directorio, el nombre del archivo y el identificador único.
34log_file="$script_dir/rsync.$timestamp.log"

Es hora de rsync #

Haciendo uso de los diferentes flags, rsync realizará los respaldos acumulativos de nuestro directorio de inicio.

35
36# Configuramos `rsync`
37rsync \
38    -av \
39    --delete \
40    --exclude="/.*" \
41    --exclude="/.*/" \
42    --exclude="/go/" \
43    --exclude="/Documents/Docker/" \
44    --exclude="rsync.*.log" \
45    --delete-excluded \
46    --progress \ 
47    "$source_dir/" "$destination_dir" \
48    >> "$log_file" 2>&1

Cada opción cumple una función que se explica a continuación:

  1. -av: tando a como v cumplen una función independiente. El primero le dice a rsync que se ejecute en modo archivo; esto garantiza la preservación de atributos y propiedades. El segundo le dice que muestre información detalla sobre la ejecución; capturaremos esta información en un .log.

  2. -delete: nuestra expectativa de un respaldo acumulativo incluye la eliminación de archivos en el destino que no exístan más en el origen, con el fin de mantener la carpeta destino como una réplica del origen.

  3. -exclude: estas opciones indican patrones de exclusión para archivos y directorios que no deben ser sincronizados.

  4. -delete-excluded: elimina archivos que hayan sido excluídos pero previamente replicados.

  5. -progress: nos muestra el progreso de la sincronización, indicando cuál archivo está siendo transferidos y su porcentaje de replicación.

  6. Como última opción, debemos específicar las rutas del directorio a replicar ó $source_dir y del directorio destino ó $destination_dir.

  7. Al final, y sin ser estricamente parte de las opciones de rsync, redirigimos la salida estándar y de error al archivo de registro especificado por la variable $log_file.

TL;DR #

El script resultante.

 1#!/bin/bash
 2
 3# Como habíamos mencionado, respaldaremos nuestro directorio de inicio.
 4source_dir="$HOME"
 5
 6# Necesitamos correr el archivo con `sudo`
 7if ! [ $(id -u) = 0 ]; then
 8  echo "The script need to be run as root."
 9  exit 1
10elif [ -n "$SUDO_USER" ]; then
11  source_dir="/home/$SUDO_USER"
12fi
13
14# Recibiremos el directorio destino como un parametro en la línea de comando.
15if [ $# -ne 1 ]; then
16    echo "La ruta del directorio de destino no ha sido específicada."
17    exit 1
18fi
19destination_dir="$1"
20
21# Nos aseguramos que dicho directory existe.
22if [ ! -d "$destination_dir" ]; then
23    echo "El directorio de destino específicado no existe. Asegúrate que tu disco externo este montado."
24    exit 1
25fi
26
27# Generamos un identificador único para nuestro archivo de registro.
28timestamp=$(date +"%Y%m%d_%H%M%S")
29
30# Obtenemos el directorio desde el cuál nuestro script se ejecuta.
31script_dir=$(dirname "$0")
32
33# Por último, concatenamos el directorio, el nombre del archivo y el identificador único.
34log_file="$script_dir/rsync.$timestamp.log"
35
36# Configuramos `rsync`
37rsync \
38    -av \
39    --delete \
40    --exclude="/.*" \
41    --exclude="/.*/" \
42    --exclude="/go/" \
43    --exclude="/Documents/Docker/" \
44    --exclude="rsync.*.log" \
45    --delete-excluded \
46    --progress \ 
47    "$source_dir/" "$destination_dir" \
48    >> "$log_file" 2>&1
49
50echo "Syncronización completada existosamente. Revisa $log_file para más detalles."

Referencias #