Plan du KiWi
Si vous n'avez pas trouvé votre bonheur dans les liens plus haut, le plan vous montrera les quelques pages “cachées” de ce kiwi !
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.
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 Suse, 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…).
# /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:
# mdadm --misc --detail --brief /dev/md? >> /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.
Création d'un volume 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/arrêter un volume:
# mdadm --start /dev/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 volume 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” d'environ 128K 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.
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 --raid-devices=4 e2fsck -fp /dev/md0 resize2fs /dev/md0 e2fsck -fp /dev/md0
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.
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.
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 au lieu de l'en soustraire.
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).