Mdadm

Un article de Le wiki de 2 noisettes - noisette.ch.

Mdadm est un logiciel de gestion de RAID logiciel. Il est très complet au point que je le conseille même pour un environnement de production.

Cet article explique comment créer un RAID, assembler plusieurs disques ayant déjà fait parti d'un array, ou comment réagir en cas de panne. Pour les commandes données en exemple, nous ferons du RAID1 avec 2 disques partitionnés en 4, respectivement /boot, swap, / et /home.

Un très très bon article sur comment installer Gentoo sur un RAID logiciel est disponible sur Gentoo-Wiki : HOWTO Install Gentoo on Software RAID

Sommaire

Création

Formater les disques

Une fois le logiciel mdadm installé sur l'ordinateur, il faut configurer les disques

fdisk /dev/sda
fdisk /dev/sdb

pour que les partitions qui vont accueillir du RAID soient de type Linux raid autodetect (fd). Puis on va les assembler avec mdadm pour finalement pouvoir les formater et installer le le system dessus.

La configuration des disques sera la suivante :

/dev/*1 --> /boot,  100MB
/dev/*2 --> swap, 1-2GB
/dev/*3 --> /, 20GB
/dev/*4 --> /home, le reste (bien que mettre /var serait plus judicieux sur une gentoo.

Noyau

Compilez le noyau avec les options suivantes (et sélectionner un autre mode de RAID si souhaité)

Device Drivers  ---> 
    Multi-device support (RAID and LVM)  --->
        [*] Multiple devices driver support (RAID and LVM)
        [*]   RAID support 
        [*]     RAID-1 (mirroring) mode 

Si vous démarrez d'un live CD, il faut charger le module (raid1 par exemple) :

modprobe raid1

Créer les nodes /dev/mdX

mknod /dev/md1 b 9 1
mknod /dev/md3 b 9 3
mknod /dev/md4 b 9 4

Création des arrays

Pour les assembler avec mdadm, la commande ressemble à la suivante

mdadm --create /dev/md1 --level=1 --raid-devices=2 /dev/sda1 /dev/sdb1
mdadm --create /dev/md3 --level=1 --raid-devices=2 /dev/sda3 /dev/sdb3
mdadm --create /dev/md4 --level=1 --raid-devices=2 /dev/sda4 /dev/sdb4

Une fois l'array créé, reste les formatage et le montage à l'endroit voulu.

mke2fs /dev/md1
mkreiserfs /dev/md3
mkreiserfs /dev/md4
mkswap /dev/sda2 && mkswap /dev/sdb2
swapon /dev/sda2 && swapon /dev/sdb2 
mount /dev/md3 /mnt
mkdir -p /mnt/boot && mount /dev/md1 /mnt/boot
mkdir -p /mnt/home && mount /dev/md4 /mnt/home
/* Pour gentoo */
mount -o bind /dev /mnt/dev
mount -o bind /proc /mnt/proc

On peut maintenant consulter les informations sur les disques, et insérer ces informations dans /etc/mdadm.conf :

mdadm --detail --scan >> /etc/mdadm.conf

(Ré)Assemblage

Une fois le RAID créé et des données dessus, on ne veut plus nécessairement le reformater et le recréer quand on l'a démonté. La solution sera donc de le réassemblé avec mdadm.

La première étape conciste à examiner une partition pour contrôler si elle fait bien partie d'un RAID (pour ceux qui on une mauvaise mémoire à très court terme) :

mdadm --examine /dev/sda1

La sortie nous dit si oui ou non la partition fait partie d'un RAID, et si oui quels autres disques en font aussi partie. Une fois en possession de ces informations, il nous reste à assembler l'ARRAY :

mdadm --assemble /dev/md1 /dev/sda1 /dev/sdb1
mdadm --assemble /dev/md3 /dev/sda3 /dev/sdb3
mdadm --assemble /dev/md4 /dev/sda4 /dev/sdb4

Reste le montage à l'endroit voulu.

Reconstruction

J'ai fait des tests de tolérence sur le RAID logiciel. J'ai commencé par enlever des disques à chaud (et j'ai pu bien constater qu'IDE était hot-déswap mais pas hot-swap), puis en utilisant l'option --fail pour simuler une panne. Les résultat étaient assez intéressants, mais le problème était de reconstruire le raid après la panne simulée.

Une fois la panne détectée (une véritable panne ou une simulée), on identifie le disque défectueux (avec dmesg ou /proc/mdstat) et on le retire de l'array :

mdadm --manage /dev/md1 --remove /dev/sdb1

Si on n'a pas de SATA pour enlever et remettre un disque à chaud, on arrête la machine et on la redémarre avec le nouveau disque. Puis on ajoute le nouveau disque à l'array :

mdadm --manage /dev/md1 --add /dev/sdb1

Monitoring

Mdadm offre de plus une option de monitoring des arrays : --monitor. Il est dès lors possible de spéficier dans le fichier de configuration un script qui s'exécute en cas d'événement (bon ou mauvais).

Les arguments passés au script seront les suivants :

  • $1 : une chaine de caractère qui décrit l'évènement qui s'est produit
    • 'SparesMissing' : une panne est détectée mais aucun disque de remplacement n'est présent
    • 'Fail' : un disque est détecté comme déféctueux
    • 'RebuildStarted' : un nouveau disque est ajouté à l'array et la reconstruction commence
    • 'Rebuild20' : la reconstruction est à 20%
    • 'Rebuild40' : la reconstruction est à 40%
    • 'Rebuild60' : la reconstruction est à 60%
    • 'Rebuild80' : la reconstruction est à 80%
    • 'RebuildFinished' : la reconstruction est terminée
    • 'SpareActive' : un disque de réserve est ajouté à un array
  • $2 : le nom de la device md : /dev/mdX

$1 et $2 étant le premier et le deuxième argument passé en paramètre.

Ressources

Notes

  • Vérifier d'avoir une version > 2.5.0, car elle souffre d'un gros memory leak quand mdadm est lancé en monitoring.