Ceci est une ancienne révision du document !
RAID logiciel avec mdadm
Introduction
Vous venez de terminer une installation d'Ubuntu et voulez protéger vos données en utilisant un système redondant RAID (1, 5 et 6). Le RAID 0 n'est pas redondant. Le but ici, n'est pas d'exposer les avantages et les inconvénients de tel système, mais de vous permettre d'en monter un dans les plus bref délais.
Pour plus de détails, Wikipédia est bien fourni :
Tout ce qui suit a été testé sur la version serveur d'Ubuntu mais est aussi compatible avec la version desktop.
L'exemple utilisé est un montage RAID 5 logiciel, mais la méthode pour les autres types de RAID logiciel est la même.
L'avantage est que vous ne vous ruinez pas dans l'achat d'une carte fille supportant le RAID 5 et en quelques lignes de commandes vous avez l'équivalent pour uniquement le prix des disques !
Mdadm remplace aussi avantageusement l'utilisation d'un fake-raid
L'utilisation de disques durs SATA, est plus que recommandée, car ils permettent une extraction à chaud (Hot Plug) pour un prix abordable.
Le logiciel qui va nous permettre de remplir notre objectif s'appelle mdadm.
Pré-requis
- Il faut les droits root
- Il faut un noyau supérieur à 2.6
- Connexion Internet configurée et activée (utilisez le DHCP, si possible, cela évite de se casser la tête).
- Configurez votre fichier /etc/apt/sources.list pour qu'Ubuntu aille tout chercher sur Internet.
- Ayez au moins 2 disques durs (cas du RAID 0 ou 1) ou 3 disques durs (cas du RAID 5) ou 4 disques durs (cas du RAID 6 et RAID 10)
- … branchés sur des contrôleurs reconnus par Ubuntu
Installation
Installation de mdadm
Il suffit d'installer le paquet mdadm.
Configuration des disques durs
Comme dit plus haut dans les pré-requis, il faut au moins 3 disques durs pour faire du RAID 5, dans cet exemple j'ai pris 4 disques, mais l'opération est la même si vous en prenez 5, 6, 7, etc…
Il faut partitionner les disques durs que nous allons utiliser grâces à l'utilitaire fdisk. Ici je vous guide pour un disque, à vous de le faire autant de fois que vous voulez utiliser de disques :
fdisk /dev/sdX
Il faut comprendre que le `sdX` représente votre disque dur et que `X` représente sa lettre. Par exemple `sda`, `sdb`, `sdc`, etc… pour des disques durs SATA ou SCSI, ou encore `hda`, `hdb`, `hdc`, etc… pour des disques durs en IDE
Vous obtiendrez (grâce à l'option `m`) les lignes suivantes :
Il faut donc appliquer l'option `n` comme montré ci-dessus pour créer une nouvelle partition.
fdisk vous demande alors le type de partition (p pour primaire ou e pour étendue).
Nous n'allons créer qu'une seule partition par disque, nous choisirons donc le type primaine : 'p'
Vous entrez ensuite dans le processus de création de partition étendue :
Tapez `1` comme montré ci-dessus
Tapez sur la touche `Entrée`
Tapez encore sur la touche `Entrée`
Tapez sur la touche 't' pour changer le type de partition.
Tapez 'fd' (Valeur hexadécimale correspondant à "Linux Raid Autodetect") puis `Entrée` afin de valider.
Enfin, validez les modifications en tapant `w` :
Vous venez de créer une partition primaire sur votre disque /dev/sdX
Construction du volume RAID 5
Nous pouvons maintenant utiliser mdadm pour construire notre volume RAID 5 :
mdadm --create /dev/md0 --level=5 --assume-clean --raid-devices=4 /dev/sd[bcde]1
sudo modprobe raid5 sudo modprobe md
Si l'erreur persiste, faire au redémarrage suivant :
echo raid5 >> /etc/modules echo md >> /etc/modules
On trouvera aussi des informations intéressantes dans l'article raid1_software.
Cela nécessite une petite explication :
- On utilise le fichier FIFO
/dev/md0
- On indique le type de RAID logiciel désiré (ici 5) :
--level=5
- On empêche la synchronisation suite à la création. Cette synchronisation peut durer des dizaines d'heures selon la taille du raid et dans le cadre d'une nouvelle création nous allons de toute manière formater le volume par la suite.
--assume-clean
- Enfin, on indique les partitions des disques durs qui vont servir dans le volume RAID : ici `sdb1`, `sdc1`,`sdd1` et `sde1`
--raid-devices=4 /dev/sd[bcde]1
On termine cette construction par la deamonisation du volume RAID. Nous allons faire en sorte que le système charge le volume à chaque démarrage :
mdadm --daemonise /dev/md0
On peut maintenant demander quelques détails à notre disque virtuel:
sudo fdisk -l sudo mdadm --detail /dev/md0
Finalisation
Il reste quelques modifications à effectuer :
- Il faut formater le volume RAID nouvellement créé :
mkfs.ext3 -j /dev/md0
- Déclarez ce volume dans `fstab` pour que le système le monte au démarrage (le système de fichier, pas le volume en lui même). Pour ce faire Editez le fichier /etc/fstab et ajoutez à sa fin la ligne :
/dev/md0 /media/raid ext3 defaults 0 1
Cela signifie que le système montera au démarrage le contenu du volume RAID dans le dossier /media/raid.
- Il ne reste plus qu'à créer le dossier /media/raid grâce à la commande mkdir :
mkdir /media/raid
Utilisation/Configuration
Le prochain démarrage
Il ne reste plus qu'à redémarrer votre ordinateur. Si celui-ci est lent au démarrage c'est tout à fait normal, il faut attendre que le volume RAID 5 se construise. Plus vos disques sont gros et plus la construction est longue.
cat /proc/mdstat Personalities : [raid1] unused devices: <none>
il suffit de faire, si le volume RAID est md0
sudo mdadm --assemble /dev/md0 [sudo] password for user: mdadm: /dev/md0 has been started with 2 drives.
cat /proc/mdstat Personalities : [raid1] md0 : active raid1 sda1[0] sdb1[1] 10482304 blocks [2/2] [UU] unused devices: <none>
Cette commande utilise le fichier mdadm.conf. On peut l'initialiser avec les commandes suivantes, (ici sauvegarde du fichier préexistant et génération d'un nouveau fichier).
sudo -s mv /etc/mdadm/mdadm.conf /etc/mdadm/mdadm.conf.bak echo MAILADDR root > /etc/mdadm/mdadm.conf mdadm --detail --scan --verbose >> /etc/mdadm/mdadm.conf exit
La commande assemble peut génerer un avertissement à propos d'un format métadata 00.90 inconnu, c'est un petit bug qui peut être supprimé en éditant /etc/mdadm/mdadm.conf et en changeant "00.90" pour "0.90". Celà ne gène pas le bon fonctionnement du RAID.
Que faire pour agrandir l'array ?
Une fois les disques connectés et les partitions créées avec fdisk, il suffit de les ajouter :
sudo mdadm --manage /dev/md0 --add /dev/sde1 /dev/sdf1
Ensuite étendre l'array sur ces nouvelles partitions :
sudo mdadm --grow /dev/md0 --raid-devices=5
Et enfin il vous faudra agrandir votre partition ext3 (ou similaire) via resize2fs.
sudo resize2fs /dev/md0
Que faire lorsqu'un des composants de l'Array vient à défaillir ?
Ne paniquez pas ! Vous n'avez pas perdu de données. L'objectif maintenant est d'identifier le disque dur défaillant, même si le disque ne tombe pas en panne physiquement, il peut défaillir. Maintenant que vous avez identifié le disque dur défectueux, il faut le déclarer comme tel.
1. Pour cela, on utilise mdadm :
mdadm --manage /dev/md0 --set-faulty /dev/sdb1
Explication :
On utilise toujours le paramètre `–manage` de mdadm pour gérer le volume RAID. On utilise l'option `–set-faulty` pour déclarer le disque dur `/dev/sdb1` du volume RAID `/dev/md0` comme défaillant.
2. Une fois déclaré défaillant, le disque dur est écarté du volume RAID. Il faut maintenant le désactiver pour pouvoir le retirer :
mdadm --manage /dev/md0 --remove /dev/sdb1
Vous pouvez maintenant retirer le disque défaillant en toute sécurité et le remplacer par un disque sain.
3. Une fois le remplacement effectué, il faut replacer le disque sain dans le volume RAID pour bénéficier à nouveau de la tolérance de panne (cette opération doit être précédée du partitionnement du nouveau disque, aidez-vous des descriptions faites plus haut) :
mdadm --manage /dev/md0 --add /dev/sdb1
Maintenant vous devez patienter, le temps que le volume Raid se reconstruise. Pendant cette phase de reconstruction les performances peuvent être altérées.
mdadm /dev/md0 -f /dev/sdb1 -r /dev/sdb1 -a /dev/sdb1
où -f set faulty, -r remove, -a add. Pour plus d'information : info mdadm
Comment migrer les données vers une nouvelle machine ?
Cette partie va montrer comment migrer les données d'un RAID à un autre RAID. Je vais considérer qu'il s'agit ici de la création d'une nouvelle machine pour recouvrir tous les aspects du problème. Il faut d'abord créer le nouveau RAID comme décrit dans la partie précédente. Et ré-assembler le RAID existant de façon à les faire cohabiter le temps de la copie des données. Pour cela il faut créer un nouveau fichier FIFO mais pour ne pas rentrer en conflit avec le fichier existant nous allons lui donner l'identifiant 1 :
mknod /dev/md1 b 9 1
Ensuite il ne reste plus qu'à démarrer le vieux RAID comme suit :
mdadm -A /dev/md1 --update=super-minor -m0 /dev/sd... /dev/sd...
La commande précédente demande l'assemblage en mettant à jour les informations d'identification. Le paramètre -mO s'assure que nous utiliserons que les disques/partitions qui avaient un identifiant 0.
Pour s'assurer que tout s'est bien passé vous pouvez afficher les informations mdadm :
cat /proc/mdstat
La sortie devrait ressembler à cela :
md1 : active raid5 sda[0] sdb[3] sde[2] sdf[1] 1465159488 blocks level 5, 128k chunk, algorithm 2 [4/4] [UUUU] md0 : active raid5 sdc[0] sdg[2] sdd[1] 1953524992 blocks level 5, 128k chunk, algorithm 2 [3/3] [UUU]
Si vous voulez faire persister les informations sur ce RAID vous pouvez passer la commande suivante :
mdadm --daemonise /dev/md1
Problèmes & solutions courantes
Problème de taille de block & superblock
Si en faisant une vérification vous obtenez ceci :
La taille du système de fichiers (selon le superbloc) est de 7727257 blocs La taille physique du périphérique est de 7727232 blocs Le superbloc ou la table des partitions est peut-être corrompue !
ou ceci (au boot par exemple):
my_documents: The filesystem size (according to the superblock) is 7727257 blocks The physical size of the device is 7727232 blocks Either the superblock or the partition table is likely to be corrupt! my_documents: UNEXPECTED INCONSISTENCY; RUN fsck MANUALLY. (i.e., without -a or -p options)
Cela provient certainement du fait que vous avez construit le raid sans recréer un système de fichier par dessus! Dans ce cas faites ceci :
e2fsck -f /dev/mdX
(où X est la partition raid) et sans interrompre, taper 'n' et laisser continuer (si vous n'avez pas de backup faites le avant, on ne sait jamais). Une fois fini faites :
resize2fs /dev/mdX
Cela va redimensionner la partition en fonction des info du superblock. pour être sûr revérifier (via e2fsck) la partition et cela devrait aller sans aucun problème!
Device or ressource busy ...
Si, au démarrage, vous avec un message du genre :
fsck.ext3: Device or resource busy while trying to open /dev/sdbX
Filesystem mounted or opened exclusively by another program?
Alors que /dev/sdX est un membre du raid et n'est pas lui-même présent dans fstab, cette solution peu peut-être vous aider : (on sauvegarde pour le cas où …)
sudo mv /etc/blkid.tab /etc/blkid.tab.baktimeofday
Ensuite redémarrer cela devrait être résolu.
md127
Avec Ubuntu 12.04
Si votre Raid est non fonctionnel et reconnu comme /dev/md127
Mettre à jour initramfs peut permettre de vous débloquer.
sudo update-initramfs -u
cf: http://ubuntuforums.org/archive/index.php/t-1883173.html
Des idées pour aller plus loin
Découpage du volume avec LVM
Lorsque l'on crée un volume RAID, on se retrouve vite avec de capacités tres importantes. Or, créer un seul systeme de ficher de 500 Go, voir beaucoup plus, n'est pas forcement une bonne idée ! Pour pouvoir découper cet espace de stockage à volonté et pouvoir créer autant de systeme de fichier que nécéssaire (et les redimensioner au besoin) il peut etre très interessant d'utiliser, "au dessus" du raid la fonctionalité LVM :
La combinaison des niveaux de RAID
Vous pouvez très bien combiner les niveaux de RAID. La manière la moins onéreuse de créer un RAID combiné est d'effectuer plusieurs RAID matériels puis de les combiner entre eux au niveau logiciel.
On pourra prendre comme exemple le RAID 1,0 qui fonctionne très bien. Imaginons que nous ayons 6 disques durs de 30Go, plus un disque dur système et trois cartes fille supportant le RAID 1. Créons donc trois ensembles RAID 1 (mirroring) qui feront tous 30Go. Appliquons ensuite un RAID 0 au niveau logiciel. On possède alors un seul ensemble de 90Go (3 x 30Go) et une tolérance de panne de trois disques durs (1 par unité RAID 1).
Un disque de spare : votre roue de secours en cas de défaillance
Pour ceux qui sont intéressé par la commande mdadm, sachez qu'elle possède d'autres options. L'une de ses options permet notamment d'ajouter un disque de spare, c'est à dire un disque "dormant", qui prend la relève dès qu'un disque tombe en panne. Cela vous permet une plus grande tolérance de panne.
Voici l'option permettant de prendre en compte un disque de spare :
mdadm --create /dev/md0 --level=1 --raid-devices=2 --spare-devices=1 /dev/sdX
Par contre, si vous avez déjà un array raid en service, sur sda2 et sdb2, et que vous voulez ajouter le spare sdc2 (préalablement partitionné à l'identique avec sfdisk par exemple) :
Une fois votre disque supplémentaire connecté, il vous faut créer les mêmes partitions, pour cela tapez en root dans un terminal (sudo -i, ou sudo bash je vous le rappelle)
sfdisk -d /dev/sda > sda.out sfdisk /dev/sdd < sda.out
ou sda est le disque "source", et sdd le disque "target"
mdadm --manage /dev/md0 --add /dev/sdc2
Vérifiez alors en tapant :
mdadm --detail /dev/md0
Et vous verrez votre nouveau disque sdc2 comme spare disk.
Test
Pour tester, et être sûr que tout fonctionne, faisons un test (qui revient à débrancher un disque) :
mdadm --manage /dev/md0 --set-faulty /dev/sdb mdadm --manage /dev/md0 --remove /dev/sdb
Alors le spare disque (ou le miroir…) prend le relais automatiquement. Si vous n'avez pas de spare, remettez le disque en service :
mdadm --manage /dev/md0 --add /dev/sdb2
Constatez la reconstruction avec :
cat /proc/mdstat
Chaque disque retiré puis remis fera une reconstruction complète. Pour un array de 40 Go, comptez 15 min pour atteindre les 100% (60 mo/s environ). Évitez de rebooter la machine pendant la progression.
Sans simuler la défaillance d'un disque, voici un outil qui vous permettra de vérifier si vos disques sont bien synchronisés, le test sera long. voir /usr/share/mdadm/checkarray –help pour plus d'options.
sudo /usr/share/mdadm/checkarray /dev/md0
Pour ceux qui fouillent un peu, les fichiers de configurations sont
- file:///etc/default/mdadm
- file:///etc/mdadm/mdadm.conf
Monitorer le raid
Dans le fichier mdadm.conf ou lorsque l'on utilise mdadm en mode monitoring il est possible de se faire envoyer un email lorsque il y a un évènement qui se produit, c'est bien, c'est le comportement par défaut, mais si on es pas sur un serveur (et même dans ce cas) ce n'est pas toujours l'idéal. Enfin, rien ne vous empêche d'installer mailx
L'idéal serait donc :
- Des traces d'évènement dans les log système
- Un script d'alerte perso.
Pour les logs système, si vous utilisez la ligne de commande suivante :
mdadm --monitor --syslog --delay=1800 /dev/md0 #équivalent à mdadm --monitor -y --delay=1800 /dev/md0
Ou encore, via le fichier de configuration /etc/mdadm/mdadm.conf en ajoutant :
# START_DAEMON: # should mdadm start the MD monitoring daemon during boot? START_DAEMON=true # DAEMON_OPTIONS: # additional options to pass to the daemon. DAEMON_OPTIONS="--syslog"
Cependant, le mieux et le plus intéressant reste un script maison. Plusieurs paramètre sont fourni par mdadm :
- $1 : chaine de caractère décrivant ce qui s'est passé repris parmi celle-ci :
- SparesMissing : spare disque manquant
- Fail : un ou plusieurs disque(s) défectueux
- RebuildStarted : un nouveau disque est présent et une reconstructeur à débuté
- Rebuild20, 40, 60, 80 : reconstruction en cours à 20, 40, 60 ou 80%
- RebuildFinished : la reconstruction vient de finir
- SpareActive : disque spare vietn d'être ajouté à un array
- $2 : nom du disque raid md concerné, par exemple /dev/md2
- $3 : disque concerné, par exemple /dev/sda5
Un exemple de programme se trouve localement
Pour tester son programme on peux utiliser ceci :
sudo mdadm --monitor --scan --oneshot --test --program /cheminversmonprogramme
Afin de l'ajouter, 2 chemins sont possibles : ligne de commande, si vous lancez le raid de cette manière :
mdadm --monitor --alert /cheminversmonprogramme --delay=180 /dev/md0 #ou -p ou --programm #par defaut le delay est de 60 secondes
Ou encore, via le fichier de configuration /etc/mdadm/mdadm.conf en ajoutant :
# PROGRAM # programme qui sera exécuté en cas d'évènement PROGRAM /cheminversmonprogramme
Création d'un raid sans avoir tous les disques
Il est possible de créer un raid sans avoir tout les disques au moment de la création. Pour cela au lieux de préciser /dev/sdXY on mettra missing. Par exemple, dans le cas ci-dessous il faudra ajouter un disque plus tard :
mdadm -C /dev/md0 -l1 -n2 /dev/sda1 missing
Ensuite il suffit d'ajouter le disque manquant via :
mdadm --manage /dev/md0 --add /dev/sdb1
Attention, ne pas oublier de regarder que la reconstruction du disque est finie *AVANT* de redémarrer, via
cat /proc/mdstat
Création d'un RAID1 sans avoir tous les disques et sans copie
Dans l'exemple qui suit, on va mettre la partition /dev/sda4 en mirroir avec la partition /dev/sdb4. Cette procédure ne fait pas appel au rsync pour la copie, mais utilise la recopie du mdadm ce qui permet une remise en service plus rapide.
L'exemple est fait pour une partition en ext2/ext3/Ext4. Pour le reiserfs c'est aussi faisable mail il faut ajuster les commandes (resize_reiserfs au lieu de e2fsck et resize2fs)
On demonte le file system, puis on calcule la nouvelle tailel du file system car le RAID1 va rajoute une bloc de controle
cd && umount /dev/sda4 TAILLE_INITIAL=$(fdisk -l /dev/sda4 2>/dev/null|grep "/dev/sda4" |cut -d "," -f2| cut -d " " -f2) TAILLE_F=$(( $(( TAILLE_INITIAL / 1024 )) - 12 ))K echo $TAILLE_INITIAL echo $TAILLE_F e2fsck -f /dev/sda4 resize2fs /dev/sda4 $TAILLE_F
Ici a partition est prete a accueillir le bloc de controle du raid. On construit le RAID
mdadm --create /dev/md0 --metadata=1.0 --level=1 --raid-devices=2 missing /dev/sda4 mdadm: /dev/sda4 appears to contain an ext2fs file system size=3979656K mtime=Fri Mar 11 20:21:34 2011 Continue creating array? y mdadm: array /dev/md0 started. e2fsck -f /dev/md0 e2fsck 1.41.12 (17-May-2010) La taille du système de fichiers (selon le superbloc) est de 525013 blocs La taille physique du périphérique est de 524992 blocs Le superbloc ou la table des partitions est peut-être corrompue ! Arrêter<o>? non Passe 1 : vérification des i-noeuds, des blocs et des tailles Passe 2 : vérification de la structure des répertoires Passe 3 : vérification de la connectivité des répertoires Passe 4 : vérification des compteurs de référence Passe 5 : vérification de l'information du sommaire de groupe DATA : 12/131376 fichiers (0.0% non contigus), 156488/525012 blocs
On resize le disque au cas ou mais ça ne devrait pas être utile. S'il il indique qu'il fait une modification c'est que le calcule de TAILLE_F étati insufisant
resize2fs /dev/md0 resize2fs 1.41.12 (17-May-2010) Le système de fichiers a déjà 525010 blocs. Rien à modifier !
On finit en marquant le disque comme étant un raid et on sauvegarde la configuration
~# sfdisk --id /dev/sda 4 fd ~# cp -a /etc/mdadm/mdadm.conf /etc/mdadm/mdadm.conf.origin ~# mdadm --misc --detail --brief /dev/md0 | tee -a /etc/mdadm/mdadm.conf
Vérification du status
~# cat /proc/mdstat Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10] md0 : active (read-only) raid1 sda4[1] 3979584 blocks [2/1] [_U] ~# blkid /dev/md0 /dev/md0: LABEL="DATA" UUID="ff1521f6-e70d-4134-bb33-fb9f555ff6c5" TYPE="ext4" # le raid à bien hérité du File system et du nom # on vérifier qu'une entrée pour le RAID existe dans le ficher de configuration tail /etc/mdadm/mdadm.conf
Mise en miroir : à partir du moment que le deuxieme disque est disponible :
~# mdadm --add /dev/md0 /dev/sdb4
On suit la reconstruction
watch "cat /proc/mdstat" Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10] md0 : active raid1 sdb4[2] sda4[1] 3152192 blocks [2/1] [_U] [>....................] recovery = 4.5% (144384/3152192) finish=0.6min speed=72192K/sec