Outils pour utilisateurs

Outils du site


expert:mdadm

mdadm , gestion de RAID logiciel

mdadm est le nom du paquet, et de la commande éponyme, qui permettent de gérer le raid logiciel sur un système GNU-Linux. Le raid “logiciel” s'oppose au raid “matériel” où un contrôleur matériel dédié gère la couche raid. Entre les deux on trouve le “fake raid” (faux raid), ce type de raid se trouve sur la quasi totalité des cartes mères grand public moyen à haut de gamme. Un contrôleur joue le rôle de contrôleur raid, mais il ne s'agit pas d'un véritable contrôleur raid matériel avec une puce dédiée, mais d'une émulation logicielle qui délègue au système et au processeur les calculs.

Le raid matériel est très performant, les contrôleurs sont très chers, les groupes raid créés ne sont pas “portables” sur un autre type de contrôleur (en cas de panne, de changement de matériel…). Le raid matériel est totalement transparent pour l'utilisateur et le système. Le “fake raid” n'a aucun avantage sur le raid logiciel, il est même moins souple et pas plus performant. Son seul atout pourrait-être une relative “transparence” pour l'utilisateur.

Reste celui qui nous intéresse ici, le raid purement logiciel, géré par le noyau Linux et mdadm.

Un signe $ précède les commandes qui ne nécessitent pas de droits administrateur ; un signe # précède celles qui nécessitent des droits administrateur “root” (ces signes ne font PAS partie des commandes). Les lignes qui ne commencent pas par un signe $ ou # correspondent au résultat de la commande précédente.
Les touches utilisées sont indiquées entre crochets, exemple [ctrl] pour la touche “contrôle”

Installation

mdadm est présent dans les dépôts de (quasiment ?) toutes les distributions, sur Debian, Ubuntu ou dérivés de la famille deb un simple:

# apt-get install mdadm

réglera le problème de l'installation. Sur une distribution de la famille rpm comme Fedora ou OpenSuse, respectivement “Yum install mdadm” ou “zypper in mdadm” auront le même effet. C'est beau la gestion de logiciels GNU-Linux !

Lors de l'installation quelques questions vous seront sans doute posées, parmi les plus importantes:

“Désirez-vous détecter, assembler et démarrer les volumes raid au démarrage du système?”
Sauf cas très particulier vous devez laisser le choix par défaut (oui).
“Quel est le destinataire des messages système de mdadm ?”
Là vous constaterez que c'est une très bonne idée d'avoir un MTA (mail transfert agent: “exim”, “courier”…) qui vous transmet les courriels système, et un client configuré pour relever les courriels des comptes locaux (mutt, Kmail…). Si vous n'avez pas de compte courriel système sur la machine, ou si les courriels adressés à root vous sont transférés, choisissez “root”.

En effet le démon de surveillance “mdadm --monitor” est démarré par défaut, il vous avertira de tout changement d'état de vos volumes raid, défaillance d'un disque, …etc. Il FAUT pouvoir lire et recevoir ces courriels système, sous peine qu'un problème critique passe inaperçu (panne d'un disque dans un volume raid1 ou raid5 sans disque de secours…).

Configuration

Si le fichier mdadm.conf n'a pas été créé lors de l'installation, il est possible de le créer après coup avec /usr/share/mdadm/mkconf. Par exemple sur Debian on indiquera le fichier de sortie /etc/mdadm/mdadm.conf avec:
# /usr/share/mdadm/mkconf force-generate /etc/mdadm/mdadm.conf

En dehors des options proposées à l'installation, il n'y a pas grand chose à faire. Sur Debian un fichier /etc/default/mdadm (équivalent sur d'autres distributions, voir “man mdadm”) permet d'accéder à la plupart des options:

# INITRDSTART:
#Liste des volumes raid qui doivent être démarrés automatiquement lors du chargement de
#"l'initial ram disk" (initrd). Cette liste *doit* contenir le volume raid qui supporte la
#racine du système "/".
#
#'all'  >> tous les volumes.
#'/dev/md*,/dev/md*'  >> listes des volumes raid à démarrer.
#'none'  >> aucun, démarrage manuel (ie. ni "/" ni "/boot" ne sont sur un volume raid).

INITRDSTART='all'

# AUTOSTART:
#mdadm démarre les volumes listés dans /etc/mdadm/mdadm.conf automatiquement ?

AUTOSTART=true

# AUTOCHECK:
#mdadm doit-il vérifier la concordance des données sur les composants des volumes raid ?
#Évite la corruption silencieuse des données sur l'un des disques. Voir /etc/cron.d/mdadm.

AUTOCHECK=true

# START_DAEMON:
#mdadm doit-il démarrer le démon de surveillance au démarrage (--monitor) ?

START_DAEMON=true

# DAEMON_OPTIONS:
#Autres options à passer au démon de surveillance.

DAEMON_OPTIONS="--syslog"

# VERBOSE:
#Si cette option est activée (true), mdadm donnera un peu plus de détails, i.e.
#lors de la création de l'initramfs (initrd).

VERBOSE=true

# MAIL_TO:
#Cette option est maintenant définie dans /etc/mdadm/mdadm.conf (MAILADDR).

Voir également /etc/mdadm/mdadm.conf (ou /etc/mdadm.conf)

/etc/mdadm/mdadm.conf
# mdadm.conf
#
#Merci de vous référez à "man mdadm.conf(5)".
#

#Par défaut, détecter toutes les partitions qui contiennent des superblocks ("partitions").
#Alternativement, préciser les disques à tester, les jokers ("wildcards") sont autorisés (*).

DEVICE partitions

#Créer automatiquement les volumes avec les permissions et attributs suivant:

CREATE owner=root group=disk mode=0660 auto=yes

#Automatiquement marquer les volumes comme appartenant au système local:

HOMEHOST <system>

#Adresse où envoyer les alertes du démon de surveillance ($(user)@ , root...):

MAILADDR user@localhost

#Détail des volumes MD existant:

ARRAY /dev/md0 level=raid1 num-devices=2 metadata=0.90 UUID=4a5ffe63:63c5e41a:5e161464:86942050
   devices=/dev/sdb1,/dev/sda1
ARRAY /dev/md1 level=raid1 num-devices=2 metadata=0.90 UUID=c02b4e8c:a6378d01:5e161464:86942050
   devices=/dev/sdb2,/dev/sda2

Pour mettre à jour les détails des volumes après une modification, on peut utiliser:

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

ou pour ne pas avoir les volumes raid associés “en dur” aux disques, ne pas utiliser “--verbose” mais:

$ su -c "mdadm --misc --detail --brief /dev/md?* | tee -a /etc/mdadm/mdadm.conf"

ça permet de ne pas devoir mettre à jour ce fichier en cas de changement/ajout/retrait de disques, c'est moins détaillé mais plus souple à l'usage.

:!: Avant de mettre à jour les informations de mdadm.conf, il faut avoir retiré les anciennes informations du fichier évidemment.

Commandes utiles

Création d'un volume

Ici un raid 1 (miroir) à partir de deux disques, avec une taille de secteurs de 128k (défaut 64k):

# mdadm --create /dev/md0 --level=1 --chunk=128 --raid-devices=2 /dev/sda1 /dev/sdb1

Version “compacte” de la même commande :

# mdadm -C /dev/md0 -l1 -c128 -n2 /dev/sda1 /dev/sdb1

Pour créer un volume raid 1 avec un seul disque, on utilise la directive “missing” à la place du disque (utile pour intégrer plus tard le disque système existant par exemple) :

# mdadm --create /dev/md0 --level=1 --raid-devices=2 missing /dev/sdb1

L'ajout d'un disque supplémentaire après création se fera par défaut en mode “spare” (disque de secours). En cas de panne (ou marquage --fail) sur un disque principal du volume raid la reconstruction sur ce disque “spare” sera immédiate. On peut également préciser le nombre de disques de secours à la création avec l'option “--spare-devices=” , ou en version compacte “-x” . Le nombre de disques indiqués dans “--raid-devices=” doit être le total actifs + spare.

Démarrer, arrêter les volumes raid

Démarrer tous les groupes (présents dans un fichier mdadm.conf) :

# mdadm --assemble --scan

Démarrer un volume non listé dans mdadm.conf (--assemble est abrégé “-A”). Vous devez savoir que les disques indiqué composent un volume raid, (utilisez “--query” sur les disques en cas de doute):

# mdadm -A /dev/md0 /dev/sda1 /dev/sdb1

Pour démarrer le volume dont le nombre mineur est “0” (zero), et l'assembler en /dev/md0:

# mdadm -Ac partitions -m0 /dev/md0

L'option “-m” est la version courte de “--super-minor=”.

Si le groupe raid est en mode “dégradé” (disque manquant) il sera assemblé mais pas démarré, pour le forcer utilisez “--run” en plus des autres options, ou une fois le groupe raid assemblé :

# mdadm --run /dev/md0

Si le groupe raid est marqué comme “dirty” (comportant des erreurs graves), il est possible de forcer son assemblage malgré tout (non recommandé, peut compromettre la récupération de donnée, ou mener à la perte complète du volume raid) :

# mdadm --assemble --force /dev/md0 /dev/sda1 /dev/sdb1

Pour lancer ensuite le volume assemblé utilisez “--run” (voir plus haut).

Si un groupe marqué “dirty” bloque le démarrage du système, on peut forcer son assemblage en passant l'option suivante sur la ligne du noyau (dans le menu du chargeur d'amorçage) :

md-mod.start_dirty_degraded=1

Comme tout les forçages, ça n'est pas conseillé avant d'avoir essayé de résoudre le problème autrement.

Stopper un groupe donné (ici “md0”) :

# mdadm --stop /dev/md0

Démarrer un volume non listé dans mdadm.conf (--assemble). Vous devez savoir que les disques indiqué composent un volume raid, (utilisez “--query” sur les disques en cas de doute):

# mdadm -A /dev/md0 /dev/sda1 /dev/sdb1

Pour démarrer le volume dont le nombre mineur est “0” (zero), et l'assembler en /dev/md0:

# mdadm -Ac partitions -m0 /dev/md0

Pour examiner un groupe raid

# mdadm --query /dev/md0

ou plus détaillé :

# mdadm --detail /dev/md0

Informations sur l'ensemble des volumes raid, et les actions en cours comme le temps de reconstruction, statut (“clean”, “fail”, “missing” …):

# cat /proc/mdstat

mdadm écrit les informations relatives au volume dans un “superblock” qui agit comme un marqueur, sur chaque disque qui compose le volume.
Pour examiner les informations du superblock:

# mdadm --examine /dev/sda1

Les “superblock” sont persistent, même après retrait d'un disque d'un volume raid. Pour éliminer le “superblock” (indispensable avant de réutiliser le disque dans un volume raid) :

# mdadm --zero-superblock /dev/sda1

Pour ajouter/retirer un disque

Dans ces exemples on considère qu'il n'y a qu'une partition par disque, sinon il faut ajouter toutes les partitions du nouveau disque aux groupes raid, et marquer en “--fail” et retirer toutes les partitions de l'ancien disque.

# mdadm /dev/md0 --add /dev/sdc1

Pour retirer un disque, on procède en deux étapes :

# mdadm /dev/md0 --fail /dev/sda1
# mdadm /dev/md0 --remove /dev/sda1

Pour rapidement remplacer un disque on peut combiner les options :

# mdadm /dev/md0 --add /dev/sdc1 --fail /dev/sda1 --remove /dev/sda1

La reconstruction sur le disque nouvellement ajouté commencera immédiatement.

Raid partitionnable

À partir du noyau 2.6.28 tous les raid sont partitionnables (la situation est moins claire pour les noyaux plus anciens), c'est à dire que l'on peut créer un raid à partir d'un disque entier (non partitionné), et créer les partitions sur le raid par la suite. Le raid partitionnable ainsi créé sera normalement noté “md_d?”, et les partitions créées sur ce raid seront notées “md_d?p?” où “?” est un chiffre.
Pour créer un raid partitionnable on utilise l'option “--auto=” suivi de (au choix) “p”, “mdp” ou “part” :

# mdadm -C --auto=mdp /dev/md_d0 -l1 -n2 /dev/sda /dev/sdb

Ici on crée un raid 1 partitionnable nommé “md_d0” comprenant l'intégralité des disques /dev/sda et /dev/sdb. Par défaut le nombre de partitions autorisées est de 4, pour outrepasser ce réglage il suffit d'indiquer le nombre de partitions souhaitées lors de la création, par exemple pour pouvoir créer 8 partitions sur le raid on utilisera “--auto=mdp8”.

À noter que lors de tests avec différentes distributions, il a été parfois très difficile de démarrer un système dont la partition racine était située sur un raid partitionnable. Lors d'une utilisation successive de raid non partitionnable avec différentes distributions (multi-boot), des ensembles raid distincts (md0, md1…) situés sur un même disque se sont retrouvés identifiés comme des partitions d'un même ensemble (md0p1, md0p2). Si vous rencontrez ce cas n'utilisez PAS le raid, stoppez tout et redémarrez sur le système d'origine pour éviter tout risque de corruption de données.

Le chargeur d'amorçage grub2 supporte à partir de la version 1.99 le démarrage directe sur raid partitionné, avec ou sans /boot séparé, en utilisant des métadonnées de type 1.* (testé avec 1.2)

Pour créer expressément un raid non partitionnable, on peut utiliser “--auto=md” ou remplacer “md” par “yes”. Ce comportement est normalement celui par défaut.

Si vous désirez plus de souplesse dans la gestion de l'espace du raid, il vaut mieux se tourner vers le “lvm” (“Logical Volume Management” ou “volumes logiques” en français) qui peut s'utiliser en sur-couche d'un raid.

Utilisation avancée

Partager des disques de secours

On peut préciser un groupe de volumes raid qui pourront se partager un “spare” (disque de secours) en cas de défaillance. Ça permet de toujours disposer de disques de secours sans pour autant en monopoliser un par volume raid. On ajoutera à /etc/mdadm/mdadm.conf:

DEVICE /dev/sda1 /dev/sdb1 /dev/sdc1 /dev/sdd1 /dev/sde1

ARRAY /dev/md0 level=raid1 num-devices=2 UUID=25cd832e:6f1c45c0:163f7b98:1dc35ffe devices=/dev/sda1,/dev/sdb1
spare-group=group1

ARRAY /dev/md1 level=raid1 num-devices=2 UUID=aee5ac6c:ec9e36ab:51ac5e46:3b54ef58 devices=/dev/sdc1,/dev/sdd1,/dev/sde1
spare-group=group1

Ici le disque de secours /dev/sde1 qui appartient au volume raid1 /dev/md1 sera aussi disponible en cas de défaillance d'un disque du volume raid1 /dev/md0. Attention, la taille du volume du disque “spare” doit avoir une taille au moins égale au plus grand des volumes raid auxquels il est associé.

Augmenter la taille d'un volume raid

Si vous voulez remplacer les disques de 500GB qui composent votre raid1, par des disques de 1TB, ou si vous voulez ajouter un disque à un raid5, vous devrez étendre le volume raid puis le système de fichiers.

On considère un raid5 sur trois disques, auquel on ajoute /dev/sde1 :

# mdadm /dev/md0 --add /dev/sde1
# mdadm /dev/md0 --grow --backup-file=/fichier/sauvegarde --raid-devices=4
# e2fsck -fp /dev/md0
# resize2fs /dev/md0
# e2fsck -fp /dev/md0

Lors de la seconde étape l'option (facultative) “--backup-file=” permet de créer un fichier de sauvegarde avec les principaux attributs du raid, et de l'utiliser si quelques choses tourne mal (on utilise à nouveau la même option “--backup-file=” avec “--assemble”). Pour que cela ait un intérêt, le fichier de sauvegarde ne doit pas se trouver sur le raid sur lequel on travail !

Maintenant pour un raid1, on veut passer de disques de 160GB à des 500GB :

On considère que le raid est composé de /dev/md0 (/dev/sda1, /dev/sdb1), et /dev/md1 (/dev/sda2 et dev/sdb2), on ajoute les nouveaux disques un par un aux volumes raid, mais on considère qu'ils sont déjà installés dans la machine, et partitionnés:

# mdadm /dev/md0 --fail /dev/sda1
# mdadm /dev/md1 --fail /dev/sda2
# mdamd /dev/md0 --remove /dev/sda1
# mdadm /dev/md1 --remove /dev/sda2

On ajoute le premier nouveau disque:

# mdadm /dev/md0 --add /dev/sdc1
# mdadm /dev/md1 --add /dev/sdc2
$ cat /proc/mdstat

On attend que la reconstruction soit finie, puis on enlève l'ancien disque restant:

# mdadm /dev/md0 --fail /dev/sdb1
# mdadm /dev/md1 --fail /dev/sdb2
# mdamd /dev/md0 --remove /dev/sdb1
# mdadm /dev/md1 --remove /dev/sdb2

On ajoute le second nouveau disque:

# mdadm /dev/md0 --add /dev/sdd1
# mdadm /dev/md1 --add /dev/sdd2
$ cat /proc/mdstat

Quand la synchronisation est finie, on étend le volume raid sur l'ensemble de la taille disponible sur les nouveaux disques:

# mdadm --grow /dev/md0 --size=max
# mdadm --grow /dev/md1 --size=max

Finalement on étend le système de fichier pour qu'il corresponde à la taille des volumes raid:

# resize2fs /dev/md0
# resize2fs /dev/md1

N'oubliez pas d'effacer les superblock des anciens disques pour les réutiliser.

Il est conseillé de procéder sur un volume non monté (live-cd), ou à la rigueur en mode “single user” (appelé aussi “maintenance mode” ou “init 1”), et bien entendu d'avoir une sauvegarde à jour des données, des informations des superblock, et de mdadm.conf.

:!: Il est fortement recommandé de recréer un initrd (“Initial Ram Disk”) après ce genre de modifications, particulièrement si vous utilisez lvm au dessus du raid, ou si votre partition /root est sur le raid. Pensez aussi à vérifier et mettre à jour les informations de mdadm.conf (uuid des groupes).

Solutionner une erreur de taille entre les superblocks et les tables de partitions des disques

Il arrive après création d'un volume raid sur des disques ayant un système de fichier qui occupe la totalité du disque, et/ou en mode “missing” avec ajout ultérieur du deuxième disque, que “fsck” refuse de s'exécuter, voir bloque le démarrage. La raison invoqué sera une différence dans la taille du volume raid reporté par les superblock, et la taille du système de fichier sous-jacent reporté par les table de partition des disques.
Généralement la taille reportée par le superblock est plus importante, car elle “ajoute” artificiellement l'espace occupé par les superblocks lors de leur création, cela se produit lorsqu'on “force” la création des superblock sur un système de fichier existant.

Pour résoudre le problème:

# e2fsck -cc /dev/md0
# resize2fs /dev/md0
# e2fsck -fp /dev/md0

À effectuer sur un volume raid non monté (depuis un live-cd par exemple). Le “e2fsck -cc” est extrêmement long, comptez 10 heures/500Go.

Pour ne pas rencontrer ce genre de problème il faut éviter de créer des groupes raids à partir de partitions qui comportent déjà des systèmes de fichiers. Si c'est indispensable (dans le cas où on crée le raid sur un disque en mode “--missing” avant d'ajouter les autres disques) il faut réduire la taille des systèmes de fichiers de ± 1Mo. Une fois le raid créé on redimensionne l'ensemble avec “resize2fs”.
Mieux, on créé le volume raid à partir de partitions sans système de fichier, et on formate le volume raid après sa création (“mkfs /dev/md0”).

Les formats de métadonnées

Il existe plusieurs formats de métadonnées en usage pour différentes versions de mdadm, ou parfois d'une distribution à l'autre le réglage par défaut change. Pour connaître le format des métadonnées vous pouvez utiliser :

# mdadm --detail /dev/md?

ou sur une partition qui fait partie d'un raid :

# mdadm --examine /dev/sd??

Le format le plus courant est le “0.90” (parfois noté “0”, le plus ancien et limité à 28 élément par groupe raid, et 2To pour chaque composant), on peut trouver les différentes déclinaisons de la version “1” (1.0, 1.1, 1.2) qui ont pour seuls différences entre elles l'emplacement des superblocks sur le disque. Ces formats plus récents occupent moins de place sur les disque que le “0.90”.
Existe également les formats “ddf” et “imsm” d'usage moins courant, basés sur l'usage de “container”.
Si vous changez des disques raids de machines, ou que vous changiez de système d'exploitation, il peut être important de vérifier quel est le type par défaut.
On peut préciser la version de métadonnées avec l'option “--metadata=” lors de la création d'un groupe raid. Attention, changer de version de métadonnées après coup nécessite la recréation du raid, et donc entraîne la destruction des données contenu sur celui-ci. Chercher à passer outre risque d'entraîner des pertes de données et une inconsistance des systèmes de fichiers étant donné que les métadonnées risquent d'être écrites par dessus des données existantes.
Tous les types de métadonnées 0.90 ou 1.* permettent l'amorçage directe du système sur un volume raid, avec les formats récents (1.*) il n'est pas nécessaire de changer le type de système de fichier des volumes raid pour “fd” (raid-auto-detect), la détection sera automatique (le fichier mdadm.conf doit être tenu à jour).

Il est parfois possible d'effectuer des manipulations “limites” (et non supportées officiellement) en agissant sur les métadonnées, comme convertir directement un raid1 en raid5 sans perte de données. Voir par exemple cette page (eng), attention, ces manipulations sont au-delà de l'usage normal…

Liens

—————————————————————————

Envoyer un message au mainteneur

expert/mdadm.txt · Dernière modification: 2014/05/09 18:56 (modification externe)