Mettez un manchot dans votre PC
Dernière modification 30 septembre 2023
Cette solution de sauvegarde est basée sur le système de fichier btrfs qui intègre intrinsèquement des fonctionnalités facilitant la sauvegarde, l'outil borg qui permet de mettre en place très facilement des sauvegardes incrémentales et unison un outil graphique qui gère les sauvegardes en mode manuel.
Suite aux commentaires sur mon premier journal linuxfr et à un deuxième journal sur linuxfr j'ai complété le dispositif de sauvegarde par :- une solution de sauvegarde et de partage des données base sur un cloud payant kdrive d'infomaniak avec un dispositif de synchronisation automatique et des sauvegardes manuelles. Cette sauvegarde à distance vient compléter le dispositif local et permet de le rendre encore plus robuste à un sinistre qui détruirait à la fois le serveur et les sauvegardes locales. Un troisième journal sur linuxfr détaille ce point précis, je vous invite à découvrir les commentaires qui ont été faits sur ces trois journaux qui sont assez instructifs sur les éventuelles autres solutions de sauvegarde.
- une pure solution de sauvegarde avec des données stockées chiffrées en utilisant rclone et Google Drive
Ces solutions basées sur le cloud sont développées dans cette autre page.
Outils | Ligne de commande et intégrable à un script bash | GUI | chiffrement des données intégré | Synchronisation avec certains clouds (liste dans le lien) | Liens utiles |
duplicity | Oui | Non | Oui | Oui | lien 1, lien 2 |
duplicati | Oui | Oui | Oui | Oui | lien 1, lien 2 |
restic | Oui | Non | Oui | Oui | lien 1, lien 2 |
btrfs ou B-tree File System (qu'on prononce souvent ButterFS !) est un système de fichiers développé par Oracle, plutôt que paraphraser ce qu'on peut trouver sur le net, je vous renvoie vers ces pages pour plus de détail, en français:
en anglais:
La commande suivante donne des informations détaillées sur le système de fichier
btrfs filesystem usage /data
Voilà le résultat
Overall:
Device
size:
6.00TiB
Device
allocated:
2.04TiB
Device
unallocated:
3.95TiB
Device
missing:
0.00B
Used:
2.04TiB
Free
(estimated):
3.95TiB (min: 1.98TiB)
Data
ratio:
1.00
Metadata
ratio:
2.00
Global
reserve:
512.00MiB (used: 0.00B)
Multiple
profiles:
no
Data,single: Size:2.04TiB, Used:2.04TiB (99.98%)
/dev/sdb1 2.04TiB
Metadata,DUP: Size:3.00GiB, Used:2.27GiB (75.65%)
/dev/sdb1 6.00GiB
System,DUP: Size:8.00MiB, Used:240.00KiB (2.93%)
/dev/sdb1 16.00MiB
Unallocated:
/dev/sdb1 3.95TiB
Donc un espace total de 6To avec 2To utilisé. Pour avoir des informations sur l'état de l'espace, on tapera la commande
btrfs device stats /data
voilà le résultat
[/dev/sdb1].write_io_errs 0
[/dev/sdb1].read_io_errs 0
[/dev/sdb1].flush_io_errs 0
[/dev/sdb1].corruption_errs 0
[/dev/sdb1].generation_errs 0
btrfs permet certaines opérations de maintenance :
Sur cette page on trouvera davantage d'informations sur l'ensemble de ces opérations.
On peut automatiser toutes ces opérations, l'ensemble des scripts fournis par btrfsmaintenance fait ça très bien. C'est une sorte de boîte à outils pour maintenir un système de fichiers btrfs. Le site officiel est https://github.com/kdave/btrfsmaintenance on récupère l'archive qu'on décompresse en tapant
unzip btrfsmaintenance-master.zip
cela donne le répertoire btrfsmaintenance-master dans lequel on tape en tant que root./dist-install.sh
cela donne
Installation path: /etc/sysconfigon fera de même pour les autres snapshots. Attention le système de fichiers d'accueil, ici en l’occurrence /run/mount2/ doit être également formaté en btrfs. Pour liste ce que contient ce système de fichier d'accueil on tapera :
btrfs subvolume list /run/mount2
voilà le résultat
ID 257 gen 2883 top level 5 path backup
ID 886 gen 690 top level 257 path backup/2021-01-10-snapshot-bureautique
ID 890 gen 703 top level 257 path backup/2021-01-10-snapshot-homepage
ID 898 gen 731 top level 257 path backup/2021-01-10-snapshot-musiques
ID 921 gen 1575 top level 257 path backup/2021-01-10-snapshot-photos
Pour supprimer un snapshot ou d'une manière générale un sous volume, il ne faut pas passer par un rm classique, il faudra taper
Snapper est un outil qui va vous aider à gérer les snapshots même si ça reste un outil en ligne de commande. Je l'ai installé sur ma Mageia simplement avec la commande urpmi mais à toutes fins utiles le site officiel est http://snapper.io/.
Pour illustrer son fonctionnement j'en reviens à mon répertoire /data et on crée une configuration avec la commande
snapper -c data create-config /data
ça me renvoie
Échec de la création de la configuration (creating btrfs subvolume .snapshots failed since it already exists).
forcément j'avais déjà créé préalablement un sous volume .snapshots qu'on voit bien quand je tape
btrfs subvolume list /data
ID 2358 gen 9137 top level 5 path bureautique
ID 2359 gen 9143 top level 5 path homepage
ID 2360 gen 6631 top level 5 path musiques
ID 2361 gen 9140 top level 5 path photos
ID 2362 gen 9135 top level 5 path videos
ID 2368 gen 6151 top level 5 path
.snapshots/2021-01-10-snapshot-bureautique
ID 2369 gen 6152 top level 5 path
.snapshots/2021-01-10-snapshot-homepage
ID 2370 gen 6153 top level 5 path
.snapshots/2021-01-10-snapshot-musiques
ID 2371 gen 6154 top level 5 path
.snapshots/2021-01-10-snapshot-photos
ID 2372 gen 6155 top level 5 path
.snapshots/2021-01-10-snapshot-videos
Pas grave, on va renommer mon sous volume /data/.snapshots qui va être recréé par snapper
cd /data
mv .snapshots/ .instantanes
Borg est un outil de sauvegarde particulièrement puissant et simple à mettre en oeuvre, le site officiel est https://borgbackup.readthedocs.io/en/stable/ et on trouvera plus d'informations par ici ou là. Sur ma Mageia, une fois n'est pas coutume, je me suis contenté d'installer le package fourni par la distribution en tapant
urpmi borgbackup
Autre alternative on peut passer par python
et pip pour l'installer, avant d'aller plus loin il faudra sans
doute installer le package lib64python3-devel et
lib64xxhash-devel puis en tant que root on tape
pip install -U pip setuptools wheel
pip install pkgconfig
pip install borgbackup
voilà le résultat
Collecting borgbackup
Downloading borgbackup-1.2.1.tar.gz (4.0 MB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
4.0/4.0 MB 1.3 MB/s eta 0:00:00
Installing build dependencies ... done
Getting requirements to build wheel ... done
Installing backend dependencies ... done
Preparing metadata (pyproject.toml) ... done
Requirement already satisfied: packaging in
./borg-env/lib/python3.8/site-packages (from borgbackup) (21.3)
Collecting msgpack!=1.0.1,<=1.0.4,>=0.5.6
Downloading
msgpack-1.0.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
(322 kB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
322.5/322.5 kB 785.1 kB/s eta 0:00:00
Requirement already satisfied: pyparsing!=3.0.5,>=2.0.2 in
./borg-env/lib/python3.8/site-packages (from packaging->borgbackup)
(3.0.9)
Building wheels for collected packages: borgbackup
Building wheel for borgbackup (pyproject.toml) ... done
Created wheel for borgbackup:
filename=borgbackup-1.2.1-cp38-cp38-linux_x86_64.whl size=3104598
sha256=6eb754bb4dbda17cbb090866401ae37cdf57675e533320e0816bbf3908e8583b
Stored in directory:
/home/olivier/.cache/pip/wheels/d6/35/34/951fead78c86a6b60981ed233d1aec7f66f23951fc13834b02
Successfully built borgbackup
Installing collected packages: msgpack, borgbackup
Successfully installed borgbackup-1.2.1 msgpack-1.0.4
c'est tout bon !
La première chose à faire est créer un dépôt de sauvegarde
borg init --encryption=authenticated /media/sauvegardes/
voilà le résultat
Enter new passphrase:
Enter same passphrase again:
Do you want your passphrase to be displayed for verification? [yN]: y
Your passphrase (between double-quotes): "XXXX"
Make sure the passphrase displayed above is exactly what you wanted.
By default repositories initialized with this version will produce
security
errors if written to with an older version (up to and including Borg
1.0.8).
If you want to use these older versions, you can disable the check by
running:
borg upgrade --disable-tam /media/sauvegardes
See
https://borgbackup.readthedocs.io/en/stable/changes.html#pre-1-0-9-manifest-spoofing-vulnerability
for details about the security implications.
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).
Il sera nécessaire de choisir une méthode de chiffrement, le mode authenticated n'utilise pas de clé de chiffrement, mais une méthode d'authentification avec un hash HMAC-SHA256 pour être précis.
Pour créer une archive contenant le répertoire /data on tapera
borg create /media/sauvegardes::2021-01-12 /data
pour lister les sauvegardes dans le dépôt, on tapera
borg list /media/sauvegardes
Il faudra saisir le mot de passe
Enter passphrase for key /media/sauvegardes:
et voilà ce que ça peut donner au bout d'un certain temps avec
le script détaillé plus bas dans cette page
2021-06-30
Wed, 2021-06-30 04:46:41
[570c42c2f51e83b69f7845d50b928ac42581745b587c2b34c16daefd2b2a44c6]
2021-07-31
Sat, 2021-07-31 04:41:52
[61196c2af59b05045a94ca88b213bc37ff640295ac09f72c54e7dcdc02b2eea2]
2021-08-29
Sun, 2021-08-29 04:42:29
[4eb7f68a996b5ea9f38267cf9d205c0572887f9695f3c5fe8b7719f5a23988a4]
2021-09-30
Thu, 2021-09-30 04:28:54
[739a9068bee4d61b5d3e19e5065ba7c14ca16c2097656d6006e6211967651f76]
2021-10-31
Sun, 2021-10-31 04:49:47
[d95f0a77bd03897a17bd88b71e09e5f458fc94745d3077d4a350fdee3a231c7d]
2021-11-21
Sun, 2021-11-21 04:44:25
[b6c889c3fcd7dc1fd5dbcf5aa7a98487cd869ff389189680f9e8ec250141de46]
2021-11-28
Sun, 2021-11-28 04:44:20
[8fcfc9aacb7740eb19091d582a3660ebeb7853e3371118c9fce78095d522ec47]
2021-11-30
Tue, 2021-11-30 04:52:15
[7c39c801b2bc4c66076d92d124adcc36b4cf77a932a106cb3e37b6d8b374a133]
2021-12-05
Sun, 2021-12-05 04:11:58
[7f5d1ac609cc48dd2591aaff5ee38638746ccc90cd25d9aae9c4e4fe0811d1c4]
2021-12-12
Sun, 2021-12-12 04:24:59
[f70f132e630eada058f392297396b4dff4030e0a90dd32ef75103ee29f2ac821]
2021-12-15
Wed, 2021-12-15 04:26:36
[72680bbdcbe24c53ff5021f094c8f3092003409d982b468adca06714ed240767]
2021-12-16
Thu, 2021-12-16 04:34:44
[38d5fec4a3cf5eaa288b99ec0b5569f638875f9eb678d2cb3af6b3a74851b7b9]
2021-12-17
Fri, 2021-12-17 04:24:19
[535a5c89e9b395f9b49b55d15563f9cd34e0269a46854e3aff037709f8372e38]
2021-12-18
Sat, 2021-12-18 04:26:07
[c4ef77daa969f45453afd5dfb0d7232ffaad6de0afcff73beb19349aeafcb314]
2021-12-19
Sun, 2021-12-19 04:24:52
[6fa254f97fc3a00fc9ff33e6e14800b08e2654509bfd56cb1ed7837ea8cc889b]
2021-12-20
Mon, 2021-12-20 04:34:39
[1cfadcf67a366703b07f36395dc048b806609d086ee149e1ff995358cc34debd]
2021-12-21
Tue, 2021-12-21 04:33:02
[fbeca3841f3a9340222927c769106111bf5f982324de405f7008a2ad930db6e8]
La semaine en cours on retrouve une sauvegarde par jour puis ça s'espace, le mois courant c'est une sauvegarde par semaine, puis les mois précédents une sauvegarde par mois. Dans le cas présent je remonte 6 mois en arrière.
Pour visualiser le contenu de l'archvie
borg list /media/sauvegardes::2021-01-09
Enter passphrase for key /media/sauvegardes:
et le contenu s'affiche
drwxr-xr-x root
root 0 Wed,
2021-01-06 17:16:14 etc
drwxr-xr-x root
root 0 Sun,
2020-11-22 11:24:56 etc/profile.d
-rw-r--r-- root
root 143 Fri, 2019-11-01
10:28:30 etc/profile.d/30python2.csh
-rwxr-xr-x root root
1552 Wed, 2018-09-26 04:45:42 etc/profile.d/40configure_keyboard.sh
-rwxr-xr-x root
root 243 Mon, 2020-08-24
18:06:27 etc/profile.d/60qt5.csh
-rwxr-xr-x root
root 444 Mon, 2020-08-24
18:06:27 etc/profile.d/60qt5.sh
-rw-r--r-- root root
1144 Sat, 2020-06-06 08:01:08 etc/profile.d/01msec.csh
-rw-r--r-- root
root 561 Sat, 2020-06-06
08:01:08 etc/profile.d/01msec.sh
(...)
Pour une restauration dans le répertoire courant, on tapera
borg extract /media/sauvegardes::2021-01-09
Pour une restauration dans le répertoire /data/temp
borg extract /media/sauvegardes::2021-01-09 /data/temp
ou autre solution, on monte l'archive dans un répertoire temporaire
borg mount /media/sauvegardes::2021-01-09 /media/borg
on récupère ce qu'on veut puis on démonte l'archive
borg umount /media/borg
Pour supprimer une archive
borg delete /media/sauvegardes::2021-01-09
A noter que si vous avez l'erreur suivante lors du montage de l'archive
borg mount not available: no FUSE support,
BORG_FUSE_IMPL=pyfuse3,llfuse
il faudra penser à installer le package python3-llfuse
On commencera à saisir le mot de passe d'authentification du dépôt borg
dans un fichier passphrase sous le répertoire /root/.borg
mkdir /root/.borg
/root/.borg/passphrase
on donneral les droits d'écriture seul à root à ce fichier
chmod 400 /root/.borg/passphrase
maintenant j'ai créé un fichier /etc/cron.daily/sauvegarde pour qu'il soit lancé quotidiennement à 4h du mat sur ma Mageia. Il contient tout d'abord une batterie de test d'intégrité du disque et ne lance le script /usr/sbin/borg-sauve que si les tests sont passés avec succès.
#!/bin/bash
#lancement d'une commande de test d'intégrité du raid hard
/usr/local/linux/systeme/hwraid-master/wrapper-scripts/megaclisas-status
> /tmp/megastatus 2>&1
# chemin du dépôt de sauvegarde qui est sur un disque externe
distant1="/media/sauvegardes"
# test de vérification de la présence du disque de sauvegarde
if [ ! -e "$distant1" ]
then
#le disque n'est pas monté, j'envoie juste le mail
d'état du raid et je stoppe le script
cat /tmp/megastatus | mail -s "Etat raid" olivier
exit
fi
#test de l'état de santé du disque dur externe
/usr/sbin/smartctl -a /dev/sdc >> /tmp/megastatus 2>&1
#envoi du mail de l'état des disques de mana
cat /tmp/megastatus | mail -s "Etat disk mana" olivier
# test de l'état du raid, en mode Degraded je stoppe tout
raid=$(MegaCli64 -LDInfo -L1 -a0 | grep State)
if echo $raid | grep Degraded >/dev/null 2>&1
then
exit
fi
#test de l'état du disque dur externe
ddur=$(/usr/sbin/smartctl -A /dev/sdc)
if echo $ddur | grep FAILING_NOW >/dev/null 2>&1
then
exit
fi
/usr/sbin/borg-sauve
On en vient au script /usr/sbin/borg-sauve, les références qui m'ont aidé à le rédiger sont :
https://code.crapouillou.net/snippets/1
https://www.geek-directeur-technique.com/2017/07/17/utilisation-de-mysqldump
https://borgbackup.readthedocs.io/en/stable/quickstart.html#automating-backups
En plus de faire des sauvegardes régulières dans le dépôt de répertoires
particuliers, le script sauvegarde également des bases MySQL
et LDAP et envoie des mails pour rendre
compte de la sauvegarde. Voilà le contenu du script
#!/bin/bash
# Script de sauvegarde basé sur borg
# Les sauvegardes sont chiffrées
set -e
#fonction de datation
ts_log() {
echo `date '+%Y-%m-%d %H:%m:%S'` $1 >>
${LOG_PATH_TMP}
}
#définition de chemins de binaires
BORG=/usr/bin/borg
MYSQLDUMP=/usr/local/mysql/bin/mysqldump
MYSQL=/usr/local/mysql/bin/mysql
SLAPCAT=/usr/local/sbin/slapcat
#définition de variables
BACKUP_DATE=`date +%Y-%m-%d`
LOG_PATH_TMP=/var/log/sauvegarde/borg-backup-tmp.log
LOG_PATH=/var/log/sauvegarde/borg-backup.log
export BORG_PASSPHRASE="`cat /root/.borg/passphrase`"
BORG_REPOSITORY=/media/sauvegardes
BORG_ARCHIVE=${BORG_REPOSITORY}::${BACKUP_DATE}
#définition de variables pour les bases MySQL et LDAP
# on définira le mot de passe MySQL dans ce fichier
MYSQL_ROOT_PASS=`cat /root/.mysql/passphrase`
DATABASES=`MYSQL_PWD=$MYSQL_ROOT_PASS $MYSQL -u root -e "SHOW
DATABASES;" | tr -d "| " | grep -v -e Database -e _schema -e mysqli -e
sys`
LDAP_TMP_DUMP_FILE=/var/log/sauvegarde/ldap/ldab-db.ldif
# c'est parti, on commence à dater la sauvegarde
rm -f $LOG_PATH_TMP
ts_log "Starting new backup ${BACKUP_DATE}..."
# on copie les bases MySQL
ts_log 'Copie des bases MySQL...'
for DB_NAME in $DATABASES; do
MYSQL_PWD=$MYSQL_ROOT_PASS $MYSQLDUMP -u root
--single-transaction --skip-lock-tables $DB_NAME >
/var/log/sauvegarde/mysql/$DB_NAME.sql
done
# on copie la base LDAP
ts_log 'Copie de la base LDAP...'
$SLAPCAT -l $LDAP_TMP_DUMP_FILE
# on crée les archives borg
# en mentionnant les répertoires à copier
ts_log "Création de l'archive ${BORG_ARCHIVE}"
$BORG create \
-v --stats --compression lzma,9 \
$BORG_ARCHIVE \
/etc /usr/local/apache2 /usr/local/etc /data /home
/var/log/sauvegarde/mysql \
$LDAP_TMP_DUMP_FILE \
>> ${LOG_PATH_TMP} 2>&1
# Nettoyage des anciens backups
# On conserve
# - une archive par jour les 7 derniers jours,
# - une archive par semaine pour les 4 dernières semaines,
# - une archive par mois pour les 6 derniers mois.
ts_log "On fait tourner les anciennes sauvegardes"
$BORG prune -v $BORG_REPOSITORY \
--keep-daily=7 \
--keep-weekly=4 \
--keep-monthly=6 \
>> ${LOG_PATH_TMP} 2>&1
cat $LOG_PATH_TMP | mail -s "Sauvegarde" olivier
cat $LOG_PATH_TMP >> ${LOG_PATH}
Unison est un logiciel de synchronisation bidirectionnelle, c'est à dire que c'est à vous d'estimer quel est l'instance d'un fichier qui est la bonne entre les deux instances, il vous permet d'avoir la maîtrise totale de la copie et ça permet d'éviter bien des désagréments. Revers de la médaille, ce n'est pas automatique, il est manuel et ça peut prendre du temps, mais il peut être couplé à des solutions automatiques.
Unison se trouve sur n'importe quelle distribution moderne. A la création d'un profil de synchronisation, il faudra choisir son type de connexion, pour ma part ça reste du montage local.
On choisit ensuite les répertoires à synchroniser, si l'un des répertoires est vide, il va faire une copie.
Une fois que les profils de synchronisation ont été créés, il n'y aura plus que régulièrement faire des synchronisations manuelles.
[Retour page d'accueil FUNIX] | [Retour haut de la page ] |