Sauvegarde des données avec BORG

De ArchwikiFR


Sauvegarde de ses données personnelles

Cet ajout au Wiki fait suite à la parution de :

et

En complément des solutions de Synchroniser vos ordinateurs on pourra donc utiliser l'excellent BORG, qui n'est (encore) que mentionné dans le WIKI

Principe : archivage par dé-duplication

  • Plutôt qu'accumuler les fichiers comme dans l'archivage classique par TAR, la dé-duplication vérifie par hashage l'identité des fichiers, quels que soient leurs noms, pour ne les copier qu'une fois.
  • Elle occupe ainsi, même sans compression, une place minimale pour des sauvegardes incréméntales répétées. L'option de compression, dont on peut choisir l'intensité, accentuera ce gain d'espace .
  • Enfin ces archives peuvent se "monter" très simplement dans le système de fichiers pour étude et récupération sélectives.

Installation

Le paquet borg étant dans les dépôts Community il suffit de:

# pacman -S borg

Utilisation

Le site du projet propose un Guide de démarrage

Les man donneront de nombreux exemples, liste des man disponibles par:

$ apropos borg

D'abord, bien sûr, créer et définir un emplacement pour les sauvegardes,

  • soit local : une partition dédiée, un disque externe,
  • soit distant : SSHFS, NFS, Samba…, l'utilisation de SSH est particulièrement recommandée et documentée
Note : Il est important, pour des données sensibles, de créer plusieurs sauvegardes sur des supports différents, règle du 3 - 2 -1

Puis se reporter à la documentation, le man, les exemples des sites en liens ci-dessus

  • commandes essentielles :
borg init, puis : borg create, borg list, borg check, borg mount, etc...
  • Depuis la version 1.1 la commande 'borg init' doit comporter la mention du mode de cryptage, cf.: Borg-Wiki, une sécurité par simple mot de passe sera donc initiée par :
$ borg init -e=repokey /path/to/repo (ou --encryption=repokey...)

Création des programmes

Exemples pour les données personnelles d'un utilisateur <user> :

  • Créer un fichier ~/.borg/exclusions : une ligne par dossier ou fichier
/home/user/ARCHIVES
/home/user/BACKUP
/home/user/Downloads
/home/user/VirtualBox*
/home/user/.thumbnails
/home/user/.thunderbird
...
Note : 1. "Due to whitespace removal paths with whitespace at the beginning or end can only be excluded using regular expressions"

donc, utiliser dans un fichier d'exclusion /home/user/Playon* et non /home/user/'PlayOnLinux's\ virtual\ drives/

Note : 2. Depuis la version 1.1.0-1 bien respecter l'ordre des options suivant : borg create [Options/Flags] ARCHIVE [PATH [PATH [...]]]
donc : options d'exclusions avant [SOURCE [DESTINATION [...]]]
Note : 3. Alléger la liste d'exclusions avec l'option: --exclude-caches , pour les répertoires contenant le fichier CACHEDIR.TAG (http://www.brynosaurus.com/cachedir/spec.html)

Usage : ] [--exclude-from EXCLUDEFILE] [--exclude-caches] [--exclude-if-present FILENAME

  • Créer un Script ,

par exemple un .local/bin/BorgData.sh, version très simplifiée de celui donné ici, la partition de BKP étant montée dans le fstab sur le dossier personnel "BACKUP ":

#!/bin/bash
## Backup quotidien du home de "user"

echo -e ""
echo -e "     \e[55;15;5;12m***** sauvegarde des données de "user" *****\e[0m"
echo -e ""

# on exporte cette variable pour pouvoir supprimer une sauvegarde
export BORG_UNKNOWN_UNENCRYPTED_REPO_ACCESS_IS_OK=yes

# Pour pouvoir afficher une notification système il faut exporter cette variable:
export DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus
# notification
notify-send 'Début de Sauvegarde des Données' --icon=dialog-information

## on peut - ou non - selon les exigences de sécurité
## renseigner ici la passphrase pour qu'elle ne soit 
## pas demandée de façon interactive par le programme
## en ce cas faire un chmod 700 sur ce script pour vous en réserver l'accès
## export BORG_PASSPHRASE='ma_phrase_secrète'

sourcefolder='/home/user'
REPOSITORY='/home/user/BACKUP/user_bkp'

borg create -v --stats --compression zlib,6 --exclude-from /home/user/EXCLUSIONS --exclude-caches $REPOSITORY::user_{now:%Y-%m-%d} $sourcefolder 

# ne conserver que les sauvegardes des : 7 derniers jours, 1/sem pour les 4 dernières semaines et 1/mois pour les 3 derniers mois

echo -e ""
echo -e "     \e[55;15;5;12m***** Rotation sauvegarde *****\e[0m"
borg prune -v $REPOSITORY --keep-daily=7 --keep-weekly=4 --keep-monthly=2  


sleep 2

echo -e ""
echo -e "     \e[55;15;5;12m***** sauvegarde terminée *****\e[0m"
echo -e ""


## Si on a créé la variable BORG_PASSPHRASE - Ne pas oublier de la supprimer 
## pour éviter qu'elle apparaisse avec la simple commande 'env' ... : décommentez
# unset BORG_PASSPHRASE

exit 0
  • Créer un programme, pour des données personnelles on peut le placer dans ~/.local/bin/ (remplacer terminal par la console de votre choix)
$ vim ~/.local/bin/bkp_mon_user
#!/bin/bash   
terminal -e  /path/to/BorgData.sh

on n'oublie pas:

$ chmod u+x ~/.local/bin/bkp_mon_user

Automatisation

Automatisation

Nous utilisons la configuration par défaut de cron, qui s'arrange pour que les scripts placés dans /etc/cron.daily soient exécutés quotidiennement.
Puisque les sauvegardes sont poussées, l'automatisation est à configurer sur le client uniquement.
Jusqu'ici, Borg nous demandait la phrase de passe à chaque opération. À des fins d'automatisation, il nous faut désormais la stocker dans un fichier :

root@babasse # mkdir /root/.borg
root@babasse # cat > /root/.borg/passphrase
monmotdepasse
([Ctrl]+[D] pour valider)

…et la protéger des autres utilisateurs de la machine :
root@babasse # chmod 700 /root/.borg/passphrase
Pour éviter la contrainte du renseignement de la passphrase en terminal à chaque commande Borg, on peut exporter la variable d'environnement/BORG ainsi :
export BORG_PASSPHRASE='exemple : complicated & long' comme expliqué ici 
Pour une meilleure sécurité, plutôt inclure cet export dans un script que de façon permanente dans le .bashrc/.zshrc même protégé par un "chmod 700"

* Pour  pouvoir afficher une notification système pour données personnelles, ajouter cette ligne au Script : 
export DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus

* Et, par exemple :
# notification
notify-send 'Sauvegarde des Données' 'Début' --icon=dialog-information
* Pour un Script de sauvegarde-système exécuté en root, insérer dans le script plutôt :
# Message système
sudo -u user DISPLAY=:0 DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus notify-send 'Sauvegarde-Système' 'Début' --icon=dialog-information
 
Référence
  • Créer le répertoire ~/.config/systemd/user/
  • Créer le service : ~/.config/systemd/user/bkp_mon_user.service
# [Unit]
Description=Sauvegarde des donnees de user

[Service]
Type=oneshot
ExecStart=~/.local/bin/bkp_mon_user

  • Créer le Timer : ~/.config/systemd/user/bkp_mon_user.timer
[Unit]
Description=Sauvegarde des donnees de user quotidienne
Documentation=man:borg  

[Timer]
OnBootSec=15min
OnUnitActiveSec=1d

[Install]
WantedBy=timers.target


  • Activer :
$ systemctl --user enable bkp_mon_user.timer
  • En cas de modification :
$ systemctl --user daemon-reload
  • Contrôle :
$ systemctl --user status bkp_mon_user.timer
$ journalctl -r --user-unit bkp_mon_user.service
$ du -sh /path/to/user_bkp

Restauration des données

  • On commence par lister les archives disponibles :
$ borg list /path/to/repo/DIR
  • la récupération de données personnelles se fera très simplement par montage d'une archive antérieure sur un répertoire créé ou existant, par la commande :
$ borg mount /path/to/repo/DIR/::nom_date /mnt/point
  • une fois la récupération terminée le démontage se fera par :
$ borg umount ~/mnt/point

Restauration du Système

  • pour une restauration du système à un état archivé, la commande est extract
Note : 1. Attention, commande en développement . Actuellement il y création de doublons dans la base de données de pacman en raison de l'absence - pour l'instant, voir ce post - d'une option --delete dans la commande borg extract.

Cette même option --delete, dans rsync, évite cette duplication, voir Sauvegarde système complète avec rsync, ceci fait recommander une restauration en 2 temps, voir ci-dessous

Note : 2. extract écrit toujours dans le répertoire courant

on se placera donc :

- soit, recommandé : dans un répertoire extérieur pour ensuite déplacer les seuls fichiers souhaités, ou tout le système, en deux temps avec la commande rsync -a --delete

- soit, directement dans le répertoire de destination mais en ôtant ensuite manuellement ou par un script, les doublons.

Pour une restauration complète à la date de la veille par exemple :

# cd /path/to/mount_point/
# borg extract $(echo /path/to/repo/DIR/::nom_`date -d yesterday +%F`)
# rsync -aAXv --delete --exclude={"/dev/*","/proc/*","/sys/*","/tmp/*","/run/*","/mnt/*","/media/*","/home/*","/lost+found"} /path/to/mount_point/ /  ## ne pas oublier le slash final de mount_point
  • pour une restauration d'un système devenu instable et/ou inutilisable :

- anticiper en remplaçant l'outil de sécurité minimum qu'est une archlinux.iso récente "gravée" sur une clef USB, par une archlinux.iso complétée et recompilée comme expliqué dans le Wiki.

On ajoutera en fin du fichier ~/archlive/releng/packages.x86_64 : vim borg fuse screen (1 nom par ligne) et éventuellement quelques lignes de commandes dans un fichier texte aide-mémoire ajouté à la racine : ~/archlive/releng/aide-memoire.txt.

Borg sera ainsi installé, fonctionnel, et son 'man' utilisable, ainsi qu'un vim complet et non minimum, une console sectionnable par screen.

Une fois lancée l'iso on montera les chemins source et destination dans des emplacements adéquats créés par, par exemple :

# mkdir /media{src,dest}

- on pourra aussi utiliser la commande :

# systemctl start gpm 

pour pouvoir si besoin "copier-coller" depuis l'aide-mémoire par la souris (sélection puis clic-milieu).


Voir aussi