Mot-clé - RAID

Fil des billets

jeudi 10 octobre 2013

Ajouter un disque additionnel à un RAID 1 en 5 lignes de commande

Un RAID 1 (mirroring) constitue ne bonne garantie contre une panne de disque dur sur une machine (serveur, poste de bureau, NAS) contenant des données critiques. Avec une bonne maintenance, on peut espérer conserver des données avec un faible taux de risque de perte sur de longues durées : une bonne méthode consistant par exemple à ajouter des disques plus récents à la grappe RAID.

Nous allons détailler ici les opérations nécessaires pour ajouter un disque dur de X Go à une grappe (RAID 1) de 2 disques durs de même capacité, gérée par les fonctionnalités de RAID logiciel sous Linux.

La première étape consiste à copier la table des partitions des disques durs actifs dans le RAID (appelons les /dev/sda et /dev/sdb) sur le nouveau disque (/dev/sdc). En effet, le nouveau disque doit être structuré (en termes de partitions) rigoureusement comme les anciens.

Attention, il existe aujourd'hui couramment deux types de table de partition : l'ancien système à base de MBR (Master Boot Record) et le nouveau système nommé GPT (Globally Unique Identifier Partition Table). En MBR, vous pouvez utiliser l'utilitaire fdisk/sfdisk (non détaillé ici). Si vos disques sont formatés avec des tables GPT (le nouveau standard), voici comment faire.

On enregistre d'abord la table de partition du disque sda dans un fichier 'table' :

sgdisk --backup=table /dev/sda

puis on applique cette table au disque /dev/sdc (attention à ne pas se tromper de disque, cela pourrait être destructeur !) :

sgdisk --load-backup=table /dev/sdc

Et comme dans le système GPT chaque partition est identifiée par un unique GUID et que celui-ci est inclus dans la table GPT, alors il faut modifier les GUID pour des valeurs aléatoires dans le disque fraîchement ajouté :

sgdisk -G /dev/sdc

Le nouveau disque dur est maintenant prêt à intégrer le RAID.

mdadm --detail /dev/md0

va nous permettre de regarder les partitions inclues dans cette première partition en RAID. Par exemple, on verra que ce sont les partitions /dev/sda2 et /dev/sdb2 qui sont concernées. On saura donc qu'il faut ajouter /dev/sdc2 :

mdadm --manage /dev/md0 --add /dev/sdc2

Puis

mdadm --detail /dev/md0

doit montrer que le nouveau disque a été ajouté.

Il est toutefois fort probable que le disque ait été monté en 'spare device' i.e. en périphérique activé uniquement en cas de perte d'un autre disque. Si vous souhaitez que les données soient répliquées dès maintenant sur ce disque, il faudra agrandir le RAID :

mdadm --grow /dev/md0 --raid-devices=3

Et le tour est joué, la reconstruction du RAID (i.e. la copie des données vers le nouveau disque) doit s'effectuer de manière transparente. /dev/md0 est désormais répliqué sur 3 disques durs.

Bien sûr, une procédure similaire pourra être déployée en cas de disque défectueux pour ajouter un nouveau disque dans la grappe !

lundi 23 septembre 2013

L'état d'un RAID logiciel Linux résumé par courriel

Voilà un petit script très simple pour recevoir automatiquement par courriel l'état d'un RAID logiciel sous Linux :

#!/bin/sh
# cron.weekly/mdadm-status -- weekly status of the RAID
# 2013 Pierre-Alain Bandinelli
# distributed under the terms of the Artistic Licence 2.0

# Get status from the RAID array and send the details by email.
# Email will go to the address specified in the commandline.
set -eu

MDADM=/sbin/mdadm
[ -x $MDADM ] || exit 0 # package may be removed but not purged

DEST="administrateur@cestmoi.fr"
exec $MDADM --detail /dev/md0 /dev/md1 /dev/md2 |mail -s "RAID status" $DEST

On peut placer ce script dans cron.weekly pour recevoir ces informations manière hebdomadaire par exemple.

Longue vie à votre RAID !

samedi 23 février 2013

mdadm à la rescousse !

Lors d'une longue soirée d'hiver, alors que je démarrais mon PC, je constatais avec horreur que l'un de disques virtuels de mon RAID était passé en mode dégradé et ne comprenait plus qu'un seul disque (au lieu de 2 comme habituellement).

A DegradedArray event had been detected on md device /dev/md2

Branle-bas de combat ! Très vite je réalise que /dev/md1 et /dev/md3 continuent à fonctionner normalement avec deux disques durs physiques - seul /dev/md2 renâcle.

mdadm --detail /dev/md2

montre alors : /dev/md2:

Update Time : Sat Feb 23 01:32:03 2013
State : clean, degraded
Active Devices : 1
Working Devices : 1
Failed Devices : 0
Spare Devices : 0

Number Major Minor RaidDevice State
0 3 1 0 active sync /dev/sda1
1 0 0 - removed

Bizarrement, le second disque a donc cessé de fonctionner... comme il a l'air matériellement viable (puisque md1 et md3 ne sont pas impactés), je tente d'ajouter à nouveau le disque physique :

mdadm /dev/md2 –add /dev/sdb1

mdadm accepte poliment et on assiste à la reconstruction progressive du RAID ! Problème réglé semble-t-il - même si je n'explique pas du tout la cause du problème initialement.

lundi 18 juillet 2011

L'utilitaire 'mdadm' de Linux est manquant par défaut sous Windows

Vous trouverez sur le net quantité de fiches explicatives sur les bienfaits d'une infrastructure RAID 1 pour protéger ses données d'une éventuelle faille d'un disque dur. Un RAID 1 logiciel se paramètre très facilement sous Linux et le petit outil 'mdadm' permet régulièrement de vérifier l'état du RAID et, en cas d'état dégradé, d'effectuer toute action pour prévenir l'administrateur.



Sous Windows 7 Pro, la situation est un peu différente. La mise en place du RAID se fait sans trop de difficultés, mais en revanche il est impossible d'effectuer un monitoring du RAID ! Autrement dit, par défaut, impossible d'être prévenu si une panne de l'un des disques RAID est survenue... Fonction pourtant essentielle à toute personne soucieuse de l'intégrité de ses données et qui changera un disque défectueux dès que possible. Cette absence de 'monitoring du RAID' est bien dommage... ah qu'il est plaisant d'être sous Linux !

Enfin, sans se laisser démonter, il est possible d'écrire un petit script afin de pallier cette fonctionnalité (diablement importante) manquante. Voici un petit script qui ne se veut ni original ni parfait, mais qui, j'espère, aidera certains d'entre vous à être prévenus des éventuelles failles de vos disques durs.

' Software RAID status check script

Dim WshShell, oExec
Dim Line, RE0, RE1, RE2, RE3
Dim Failed

Failed = -1
' Simple variable to display status of all volumes:
' 0 = Healthy
' 1 = Rebuilding
' 2 = Failed
' 3 = Unknown

Set WshShell = WScript.CreateObject("WScript.Shell")

' Execute the DISKPART program and grab the output
set objShell = WScript.CreateObject("WScript.Shell")
set objExec = objShell.Exec("diskpart.exe")
strOutput = ExecuteDiskPartCommand("list volume")

WScript.StdOut.WriteLine(strOutput)

' Set up some regular expression objects
Set RE0 = New RegExp
Set RE1 = New RegExp
Set RE2 = New RegExp
Set RE3 = New RegExp

RE0.Pattern = "Sain"
RE1.Pattern = "Volume"
RE2.Pattern = "chou"
RE3.Pattern = "Reconstui"

        Line = strOutput

        ' Tests for Mirrored or RAID-5 volumes
        If RE1.Test(Line) Then

          ' Tests for Healthy volumes
          If RE0.Test(Line) Then
            If Failed = -1 Then Failed = 0
          End If

          If RE3.Test(Line) Then
            Failed = 1
          End If

          ' Tests for Failed RAID volumes
          If RE2.Test(Line) Then
            If Failed < 2 Then Failed = 2
          End If
        End If

' If Failed is still -1, something bad has happened, or there is no RAID
If Failed = -1 Then Failed = 3

' Print out the appropriate test result
Select Case Failed
    Case 0
      WScript.StdOut.WriteLine("RAID OK: All volumes Healthy")
    Case 1
      WScript.StdOut.WriteLine("RAID WARNING: Volume(s) Rebuilding")
    MsgBox "Le RAID est en reconstruction.",vbExclamation
    Case 2
      WScript.StdOut.WriteLine("RAID CRITICAL: Volume(s) have Failed")
    MsgBox "Il semble que le RAID soit en panne !!! ATTENTION ATTENTION !!",vbExclamation
    Case 3
      WScript.StdOut.WriteLine("UNKNOWN !")
    MsgBox "Il n'est pas possible d'évaluer l'état du RAID - une vérification manuelle s'impose !",vbExclamation
End Select

ExitDiskPart
WScript.Quit(Failed)

Function ExecuteDiskPartCommand (strCommand)

    ' Run the command we want
    objExec.StdIn.Write strCommand & VbCrLf

    ' If we read the output now, we will get the one from previous command (?). As we will always
    ' run a dummy command after every valid command, we can safely ignore this

    Do While True
        IgnoreThis = objExec.StdOut.ReadLine & vbcrlf
        ' Command finishes when diskpart prompt is shown again
        If InStr(IgnoreThis, "DISKPART>") <> 0 Then Exit Do
    Loop

    ' Run a dummy command, so the next time we call this function and try to read output,
    ' we can safely ignore the result
    objExec.StdIn.Write VbCrLf

    ' Read command's output
    ExecuteDiskPartCommand = ""
    Do While True
        ExecuteDiskPartCommand = ExecuteDiskPartCommand & objExec.StdOut.ReadLine & vbcrlf
        ' Command finishes when diskpart prompt is shown again
        If InStr(ExecuteDiskPartCommand, "DISKPART>") <> 0 Then Exit Do
    Loop
End Function


Sub ExitDiskPart
    ' Run exit command to exit the tool
    objExec.StdIn.Write "exit" & VbCrLf
End Sub