• Li chevron_right

      Sauvegarde de données

      Funix · pubsub.eckmul.net / linuxfr · Monday, 9 November, 2020 - 18:43 · 11 minutes

    <p>'lut nal,</p> <p>Vous me direz encore un journal sur la sauvegarde de données alors qu'il en existe tant d'autres. Mais il n'est jamais inutile de rappeler à tel point il est utile et nécessaire de ne pas négliger ce point et c'est souvent malheureusement suite à une mauvaise expérience qu'on s'en préoccupe sérieusement, et c'est malheureusement également ce qui m'est arrivé.</p> <p>Pendant longtemps je me suis cru à l'abri de la perte de mes données perso, depuis des années j'utilise d’un serveur Dell PowerEdge avec RAID matériel acheté d’occasion une poignée de figues sur Ebay (PowerEdge 840 puis T310 actuellement) 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 au cas où la maison parte en fumée. Mon RAID était basé jusqu'à présent sur 4 disques Seagate ST2000DM01 de 2To chacun de 2015. Alors certes, on l'a suffisamment martelé sur ce site 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.</p> <p>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. Il était temps de changer 2 disques de mon RAID, après avoir fonctionné quasiment 24h/24 7j/7 pendant 5 ans, je trouve que c'est une durée de vie plutô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. </p> <p>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é tardivement le fil du drame. Il y a eu donc 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 :-(</p> <p>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.</p> <p>L’architecture ressemble maintenant à ça :<br> <img src="//img.linuxfr.org/img/68747470733a2f2f6f6c69766965722e686f617261752e6f72672f77702d636f6e74656e742f75706c6f6164732f32303230313130382d736368656d612d736175766567617264652e6a7067/20201108-schema-sauvegarde.jpg" alt="Titre de l'image" title="Source : https://olivier.hoarau.org/wp-content/uploads/20201108-schema-sauvegarde.jpg"></p> <p>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 se font avec unison.</p> <p>Concernant le script de sauvegarde, dans le répertoire /etc/cron.daily on va trouver le fichier sauvegarde qui contient :</p> <pre><code>#!/bin/bash /usr/local/linux/systeme/hwraid-master/wrapper-scripts/megaclisas-status &gt; /tmp/megastatus 2&gt;&amp;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 &gt;&gt; /tmp/megastatus 2&gt;&amp;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 &gt;/dev/null 2&gt;&amp;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 &gt;/dev/null 2&gt;&amp;1 then exit fi /usr/sbin/sauve </code></pre> <p>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 :</p> <pre><code>#!/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 sauvegarde excludes1="/root/bin/exclude-data.txt" excludes2="/root/bin/exclude-home.txt" # nom de la sauvegarde dans le journal echo "-------------------------------------------------------------" &gt; $log/sauvegarde_$jour.log echo "Sauvegarde de $local1 , $local2 et `{mathjax} local3 `(date +%d-%B-%Y)" &gt;&gt; $log/sauvegarde_$jour.log echo "-------------------------------------------------------------" &gt;&gt; $log/sauvegarde_$jour.log # heure de début du transfert dans le journal echo "Heure de demarrage de la sauvegarde : $(date +%H:%M:%S)" &gt;&gt; $log/sauvegarde_$jour.log echo "-------------------------------------------------------------" &gt;&gt; $log/sauvegarde_$jour.log #echo "lancement sauvegarde : $(date +%H:%M:%S)" | mail -s "Lancement sauvegarde" olivier # transfert des fichiers echo "Copie de data" &gt;&gt; $log/sauvegarde_$jour.log rsync -av --stats --delete-after --exclude-from=$excludes1 $local1 $distant1 &gt;&gt; $log/sauvegarde_$jour.log echo "-------------------------------------------------------------" &gt;&gt; $log/sauvegarde_$jour.log echo "Copie de home" &gt;&gt; $log/sauvegarde_$jour.log rsync -av --stats --delete-after --exclude-from=$excludes2 $local2 $distant1 &gt;&gt; $log/sauvegarde_$jour.log echo "-------------------------------------------------------------" &gt;&gt; $log/sauvegarde_$jour.log echo "Copie de chroot" &gt;&gt; $log/sauvegarde_$jour.log rsync -av --stats --delete-after $local3 $distant2 &gt;&gt; $log/sauvegarde_$jour.log echo "-------------------------------------------------------------" &gt;&gt; $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 " &gt;&gt; $log/sauvegarde_$jour.log #code d'erreurs rsync case $status in 0) echo Succès &gt;&gt; $log/sauvegarde_$jour.log;; 1) echo Erreur de syntaxe ou d'utilisation &gt;&gt; $log/sauvegarde_$jour.log;; 2) echo Incompatibilité de protocole &gt;&gt; $log/sauvegarde_$jour.log;; 3) echo Erreurs lors de la sélection des fichiers et des répertoires d'entrée/sortie &gt;&gt; $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. &gt;&gt; $log/sauvegarde_$jour.log;; 5) echo Erreur lors du démarrage du protocole client-serveur &gt;&gt; $log/sauvegarde_$jour.log;; 6) echo Démon incapable d'écrire dans le fichier de log &gt;&gt; $log/sauvegarde_$jour.log;; 10) echo Erreur dans la socket E/S &gt;&gt; $log/sauvegarde_$jour.log;; 11) echo Erreur d'E/S fichier &gt;&gt; $log/sauvegarde_$jour.log;; 12) echo Erreur dans le flux de donnée du protocole rsync &gt;&gt; $log/sauvegarde_$jour.log;; 13) echo Erreur avec les diagnostics du programme &gt;&gt; $log/sauvegarde_$jour.log;; 14) echo Erreur dans le code IPC&gt;&gt; $log/sauvegarde_$jour.log;; 20) echo SIGUSR1 ou SIGINT reçu &gt;&gt; $log/sauvegarde_$jour.log;; 21) echo "Une erreur retournée par waitpid()" &gt;&gt; $log/sauvegarde_$jour.log;; 22) echo Erreur lors de l'allocation des tampons de mémoire principaux &gt;&gt; $log/sauvegarde_$jour.log;; 23) echo Transfert partiel du à une erreur &gt;&gt; $log/sauvegarde_$jour.log;; 24) echo Transfert partiel du à la disparition d'un fichier source &gt;&gt; $log/sauvegarde_$jour.log;; 25) echo La limite --max-delete a été atteinte &gt;&gt; $log/sauvegarde_$jour.log;; 30) echo Dépassement du temps d'attente maximal lors d'envoi/réception de données &gt;&gt; $log/sauvegarde_$jour.log;; 35) echo Temps d’attente dépassé en attendant une connection &gt;&gt; $log/sauvegarde_$jour.log;; 255) echo Erreur inexpliquée &gt;&gt; $log/sauvegarde_$jour.log;; esac echo "-------------------------------------------------------------" &gt;&gt; $log/sauvegarde_$jour.log # heure de fin dans le journal echo "Jour de fin de sauvegarde : $(date +%d-%B-%Y)" &gt;&gt; $log/sauvegarde_$jour.log echo "Heure de fin de la sauvegarde : $(date +%H:%M:%S)" &gt;&gt; $log/sauvegarde_$jour.log echo "-------------------------------------------------------------" &gt;&gt; $log/sauvegarde_$jour.log cat $log/sauvegarde_$jour.log | mail -s "Sauvegarde" olivier exit </code></pre> <p>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. J'ai mis dans le fichier /etc/smartd.conf la ligne :</p> <pre><code>DEVICESCAN -o on -S on -s (S/../.././01|L/../../1/03) -m olivier -M test </code></pre> <p>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é. </p> <p>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. Je songe à rédiger un script pour vérifier l'état des disques au lancement.</p> <p>Maintenant j’ai sur les bras 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.</p> <p>En guise de conclusion et 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. Pour ce qui concerne mes vidéos perso, fort heureusement une grande partie sont encore sur des bandes miniDV et sur des cassettes VHS, il ne me reste plus qu'à renumériser tout ça.</p> <p>Je suis preneur de toute remarque sur l'amélioration de ce dispositif.</p> <div><a href="https://linuxfr.org/users/funix/journaux/sauvegarde-de-donnees.epub">Télécharger ce contenu au format EPUB</a></div> <p> <strong>Commentaires :</strong> <a href="//linuxfr.org/nodes/122171/comments.atom">voir le flux Atom</a> <a href="https://linuxfr.org/users/funix/journaux/sauvegarde-de-donnees#comments">ouvrir dans le navigateur</a> </p>