Introducción
Hace unos días en mi meditado repaso de twitter matinal leía que sólo existen dos tipos de personas:
- Aquellos que hacen Backup.
- Aquellos que harán Backup.
En esta serie de posts sobre herramientas de Backup os he ido presentando, mezcladas entre distintas criaturas fantásticas, utilidades que os permitirán pertenecer al selecto club del primer grupo.
Hoy os traigo, con su criatura fantástica de rigor, una herramienta llamada BorgBackup, simplificado Borg. Se trata de un software de Backup con deduplicación, cifrado y compresión de datos.
Las principales características de Borg son:
- Uso eficiente del espacio. Gracias a la deduplicación el espacio usado por los trabajos de copia se reduce.
- Velocidad. El código fuente que se encarga de la deduplicación, compresión y cifrado está escrito en C.
- Cifrado. Toda la información se puede cifrar mediante AES 256-bit, la integridad de la información es verificada mediante HMAC-SHA256 y el cifrado se realiza en el lado del cliente.
- Compresión. Los datos pueden ser comprimidos opcionalmente mediante lz4, zstd, zlib o lzma.
- Backup Off-site. Borg puede guardar tus backups en cualquier máquina que soporte el protocolo ssh.
- Los repositorios de backup pueden ser montados como sistemas de ficheros.
- Fácil instalación en multitud de plataformas.
- Es una utilidad Open Source con licencia BSD.
Borg trabaja con repositorios de una forma parecida a la herramienta Restic que vimos en el primer post.
Guía rápida de uso
# Inicializamos el repositorio e introducimos la clave $ borg init --encryption=repokey /srv/backups Enter new passphrase: Enter same passphrase again: Do you want your passphrase to be displayed for verification? : y Your passphrase (between double-quotes): "ClaveGTK" Make sure the passphrase displayed above is exactly what you wanted. IMPORTANT: you will need both KEY AND PASSPHRASE to access this repo! Use "borg key export" to export the key, optionally in printable format. Write down the passphrase. Store both at safe place(s).
# Creamos un backup llamado 'Jueves' que guardará el directorio 'Documentos' $ borg create /srv/backups::Jueves ~/Documentos Enter passphrase for key /srv/backups: # Ahora revisaremos el repositorio en busca de los backups que contiene $ borg list /srv/backups Enter passphrase for key /srv/backups: Jueves Thu, 2018-09-27 23:06:54 # Podemos ver la información del repositorio completo mediante el comando `info` $ borg info /srv/backups Enter passphrase for key /srv/backups: Repository ID: 5cdd7d0faa555d07321ab35ec418d36c3d2f9375d33b0ed625235244dfbee46e Location: /srv/backups Encrypted: Yes (repokey) Cache: /home/fjfunes/.cache/borg/5cdd7d0faa555d07321ab35ec418d36c3d2f9375d33b0ed625235244dfbee46e Security dir: /home/fjfunes/.config/borg/security/5cdd7d0faa555d07321ab35ec418d36c3d2f9375d33b0ed625235244dfbee46e ------------------------------------------------------------------------------ Original size Compressed size Deduplicated size All archives: 74.39 MB 52.41 MB 51.10 MB Unique chunks Total chunks Chunk index: 3619 3948 # Y por último podemos ver el contenido del archivo llamado 'Jueves' $ borg list /srv/backups::Jueves Enter passphrase for key /srv/backups: drwxr-xr-x fjfunes fjfunes 0 Thu, 2018-09-27 23:03:24 home/fjfunes/Documentos drwxr-xr-x fjfunes fjfunes 0 Sat, 2018-08-11 19:54:59 home/fjfunes/Documentos/devilbox drwxr-xr-x fjfunes fjfunes 0 Thu, 2018-09-27 23:03:30 home/fjfunes/Documentos/devilbox/.git drwxr-xr-x fjfunes fjfunes 0 Sat, 2018-08-11 19:54:16 home/fjfunes/Documentos/devilbox/.git/info -rw-r--r-- fjfunes fjfunes 240 Sat, 2018-08-11 19:54:16 home/fjfunes/Documentos/devilbox/.git/info/exclude drwxr-xr-x fjfunes fjfunes 0 Sat, 2018-08-11 19:54:16 home/fjfunes/Documentos/devilbox/.git/branches drwxr-xr-x fjfunes fjfunes 0 Sat, 2018-08-11 19:54:16 home/fjfunes/Documentos/devilbox/.git/hooks ... ... ...
Como veis, es fácil realizar un Backup de un directorio. Aunque, en este caso, el repositorio sea local también podríamos utilizar un repositorio remoto mediante `ssh` utilizando la siguiente sintaxis al inicializarlo: `borg init –encryption=repokey ssh://user@host:path/to/repo`.
Automatizando Borg
# Fichero backup_con_borg.sh #!/bin/sh # Dirección del repositorio remoto (haremos uso de claves públicas para acceder) export BORG_REPO=ssh://user@host/srv/backups # Password del repo (ojo con los permisos!!) export BORG_PASSPHRASE='ClaveGTK' # helpers info() { printf "\n%s %s\n\n" "$( date )" "$*" >&2; } trap 'echo $( date ) Backup interrupted >&2; exit 2' INT TERM info "Starting backup" # Crearemos un backup de las carpetas más importantes # cuyo nombre será el de la máquina en la que corremos el script: borg create \ --verbose \ --filter AME \ --list \ --stats \ --show-rc \ --compression lz4 \ --exclude-caches \ --exclude '/home/*/.cache/*' \ --exclude '/var/cache/*' \ --exclude '/var/tmp/*' \ \ ::'{hostname}-{now}' \ /etc \ /home \ /root \ /var \ backup_exit=$? info "Pruning repository" # Después de realizar la copia purgaremos el repositorio para mantener # un esquema de backup que nos permita guardar 7 copias diarias, # 4 semanales y 6 mensuales. borg prune \ --list \ --prefix '{hostname}-' \ --show-rc \ --keep-daily 7 \ --keep-weekly 4 \ --keep-monthly 6 \ prune_exit=$? # código de salida global_exit=$(( backup_exit > prune_exit ? backup_exit : prune_exit )) if ; then info "Backup and/or Prune finished with a warning" fi if ; then info "Backup and/or Prune finished with an error" fi exit ${global_exit}
Ahora, sólo tendríamos que agregar el fichero a nuestro `cron`, a la hora deseada para tener un sistema de Backup basado en la herramienta Borg.