reconstruction d’un dell poweredge T310 après un crASH disque d’un raid 5

Pour mémoire, je dispose d’un serveur Dell PowerEdge T310 que j’ai acheté pour une poignée de figues sur ebay, d’occasion évidemment. Il me sert de serveur perso sur mon réseau local (serveur de fichiers via NFS et automontage sur les clients, de serveur de mail en réception et en émission, et de serveur d’authentification, entre autres), il me permet également d’envoyer et de recevoir des mails à partir de mon téléphone mobile où que je sois en fournissant un service de webmail à distance.

Il est installé dans le garage et tourne 7j/7 24h/24. Il est équipé d’une carte contrôleur RAID hard PERC 6/i et de 6 disques durs au total : 2 disques SATA en RAID 1 (installés d’origine à l’achat de la bête) pour le système et 4 disques SATA Seagata Barracuda en RAID 5 rajoutés en plus pour les données, c’est sans doute ce qui m’a coûté le plus cher pour monter cette configuration. A l’époque de mon achat (2015) j’avais installé la Mageia 5.
Depuis par flemme et surtout car j’appréhendais le boulot vu la personnalisation poussée du serveur, j’avais repoussé aux calendes grecques sa mise à jour alors que Mageia 5 n’est plus maintenue depuis un certain temps.
Et bien en fait, le serveur s’est rappelé à moi il y a quelques jours avec un disque SATA qui a lâché au bout de 5 ans de fonctionnement. C’est un modèle bas de gamme qui n’est pas prévu pour tourner 7j/7 24h/24. En farfouillant dans la configuration BIOS du contrôleur PERC 6/i, je découvre que j’ai un autre disque qui est à deux doigts de lâcher, je me retrouve avec un système virtuel RAID 5 fortement dégradé qui m’a généré une tonne d’erreurs de disques que j’ai dû traiter avec fsck. Au final j’ai laissé des plumes niveau données. Mais ouf ! Je suis bien content d’avoir programmé une sauvegarde incrémentale sur un autre disque externe (voir par ).
Tant qu’à faire à mettre les mains dans le cambouis, je me suis dit qu’il était temps de migrer vers Mageia 7.1, j’ai fait le choix de ne pas refaire une installation complète pour ne pas perdre toute ma configuration et gagner du temps. J’ai donc opéré une migration vers la 6 puis vers la 7.1 et là bluffé j’ai retrouvé tous mes petits et pourtant j’avais de quoi m’inquiéter avec tout ce qui tourne dessus en version packagée, compilée et fortement personnalisée. Je dois juste déplorer qu’il n’a pas repris le fichier de configuration de sendmail, mais à part ça rien à redire.


Me voilà donc avec un serveur up to date. Pour reconstruire le RAID, j’ai installé 2 disques Seagate de la gamme au dessus, des IronWolf qui sont donnés pour pouvoir tourner 7j/7 et 24h/24, en espérant tout de même qu’ils tiennent plus que 5 ans.

La reconstruction a duré tout de même plus de 24h, il reste néanmoins que j’ai encore 2 anciens disques durs barracuda que je dois encore changer pour être tranquille. Pour m’en assurer quand j’accède aux informations de monitoring SMART avec la commande smartctl -d megaraid,5 -a /dev/sdb outre les informations de base sur le disque identifié par l’id 5

=== START OF INFORMATION SECTION ===
Model Family:     Seagate Barracuda 7200.14 (AF)
Device Model:     ST2000DM001-1ER164
Serial Number:    Z4Z2CWV3
LU WWN Device Id: 5 000c50 07ac2d42f
Firmware Version: CC25
User Capacity:    2 000 398 934 016 bytes [2,00 TB]
Sector Sizes:     512 bytes logical, 4096 bytes physical
Rotation Rate:    7200 rpm
Form Factor:      3.5 inches
Device is:        In smartctl database [for details use: -P show]
ATA Version is:   ACS-2, ACS-3 T13/2161-D revision 3b
SATA Version is:  SATA 3.1, 6.0 Gb/s (current: 1.5 Gb/s)
Local Time is:    Fri Feb 28 11:25:41 2020 CET
SMART support is: Available - device has SMART capability.
SMART support is: Enabled

on obtient des lignes d’état dont les lignes suivantes

  5 Reallocated_Sector_Ct   0x0033   100   100   010    Pre-fail  Always       -       0
 9 Power_On_Hours          0x0032   059   059   000    Old_age   Always       -       36723
197 Current_Pending_Sector  0x0012   100   100   000    Old_age   Always       -       0

Si pour les lignes 5 et 197 on obtient des chiffres supérieurs à 0 qui vont en croissant, c’est qu’il est largement temps de changer de disque ! En ligne 9 on obtient le nombre d’heures de fonctionnement cumulées, dans le cas présent 36723 heures, soit plus de 4 ans de fonctionnement en continu. Sinon je vous renvoie vers cette page où je détaillais le monitoring d’un RAID avec MegaCli.

Maintenant j’ai dû modifier mon script de sauvegarde incrémentale, car je me rends compte que si mon disque virtuel basé sur un RAID 5 est dégradé, le système de fichier l’est tout autant, et je risque d’écraser une sauvegarde saine par des fichiers corrompus. J’ai donc rajouté un test d’intégrité qui va vérifier si le système RAID fonctionne correctement.

#!/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

# test de vérification de la présence du disque de sauvegarde
if [ ! -e "$distant1" ]
then
    echo "Le disque de sauvegarde n'est pas monté, arrêt du script"  >> $log/sauvegarde_$jour.log
    exit
fi

# test de l'état du raid
raid=$(MegaCli64 -LDInfo -L1 -a0 | grep State)
echo $raid
if echo $raid | grep Degraded >/dev/null 2>&1
then
        echo "Raid dégradé, arrêt du script"  >> $log/sauvegarde_$jour.log
	exit
fi

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

# transfert des fichiers

rsync -az --stats --delete-after --exclude-from=$excludes1 $local1 $distant1 >> $log/sauvegarde_$jour.log
rsync -az --stats --delete-after --exclude-from=$excludes2 $local2 $distant1 >> $log/sauvegarde_$jour.log
rsync -az --stats --delete-after $local3 $distant2 >> $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 ""  >> $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

exit

Laisser un commentaire