Sauvegarde de données

Depuis maintenant 20 ans la numérisation touche tous les domaines, dans le domaine privé, cela concerne des données de bureautique, les échanges par mail mais également tous les fichiers multimédia photo, vidéo et images. Récemment je me pensais à l’abri de la perte de données, je suis équipé depuis des années d’un serveur Dell PowerEdge avec RAID matériel acheté d’occasion sur Ebay (PowerEdge 840 puis T310) et je fais des sauvegardes régulières sur disque dur externe USB grâce à un script lancé automatiquement avec l’utilitaire cron. Les données les plus précieuses se retrouvent sur un autre disque externe que je stocke au boulot. Mon RAID était basé sur 4 disques Seagate ST2000DM01 de 2To chacun de 2015, alors certes le RAID n’est pas assimilable à de la sauvegarde, c’est juste un système de redondance qui dispatche les données sur plusieurs disques pour éviter de tout perdre quand un disque crashe, la tolérance au panne est donc censée être meilleure qu’avec un seul disque.

Il se trouve cependant que j’ai eu au printemps dernier une panne de mon RAID bas bruit, le RAID est passé en mode dégradé avec la perte d’un disque. Puis un second disque du RAID a commandé à défaillir, c’est là que j’ai commencé à m’en rendre compte car j’ai eu un certain nombre d’erreurs système qui remontaient. Dans ce post je relate cet incident. Il était temps de changer 2 disques de mon RAID qui avaient 5 ans, après avoir fonctionné quasiment 24h/24 7j/7 dans la période. Cette durée de vie me paraît correcte pour des disques bas de gamme. Je les ai remplacés par des Seagate IronWolf de 3To. Mon RAID 5 est donc maintenant constitué de 2 disques Seagate ST2000DM01 de 2015 et de 2 disques Seagate IronWolf de 3To ce qui donne une capacité utile de 5,5To. D’ailleurs il faut sans doute que je songe à changer les deux disques les plus anciens.

Après avoir réinstallé mon RAID avec les nouveaux disques j’ai redescendu la sauvegarde , c’est là que je me suis rendu compte qu’il manquait un paquet de fichiers. Sur le coup je n’ai pas compris car les sauvegardes avaient été régulières, j’ai reconstitué alors le fil du drame. Il y a eu un crash bas bruit sur le RAID qui a dégradé des données, la sauvegarde s’est faite normalement mais a supprimé les fichiers qui avaient disparu du RAID car corrompus. Mais quel crétin ! Je n’avais pas mis en place un test d’état de santé des disques et du RAID avant de lancer la sauvegarde. Du coup j’ai essayé de récupérer les fichiers supprimés de la sauvegarde avec Photorec, ça m’a pris beaucoup de temps (des mois !) car il y en avait pour des To, mais comme il y a eu plusieurs sauvegardes dans l’intervalle je n’ai récupéré au final que peu de choses. Dans l’histoire, j’ai perdu dans les 400 films et une centaine de vidéos perso 🙁

J’ai dû revoir de fond en comble ma pratique de la sauvegarde, mes données principales sont toujours stockées sur le RAID 5 et il existe toujours une sauvegarde journalière sur disque de USB externe. Mais j’ai rajouté des sauvegardes croisées avec d’autres PC que je lance manuellement avec unison au moins une fois par semaine et j’ai rajouté également des tests d’état de santé des disques, dès dégradation des disques les sauvegardes ne sont pas lancées, j’ai mis en place un système de mail automatique journalier qui m’informe de l’état des disques.

L’architecture est maintenant celle-ci :

Architecture de sauvegarde

Les données principales se trouvent sur le serveur Mana qui dispose d’un RAID 1 avec deux disques SAS de 136Go pour le système et d’un RAID 5 pour les données dans le répertoire data d’un espace utile de 5,5To. Cet espace est copié automatiquement sur un disque externe USB de 4To, il est également copié dans son intégralité vers le disque Germaine de 4To de la station Predator et en partie (hors fichiers multimédia) vers le Thinkpad Tetiaroa. Les deux dernières copies sont manuelles et sont avec unison.

Concernant le script de sauvegarde, dans le répertoire /etc/cron.daily on va trouver le fichier sauvegarde qui contient :

#!/bin/bash
/usr/local/linux/systeme/hwraid-master/wrapper-scripts/megaclisas-status > /tmp/megastatus 2>&1

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
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/sauve

Ce script vérifie la présence du disque dur externe et vérifie son état de santé, ainsi que celui du RAID, il ne va pas plus loin si l’un des deux est dégradé, sinon il lance le script /usr/sbin/sauve qui contient :

#!/bin/bash
# Script sauvegarde rsync https://www.funix.org inspiré par
# celui de  Mickaël BONNARD ( https://www.mickaelbonnard.fr )
# sous licence MIT ( http://choosealicense.com/licenses/mit/ )

# Variables
# date et heure
jour=`date +%Y-%B-%d`
# répertoire contenant les logs
log="/var/log/sauvegarde"

# répertoires à sauvegarder
local1="/data"
local2="/home"
local3="/chroot/data"

# point de montage du disque de sauvegarde
distant1="/media/sauvegardes"
distant2="/media/sauvegardes/base-mysql"

# fichiers et répertoires à exclure de la sauvegarder
excludes1="/root/bin/exclude-data.txt"
excludes2="/root/bin/exclude-home.txt"

# nom de la sauvegarde dans le journal
echo "-------------------------------------------------------------" > $log/sauvegarde_$jour.log
echo "Sauvegarde de $local1 , $local2 et $local3 du $(date +%d-%B-%Y)" >> $log/sauvegarde_$jour.log

echo "-------------------------------------------------------------" >> $log/sauvegarde_$jour.log

# heure de début du transfert dans le journal
echo "Heure de demarrage de la sauvegarde : $(date +%H:%M:%S)" >> $log/sauvegarde_$jour.log

echo "-------------------------------------------------------------" >> $log/sauvegarde_$jour.log

#echo "lancement sauvegarde : $(date +%H:%M:%S)" | mail -s "Lancement sauvegarde" olivier

# transfert des fichiers
echo "Copie de data" >> $log/sauvegarde_$jour.log
rsync -av --stats --delete-after --exclude-from=$excludes1 $local1 $distant1 >> $log/sauvegarde_$jour.log
echo "-------------------------------------------------------------" >> $log/sauvegarde_$jour.log
echo "Copie de home" >> $log/sauvegarde_$jour.log
rsync -av --stats --delete-after --exclude-from=$excludes2 $local2 $distant1 >> $log/sauvegarde_$jour.log
echo "-------------------------------------------------------------" >> $log/sauvegarde_$jour.log
echo "Copie de chroot" >> $log/sauvegarde_$jour.log
rsync -av --stats --delete-after $local3 $distant2 >> $log/sauvegarde_$jour.log
echo "-------------------------------------------------------------" >> $log/sauvegarde_$jour.log
# -a : mode archivage ( équivalent -rlptgoD ).
# -z : compression des données pendant le transfert.
# -- stats donne des informations sur le transfert (nombre de fichiers…).
# --delete-after : supprime les fichiers qui n’existent plus dans la source après le transfert dans le dossier de destination.

status=$?

echo "Statut de la commande "  >> $log/sauvegarde_$jour.log

#code d'erreurs rsync

case $status in
0) echo Succès >> $log/sauvegarde_$jour.log;;
1) echo Erreur de syntaxe ou d'utilisation >> $log/sauvegarde_$jour.log;;
2) echo Incompatibilité de protocole >> $log/sauvegarde_$jour.log;;
3) echo Erreurs lors de la sélection des fichiers et des répertoires d'entrée/sortie >> $log/sauvegarde_$jour.log;;
4) echo Action non supportée : une tentative de manipulation de fichiers 64-bits sur une plate-forme qui ne les supporte pas \
 ; ou une option qui est supportée par le client mais pas par le serveur. >> $log/sauvegarde_$jour.log;;
5) echo Erreur lors du démarrage du protocole client-serveur >> $log/sauvegarde_$jour.log;;
6) echo Démon incapable d'écrire dans le fichier de log >> $log/sauvegarde_$jour.log;;
10) echo Erreur dans la socket E/S >> $log/sauvegarde_$jour.log;;
11) echo Erreur d'E/S fichier >> $log/sauvegarde_$jour.log;;
12) echo Erreur dans le flux de donnée du protocole rsync >> $log/sauvegarde_$jour.log;;
13) echo Erreur avec les diagnostics du programme >> $log/sauvegarde_$jour.log;;
14) echo Erreur dans le code IPC>> $log/sauvegarde_$jour.log;;
20) echo SIGUSR1 ou SIGINT reçu >> $log/sauvegarde_$jour.log;;
21) echo "Une erreur retournée par waitpid()" >> $log/sauvegarde_$jour.log;;
22) echo  Erreur lors de l'allocation des tampons de mémoire principaux >> $log/sauvegarde_$jour.log;;
23) echo Transfert partiel du à une erreur >> $log/sauvegarde_$jour.log;;
24) echo Transfert partiel du à la disparition d'un fichier source >> $log/sauvegarde_$jour.log;;
25) echo La limite --max-delete a été atteinte >> $log/sauvegarde_$jour.log;;
30) echo Dépassement du temps d'attente maximal lors d'envoi/réception de données >> $log/sauvegarde_$jour.log;;
35) echo Temps d’attente dépassé en attendant une connection >> $log/sauvegarde_$jour.log;;
255) echo Erreur inexpliquée >> $log/sauvegarde_$jour.log;;
esac

echo "-------------------------------------------------------------" >> $log/sauvegarde_$jour.log

# heure de fin dans le journal

echo "Jour de fin de sauvegarde : $(date +%d-%B-%Y)" >> $log/sauvegarde_$jour.log
echo "Heure de fin de la sauvegarde : $(date +%H:%M:%S)" >> $log/sauvegarde_$jour.log

echo "-------------------------------------------------------------" >> $log/sauvegarde_$jour.log

cat $log/sauvegarde_$jour.log | mail -s "Sauvegarde" olivier


exit

En parallèle sur le serveur mana j’ai activé smartmontools, cet outil embarque le serveur smartd qui monitore les disques durs et envoie des alertes en cas d’erreur. Pour le configurer on modifiera le fichier /etc/smartd.conf le mien contient simplement la ligne

DEVICESCAN -o on -S on -s (S/../.././01|L/../../1/03) -m olivier -M exec /usr/bin/mail

Cela signifie que tous les disques subiront un test court tous les jours à 1h du matin et un test long les lundis à 3h du matin, en cas d’erreurs rencontrés un mail me sera remonté. On lance ou relance smartd en tapant systemctl start smartd, journalctl -f me donne :

nov. 08 19:29:05 mana.kervao.fr smartd[16392]: smartd 7.0 2018-12-30 r4883 [x86_64-linux-5.6.6-server-1.mga7] (local build)
nov. 08 19:29:05 mana.kervao.fr smartd[16392]: Copyright (C) 2002-18, Bruce Allen, Christian Franke, www.smartmontools.org
nov. 08 19:29:05 mana.kervao.fr smartd[16392]: Opened configuration file /etc/smartd.conf
nov. 08 19:29:05 mana.kervao.fr smartd[16392]: Drive: DEVICESCAN, implied '-a' Directive on line 33 of file /etc/smartd.conf
nov. 08 19:29:05 mana.kervao.fr smartd[16392]: Configuration file /etc/smartd.conf was parsed, found DEVICESCAN, scanning devices
nov. 08 19:29:05 mana.kervao.fr smartd[16392]: Device: /dev/sdc [SAT], opened
nov. 08 19:29:05 mana.kervao.fr smartd[16392]: Device: /dev/sdc [SAT], ST4000DM004-2CV104, S/N:WFN0VFTR, WWN:5-000c50-0be69c167, FW:0001, 4.00 TB
nov. 08 19:29:05 mana.kervao.fr smartd[16392]: Device: /dev/sdc [SAT], found in smartd database: Seagate Barracuda 3.5
nov. 08 19:29:05 mana.kervao.fr smartd[16392]: Device: /dev/sdc [SAT], is SMART capable. Adding to "monitor" list.
nov. 08 19:29:05 mana.kervao.fr smartd[16392]: Device: /dev/bus/0 [megaraid_disk_00], opened
nov. 08 19:29:05 mana.kervao.fr smartd[16392]: Device: /dev/bus/0 [megaraid_disk_00], [FUJITSU  MBA3147RC        D306], lu id: 0x500000e1175a6dc0, S/N: BJA3PB20MLWR, 146 GB
nov. 08 19:29:05 mana.kervao.fr smartd[16392]: Device: /dev/bus/0 [megaraid_disk_00], is SMART capable. Adding to "monitor" list.
nov. 08 19:29:05 mana.kervao.fr smartd[16392]: Device: /dev/bus/0 [megaraid_disk_01], opened
nov. 08 19:29:05 mana.kervao.fr smartd[16392]: Device: /dev/bus/0 [megaraid_disk_01], [FUJITSU  MBA3147RC        D306], lu id: 0x500000e115830950, S/N: BJA3PA80KNT5, 146 GB
nov. 08 19:29:05 mana.kervao.fr smartd[16392]: Device: /dev/bus/0 [megaraid_disk_01], is SMART capable. Adding to "monitor" list.
nov. 08 19:29:05 mana.kervao.fr smartd[16392]: Device: /dev/bus/0 [megaraid_disk_04], type changed from 'megaraid,4' to 'sat+megaraid,4'
nov. 08 19:29:05 mana.kervao.fr smartd[16392]: Device: /dev/bus/0 [megaraid_disk_04] [SAT], opened
nov. 08 19:29:05 mana.kervao.fr smartd[16392]: Device: /dev/bus/0 [megaraid_disk_04] [SAT], ST2000DM001-1ER164, S/N:Z4Z2CWV3, WWN:5-000c50-07ac2d42f, FW:CC25, 2.00 TB
nov. 08 19:29:05 mana.kervao.fr smartd[16392]: Device: /dev/bus/0 [megaraid_disk_04] [SAT], found in smartd database: Seagate Barracuda 7200.14 (AF)
nov. 08 19:29:05 mana.kervao.fr smartd[16392]: Device: /dev/bus/0 [megaraid_disk_04] [SAT], not capable of SMART Health Status check
nov. 08 19:29:05 mana.kervao.fr smartd[16392]: Device: /dev/bus/0 [megaraid_disk_04] [SAT], is SMART capable. Adding to "monitor" list.
nov. 08 19:29:05 mana.kervao.fr smartd[16392]: Device: /dev/bus/0 [megaraid_disk_05], type changed from 'megaraid,5' to 'sat+megaraid,5'
nov. 08 19:29:05 mana.kervao.fr smartd[16392]: Device: /dev/bus/0 [megaraid_disk_05] [SAT], opened
nov. 08 19:29:05 mana.kervao.fr smartd[16392]: Device: /dev/bus/0 [megaraid_disk_05] [SAT], ST2000DM001-1ER164, S/N:Z4Z2W969, WWN:5-000c50-07b6ff45e, FW:CC26, 2.00 TB
nov. 08 19:29:05 mana.kervao.fr smartd[16392]: Device: /dev/bus/0 [megaraid_disk_05] [SAT], found in smartd database: Seagate Barracuda 7200.14 (AF)
nov. 08 19:29:05 mana.kervao.fr smartd[16392]: Device: /dev/bus/0 [megaraid_disk_05] [SAT], not capable of SMART Health Status check
nov. 08 19:29:06 mana.kervao.fr smartd[16392]: Device: /dev/bus/0 [megaraid_disk_05] [SAT], is SMART capable. Adding to "monitor" list.
nov. 08 19:29:06 mana.kervao.fr smartd[16392]: Device: /dev/bus/0 [megaraid_disk_06], type changed from 'megaraid,6' to 'sat+megaraid,6'
nov. 08 19:29:06 mana.kervao.fr smartd[16392]: Device: /dev/bus/0 [megaraid_disk_06] [SAT], opened
nov. 08 19:29:06 mana.kervao.fr smartd[16392]: Device: /dev/bus/0 [megaraid_disk_06] [SAT], ST3000VN007-2AH16M, S/N:ZGY6LKFM, WWN:5-000c50-0c48b3476, FW:SC60, 3.00 TB
nov. 08 19:29:06 mana.kervao.fr smartd[16392]: Device: /dev/bus/0 [megaraid_disk_06] [SAT], found in smartd database: Seagate IronWolf
nov. 08 19:29:06 mana.kervao.fr smartd[16392]: Device: /dev/bus/0 [megaraid_disk_06] [SAT], not capable of SMART Health Status check
nov. 08 19:29:06 mana.kervao.fr smartd[16392]: Device: /dev/bus/0 [megaraid_disk_06] [SAT], is SMART capable. Adding to "monitor" list.
nov. 08 19:29:06 mana.kervao.fr smartd[16392]: Device: /dev/bus/0 [megaraid_disk_07], type changed from 'megaraid,7' to 'sat+megaraid,7'
nov. 08 19:29:06 mana.kervao.fr smartd[16392]: Device: /dev/bus/0 [megaraid_disk_07] [SAT], opened
nov. 08 19:29:06 mana.kervao.fr smartd[16392]: Device: /dev/bus/0 [megaraid_disk_07] [SAT], ST3000VN007-2AH16M, S/N:ZGY6KHBC, WWN:5-000c50-0c47c70df, FW:SC60, 3.00 TB
nov. 08 19:29:06 mana.kervao.fr smartd[16392]: Device: /dev/bus/0 [megaraid_disk_07] [SAT], found in smartd database: Seagate IronWolf
nov. 08 19:29:06 mana.kervao.fr smartd[16392]: Device: /dev/bus/0 [megaraid_disk_07] [SAT], not capable of SMART Health Status check
nov. 08 19:29:06 mana.kervao.fr smartd[16392]: Device: /dev/bus/0 [megaraid_disk_07] [SAT], is SMART capable. Adding to "monitor" list.
nov. 08 19:29:06 mana.kervao.fr smartd[16392]: Monitoring 5 ATA/SATA, 2 SCSI/SAS and 0 NVMe devices

Il va monitorer 5 disques SATA, 4 internes qui constituent le RAID 5 de données et 1 externe de sauvegarde et 2 disques SAS qui constituent le RAID 1 système. Pour pouvoir tester que tout marche on modifiera la ligne de /etc/smartd.conf comme ceci

DEVICESCAN -o on -S on -s (S/../.././01|L/../../1/03) -m olivier -M test

Du coup on va recevoir un mail par disque avec comme objet SMART error (EmailTest) detected on host: mana qui contiendra (exemple pour le disque externe) :

This message was generated by the smartd daemon running on:

   host name:  mana
   DNS domain: kervao.fr

The following warning/error was logged by the smartd daemon:

TEST EMAIL from smartd for device: /dev/sdc [SAT]

Device info:
ST4000DM004-2CV104, S/N:WFN0VFTR, WWN:5-000c50-0be69c167, FW:0001, 4.00 TB

For details see host's SYSLOG.

Sur les PC Predator et Tetiaroa ils ne sont pas allumés en permanence, il faut que je pense régulièrement à lancer les commandes de vérification de l’état de santé du disque sur lequel se trouve ma sauvegarde avant chaque lancement d’unison. Dans la pratique cela consiste à taper d’abord la commande smartctl -t short /dev/sdc, voilà le résultat :

smartctl 7.0 2018-12-30 r4883 [x86_64-linux-5.7.19-desktop-3.mga7] (local build)
Copyright (C) 2002-18, Bruce Allen, Christian Franke, www.smartmontools.org

=== START OF OFFLINE IMMEDIATE AND SELF-TEST SECTION ===
Sending command: "Execute SMART Short self-test routine immediately in off-line mode".
Drive command "Execute SMART Short self-test routine immediately in off-line mode" successful.
Testing has begun.
Please wait 2 minutes for test to complete.
Test will complete after Mon Nov  9 18:48:33 2020

Use smartctl -X to abort test.

Puis deux minutes après on tape smartctl -l selftest /dev/sdc et voilà le résultat :

smartctl 7.0 2018-12-30 r4883 [x86_64-linux-5.7.19-desktop-3.mga7] (local build)
Copyright (C) 2002-18, Bruce Allen, Christian Franke, www.smartmontools.org

=== START OF READ SMART DATA SECTION ===
SMART Self-test log structure revision number 1
Num  Test_Description    Status                  Remaining  LifeTime(hours)  LBA_of_first_error
# 1  Short offline       Completed without error       00%       326         -
# 2  Extended offline    Completed without error       00%        17         -

C’est tout bon, il n’y a pas d’erreur. Il me reste sans doute à mettre tout ça dans un script qui pourrait se lancer au démarrage de la station.

Maintenant j’ai un disque externe USB de 1To supplémentaire, un disque dur de 2To inutilisé et bientôt 2 autres disques de 2To après les avoir remplacés dans le RAID 5. Je compte grouper tous ces disques dans un boîtier multi disque USB ou un NAS réseau, je n’ai pas encore fait mon choix, ça me permettra de mettre en place une nouvelle redondance de sauvegarde.

Pour en revenir à mes données perdues, je n’ai plus qu’à reconstituer ma collection de films, en partie en récupérant les fichiers enregistrés sur ma box mais fort heureusement une grande partie de mes vidéos perso sont encore sur des bandes miniDV et sur des cassettes VHS, je n’ai plus qu’à reprendre la numérisation avec cette technique pour les K7 miniDV et cette autre technique pour K7 VHS.

Laisser un commentaire