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 :
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.
Une réflexion sur « Sauvegarde de données »