Borg est un utilitaire de sauvegarde, dont le principal avantage est la déduplication.
En bref, On crée un repository (un fichier/dossier linux), dans lequel on peut créer des archives qui contiennent les dossiers et fichiers que l'on souhaite sauvegarder. Les données sont stockées sous forme de blocs, et on ne trouve pas dans tout le repository 2 blocs identiques, les données sont dédupliquées (1 bloc peut servir à plusieurs fichiers).
Parmi les fonctions sympa, on va retrouver une vérification d'intégrité, la possibilité de prune les archives (c'est à dire de n'en garder qu'un certain nombre, comme la stratégie de stockage grand pere, pere, fils), et la sauvegarde à distance sur une autre machine.
ça commence par la création du repository :
borg init --encryption=repokey /path/to/repo
NOTES :
–encryption
est indispensable. Cela peut être un mdp repokey
, un fichier de chiffrement keyfile
, ou rien none
–append-only
permet les prunes et delete, mais pas le compact (les données ne sont pas donc pas supprimées)Pour plus de facilité, notamment dans un script automatisé, on peut définir des variables d'environnement pour définir l'accès au repository :
BORG_REPO=/path/to/repo/ BORG_PASSPHRASE='aAbBcCdDeE1234' # avec ou sans ' '
Maintenant que le repository existe, on peut ajouter des données dedans. Lors d'un ajout, toutes les données sont contenues dans une archive, il est commun de donner la date dans le nom
borg create /path/to/repo::Monday ~/src ~/Documents # ici l'archive s'appelle Monday
Note : si le repo n'est pas initialisé, on aura une erreur. Pratique si on a un mount qui peut ne pas marcher : aucun risque de mettre des données n'importe où
2 outils existent : info
et list
## --- info --- # sur un repo : donne la taille du repo (dedupliquée = sur le disque, originelle si extrait) borg info /path/to/repo/ # sur une archive : donne la taille de l'archive et du repo (dedupliquée = sur le disque, originelle si extrait) borg info /path/to/repo::archive-name ## --- list --- # sur un repo : donne la liste des archives qui compose le repo, avec la date de création des archives borg list /path/to/repo/ # sur une archive : donne la liste des fichiers et dossiers contenus dans l'archive borg list /path/to/repo::archive-name
Note: le path des fichiers et dossier est conservé, hein ;)
# extraire les données d'une archiveavec des chemins relatifs au dossier actuel cd /current/folder/ borg extract /path/to/repo::archive-name # extraire seulement quelques fichiers # ?
## --- delete --- # Supprimer l'archive, mais ne libère pas l'espace disque borg delete /path/to/repo::archive-name ## --- compact --- # recupérer de l'espace disque en compactant les segments de fichiers (notamment des archives supprimées) borg compact /path/to/repo
Note : on peut aussi prune
le repo, pour une suppression automatique d'archives selon des critères définis #stratégieDeSauvegarde
## --- prune --- borg prune --glob-archives 'pattern-*' --keep-daily 7 --keep-weekly 4 --keep-monthly 3 /path/to/repo/ # --glob-archives : permet de restreindre la purge aux archives qui match le pattern
L'idée est d'automatiser le processus de backup, par exemple avec un script déclenché par un crontab
### backup_auto.sh #!/bin/sh # Ce script a pour vocation la sauvegarde d'un dossier en particulier dans un dossier SMB mount. # Le préfix "auto" sera mis en place, et ces backups seront concernés par les prunes / purges # Variable d'environnement pour accéder au repo export BORG_REPO=/path/to/repo/ export BORG_PASSPHRASE=aAbBcCdDeE1234 # nom de la sauvegarde : manual + date du jour NAME="auto_$(date +%Y-%m-%d%.H-%M)" # Create the backup echo "starting backup" borg create --list --stats --progress ::$NAME /folder/to/backup/* backup_exit=$? echo "borg exit = $backup_exit" # prune echo "Pruning repository" borg prune --list --glob-archives "auto_*" --show-rc --keep-daily 7 --keep-weekly 3 --keep-monthly 2 # --show-rc : afficher le code de retour en dernier dans les logs # --glob-archives n'appliquer prune qu'aux archives qui match le pattern prune_exit=$? # compacting repository echo "compacting repository" borg compact compact_exit=$? # use highest exit code as global exit code global_exit=$(( backup_exit > prune_exit ? backup_exit : prune_exit )) global_exit=$(( compact_exit > global_exit ? compact_exit : global_exit )) echo "global exit = ${global_exit}" exit ${global_exit}
Il conviendrait de récupérer les info (echo) et les mettre dans un système de log, et de faire du reporting. Pour une prochaine fois !