====== borgbackup "borg" ====== 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. ===== Gérer un repo borg ===== === Création/initialisation d'un repo === ça commence par la création du __repository__ : borg init --encryption=repokey /path/to/repo NOTES : * Un __repository__ nécessite une méthode de chiffrement, l'argument ''--encryption'' est indispensable. Cela peut être un mdp ''repokey'', un fichier de chiffrement ''keyfile'', ou rien ''none'' * L'option ''--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 ' ' === Créer une archive === 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ù === Consulter le repo / une archive === 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 des données === # 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 # ? === Supprimer une archive === ## --- 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 ===== Exemple de script automatisé ===== 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 !