Copias de seguridad bien hechas, descubre cómo!

 El título de este artículo puede hacer pensar que vengo a explicar cómo se debe hacer backups o copias de seguridad en linux (aunque también es compatible con Windows y Mac), sin embargo, no soy quien para deciros cómo hacer vuestras copias, pero os vengo a enseñar una nueva herramienta que descubrí hace poco y la cual considero especialmente útil.

Dicho esto, si accedéis a la web de restic, podéis ver de dónde viene el título de este post. Consiste en una herramienta a la que sus propios autores le atribuyen las características de ser fácil, rápida, que realiza copias de seguridad verificables antes de ser recuperada, seguras, eficientes y gratis. Parece que no se puede pedir más, pero ahora veremos cuanto de cierto hay en esto. Ah! además tiene versiones para windows y mac, no todo iba a ser linux 🙂

Se trata de una herramienta que, al menos a mi, me recuerda mucho al software de control de versiones GIT. Básicamente para ser usado tendríamos que inicializar un repositorio, y sobre este añadir snapshots.

Un snapshot viene a ser una imagen del estado de un directorio o fichero en un momento concreto. Cada vez que hacemos un snapshot, restic verifica qué ha cambiado en el directorio (o fichero) e introduce los cambios.

Cuando empecemos a utilizarlo nos daremos cuenta de que nuestras copias de seguridad, sin estar comprimidas, pueden ocupar menos que los directorios de origen, y esto es porque restic tiene en cuenta los ficheros duplicados.

Crear un repositorio de backups

Un repositorio es el lugar donde se almacenarán todas las snapshots. Será un lugar de nuestro sistema local o de un sistema remoto en el cual podremos ir añadiendo snapshots.

Para comenzar crearemos un directorio para alojar nuestro repositorio:

mkdir repo

Ahora inicializaremos el repositorio dentro del directorio creado:

restic -r repo init

Restic nos pedirá un password para proteger el repositorio.

Tras facilitar dos veces la contraseña, vemos como nos advierte de que en caso de olvidar la contraseña no podremos acceder al repositorio.

Una vez finalizada, dispondremos de nuestro repositorio creado, ya podemos comenzar a realizar snapshots.

Primera copia de seguridad

Para empezar, esta prueba la voy a realizar con un directorio de prueba con tres archivos mp3 y una película avi, podéis ver el contenido del directorio aquí:

$ ls -l
-rw-r--r-- 1 hector users   9766912 Jul 11 16:25 audio1.mp3
-rw-r--r-- 1 hector users   7462912 Jul 11 16:25 audio2.mp3
-rw-r--r-- 1 hector users   8382464 Jul 11 16:25 audio3.mp3
-rw-r--r-- 1 hector users 729853952 Dec 31  2015 peli1.avi

Procedemos a realizar un snapshot de este directorio:

restic -r /home/hector/repo backup /home/hector/dir1

En la orden anterior podemos ver que tras la opción -r indicamos la ruta donde tenemos el repositorio. La palabra clave backup indica la operación a realizar, que sería un backup del directorio que aparece posteriormente.

La salida esperada es la siguiente:

enter password for repository: 
repository cb1ae6e7 opened successfully, password is correct
created new cache in /home/hector/.cache/restic

Files:           4 new,     0 changed,     0 unmodified
Dirs:            0 new,     0 changed,     0 unmodified
Added to the repo: 720.469 MiB

processed 4 files, 720.469 MiB in 0:11
snapshot 44984fe0 saved

El sistema nos pide el password del repositorio, posteriormente comienza a analizar y procesar. Vemos que crea el snapshot en sólo 11 segundos con un tamaño de 720.469Mb.

Ahora vamos a realizar modificaciones sobre los ficheros anteriores. Crearemos un directorio donde copiaremos el fichero peli.avi, y moveremos uno de los ficheros de audio. Posteriormente crearemos otro snapshot.

mkdir dir1/dir2
cp dir1/peli1.avi dir1/dir2/peli1.avi
mv dir1/audio1.mp3 dir1/dir2/audio1.mp3
restic -r /home/hector/repo backup /home/hector/dir1

Llegados a este punto el resultado será el siguiente:

enter password for repository: 
repository cb1ae6e7 opened successfully, password is correct

Files:           5 new,     0 changed,     0 unmodified
Dirs:            2 new,     0 changed,     0 unmodified
Added to the repo: 1.082 KiB

processed 5 files, 1.383 GiB in 0:10
snapshot b80dd1a7 saved

Bien, aquí vemos que se han procesado 1.383Gb, pero ese no es el tamaño que ocupa el repositorio, si no la cantidad de datos procesada.

Para ver el tamaño del repositorio:

du /home/hector/repo -sh

El comando du muestra el tamaño del contenido del directorio, con las opciones s y h conseguimos la suma de los tamaños de cada archivo y mostrarlo en formato legible. La salida es la siguiente:

722M	repo

Es decir, que el repositorio ocupa en nuestro disco sólo 722Mb.

Restaurar las copias de seguridad

Restaurar desde un snapshot es realmente fácil, primero vamos a consultar las snapshots que tenemos:

restic -r /home/hector/repo snapshots

La salida esperada es la siguiente:

enter password for repository: 
repository cb1ae6e7 opened successfully, password is correct
ID        Time                 Host        Tags        Paths
------------------------------------------------------------------------
44984fe0  2018-11-07 18:42:26  E6220                   /home/hector/dir1
b80dd1a7  2018-11-07 18:49:38  E6220                   /home/hector/dir1
------------------------------------------------------------------------
2 snapshots

Ahora vamos a restaurar el snapshot con ID b80dd1a7. Primero creamos el directorio donde vamos a restaurar y luego restauramos:

mkdir /home/hector/restore
restic -r /home/hector/repo restore b80dd1a7 --target /home/hector/restore

El resultado será el siguiente:

enter password for repository: 
repository cb1ae6e7 opened successfully, password is correct
restoring <Snapshot b80dd1a7 of [/home/hector/dir1] at 2018-11-07 18:49:38.960634027 +0100 CET by hector@E6220> to restore

Con esto nos encontraremos restaurada la copia.

Otras cuestiones de interés

Bien, en el artículo hemos ido a lo rápido, crear copias y restaurarlas, pero vamos a dejar algunos apuntes más que te vendrán bien.

Excluir ficheros es una operación útil ya que hay algunos que no nos interesará que sean respaldados, para ello existe la opción –exclude=”*.c” que en este caso excluiría los ficheros con extensión .c. Además se puede crear un fichero de texto con la lista de patrones a excluir usando la opción –exclude-file=fichero.txt

Si programamos copias de seguridad periódicas, nos interesará ir eliminar snapshots antiguas, por lo que la herramienta dispone de la opción forget. Con esta opción podrás eliminar snapshots según criterios diversos criterios. Aqui te pongo un ejemplo para eliminar todas las snapshots salvo las tres últimas:

restic -r /ruta/repo forget --keep-last 3

Para la realización de backups yo uso la siguiente secuencia de cara a ser incorporado en un script (o un .bat). Atentos:

#Hacer backup
restic -r /ruta/repo --verbose backup /ruta/datos --exclude-file /ruta/exclusiones.txt

#Eliminar todas las snapshots salvo las tres últimas
restic -r /ruta/repo forget --keep-last 3

#Buscar y eliminar ficheros innecesarios
restic -r /ruta/repo prune

Habrás reparado en que cada vez que lanzamos el comando, nos pedirá la contraseña del repositorio. Bien, para evitar que se nos pregunte la contraseña cada vez restic es capaz de leer la contraseña (en texto plano 🙁 ), desde las variables de entorno RESTIC_PASSWORD y RESTIC_PASSWORD_FILE.

También una cuestión súper interesante es la compatibilidad que tiene la herramienta con servicios de almacenamiento en la nube, y la integración con la herramienta que ya deberéis conocer por este blog rclone.

Aquí te dejo la documentación oficial para que consultes todas las opciones disponibles.

Y en el siguiente enlace podéis acceder a la descarga de restic, para windows, linux y mac.

Tomando nota de mis anteriores artículos sobre cron, rclone y este mismo, puedes montarte un sistema de backups automatizados que se ajuste a tus necesidades. ¡Te animo a ello!

Un saludo y espero que te haya gustado el artículo.