Retour à l'accueil

LE RAID SOUS GNU/LINUX


Ce document explique comment mettre en place plusieurs types différents de RAID logiciel sur une plateforme Linux.

Document écrit par Guillaume LEHMANN : lehmann chez free point fr d'après le document d'Olivier LAMBERT (dixit Ceituna) : ceituna chez ardilla point asso point fr

Version 1.1 du document datant du 26/12/2002

Version 1.2 du document datant du 05/01/2007

Version 2.0 du document datant du 19/04/2008



Introduction :

Eléments utiles pour la mise en place :

Partitionnement :

Compilation du noyau :

Création des partitions raid :

Le Root / sur la pente RAID :

Test à ne pas faire et que j'ai fait :) :

Pour aller plus loin :

Contact :




Introduction :

Vous avez peut-être eu envie de bouffer un chien ou écraser des vieux, un jour de désespoir où votre disque dur flambe sans prévenir, et que vous n'avez pas sauvegardé sur CD le projet qui doit impérativement être rendu le lendemain ?

Voici votre sauveur (pour la prochaine fois ) : Linux et RAID !!!!


Remarque : Le mot RAID est un acronyme pour 'Redundant Array of Inexpensive Disks'.


Eléments utiles pour la mise en place :

Comme pour une recette de cuisine, il faut posséder les ingrédients avant de commencer. Ici, on va avoir besoin :

--> d'une bonne dose de café,

--> un PC (même un 486 fait l'affaire, mais attention au temps de recompilation !),

--> plusieurs disques durs, minimum 2 pour le RAID 1, voir 3 pour le RAID 5. Ces disques ne seront pas nécessairement de même taille mais ne contiendront pas de données que vous ne voulez pas perdre pendant les tests,

--> les sources d'un noyau Linux de version supérieure à 2.2.13, et tout le nécessaire pour le compiler,

--> le programme raidtools est à ce jour remplacé par mdadm, en version supérieure à 2.5.6,

--> il faut avoir Linux installé sur une partition que l'on utilisera au début, ou sur un disque différent.


Partitionnenement :


Il existe plusieurs définitions de la technologie RAID, allant de 'RAID 0' à 'RAID 7' (sous Linux 2.6.19, on s'arrête au RAID 6) sans compter les combinaisons possibles comme RAID 10 (RAID 1 + RAID 0). On peut utiliser sur un même système plusieurs technologies RAID. C'est d'ailleurs le cas traité par ce document. Mais attention tout de même à la cohérence de ce mélange des technologies RAID.


Il existe un grand nombre de documentations expliquant dans le détails des spécificités de chaque technologie RAID. Je ne les rependrai donc pas ici. Notons qu'aujourd'hui, les RAID 2, 3 et 4 sont obsolètes. Cependant, pour justifier mes choix, voici un tableau récapitulatif :

Description

Disponibilité

Taux de requête

Taux de transfert

Facteur de coût

Type d'applications

Striping (RAID 0)

> 1 disque, inversement proportionnelle au nombre de disques

Grands segments : excellent

Petits segments : excellent

1

Hautes performances, données non critiques

Shadowing (RAID 1)

Très bonne

Bon

Moyen

2

Données critiques, disque système

Striping-shadowing (RAID 0 + 1)

Très bonne

Excellent

Bon

2

Temps de réponse critique

Striping données, parités dédiée (RAID 4)

Très bonne

Faible

Excellent

1,25

Grandes entrées-sorties

Striping données + parité (RAID 5)

Très bonne

Excellent

Moyen

1,25

Lecture intensive

Striping données + (redondance de la) parité (RAID 6)

Très très bonne

Excellent

Bon

1,5

Lecture intensive



Quel RAID choisir ? :

--> 'J'utilise pas mal les ressources systèmes, et je suis mal si je les perds' -> RAID 1,

--> 'Il faut surtout que je ne perde pas mes données perso et j'ai au-moins 3 disques durs !' -> /home ira sur un RAID5,

--> 'Il faut surtout que je ne perde pas mes données perso, mais je n'ai que 2 disques durs !' -> /home ira sur un RAID 1,

--> 'je ramasse plein de programmes inutiles, et je veux du débit, et un maximum de place utile ... /ftp' -> RAID0,

Le cas 3 me concerne, et uniquement celui-ci.

Lors de l'installation de votre GNU/Linux Debian, vous avez pu déclarer des partitions RAID. Si ce n'est pas le cas, créez-les avec un outils de partitionnement tel que GParted (graphique), fdisk (console) ou autre en les marquant comme des partitions RAID. Attention, les données présentes sur un disque sur lequel vous faites ces manipulations vont peu-être perdues, à fortiori si elles sont sur les futures partitions RAID que vous formatez.
On ne formate pas une partition en RAID, on la formate dans un système de fichier tel que ext3 et c'est le fait de mettre une marqueur (flag) de type raid qui fait que la partition peut-être inclue dans du RAID ou non.


Personnellement, mon partitionnement est le suivant :

--> /dev/hda : 20 Go dont 5 Go non affectés.
....--> /dev/hda1 : 15 Go en ext3 (devient /dev/md0 pour le /home).

--> /dev/hdb : rien.

--> /dev/hdc : lecteur CD.

--> /dev/hdd : lecteur CD.

--> /dev/sda : 80 Go partitionné comme suit :
....--> /dev/sda1 : en ext3 (pour une utilisation future),
....--> /dev/sda2 : en ext3 (pour une utilisation future),
....--> /dev/sda3 : 20 Go en ext3 (pour le /),
....--> /dev/sda4 : partition logique comprenant sda5 et sda6,
....--> /dev/sda5 : 500 Mo de swap (type 83),
....--> /dev/sda6 : 15 Go en ext3 (devient /dev/md0 pour le /home).

Compilation du noyau :

Je n'expliquerai pas ici comment compiler un noyau ou comment mettre en natif le filtrage de paquet. La seule chose qui nous concerne sont les fonctionnalités que le noyau doit supporter :


Pour l'accès avec 'menuconfig' :

--> Rentrer dans 'Device Drivers',

--> puis dans 'Multi-device support (RAID and LVM)',

--> Activer la fonctionnalité 'Multiple devices driver support (RAID and LVM)'.

--> Activer ensuite la fonctionnalité 'RAID support'. Cette dernière s'affiche après avoir activé 'Multiple devices driver support (RAID and LVM)'. De nouvelles fonctionnalités apparaissent,

--> Activer 'Linear (append) mode' si on compte utiliser le mode linéaire,

--> Activer 'RAID-0 (striping) mode' si on compte utiliser le RAID 0,

--> Activer 'RAID-1 (mirroring) mode' si on compte utiliser le RAID 1,

--> Activer 'RAID-4/RAID-5/RAID-6 mode' si on compte utiliser le RAID 4 et/ou le RAID 5.


Pour ceux qui configurent le noyau en ligne, ou chargent directement un fichier de configuration, voici la correspondance des options et des noms :

--> 'Multi-device support (RAID and LVM) : CONFIG_MD',

--> 'RAID support : CONFIG_BLK_DEV_MD',

--> 'Linear (append) mode : CONFIG_MD_LINEAR', le module est 'linear.o',

--> 'RAID-0 (striping) mode : CONFIG_MD_RAID0', le module est 'raid0.o',

--> 'RAID-1 (mirroring) mode : CONFIG_MD_RAID1', le module est 'raid1.o',

--> 'RAID-4/RAID-5/RAID-6 mode : CONFIG_MD_RAID456', le module est 'raid456.o'.


Création des partitions raid :

Maintenant début la configuration à proprement parlé :
S'assurer qu'aucun RAID n'est activé avec la commande :
less /proc/mdstat

Si un RAID est activé (par exemple /dev/md0), l'arrêter avec la commande :
mdadm --stop /dev/md0


Contenu de /proc/partitions :
major minor  #blocks  name

   3     0   19925880 hda
   3     1   14651248 hda1
   3     2    5269320 hda2
   8     0   80418240 sda
   8     1    8787523 sda1
   8     2   37439482 sda2
   8     3   19045057 sda3
   8     5     489951 sda5
   8     6   14651248 sda6
   9     0   14651136 md0


Je veux donc faire une RAID1 avec sda6 et hda1.

Ci-dessous le contenu de /etc/mdadm/mdadm.conf :
# mdadm.conf
#
# Please refer to mdadm.conf(5) for information about this file.
#

# by default, scan all partitions (/proc/partitions) for MD superblocks.
# alternatively, specify devices to scan, using wildcards if desired.
# >>>> On laisse "partitions" car on a vu que dans le fichier /etc/partitions les deux partitions que l'on veut mettre en RAID apparaissent bien.
DEVICE partitions

# auto-create devices with Debian standard permissions
CREATE owner=root group=disk mode=0660 auto=yes

# automatically tag new arrays as belonging to the local system
HOMEHOST <system>

# instruct the monitoring daemon where to send mail alerts
MAILADDR root

# definitions of existing MD arrays
ARRAY /dev/md0 level=raid1 num-devices=2 UUID=67673e65:72207df5:e1754079:9847892a

# This file was auto-generated on Sun, 13 May 2007 20:11:38 +0000
# by mkconf $Id: mkconf 261 2006-11-09 13:32:35Z madduck $


mdadm -C /dev/md0 --level=raid1 --raid-devices=2 /dev/sda6 /dev/hda1

Est affiché alors (ici les 2 partitions indiquées font déjà parties d'un RAID) :
mdadm: /dev/sda6 appears to be part of a raid array:
    level=raid1 devices=2 ctime=Mon Apr  9 12:27:45 2007
mdadm: /dev/hda1 appears to be part of a raid array:
    level=raid1 devices=2 ctime=Thu Apr 12 01:30:12 2007
Continue creating array? y
mdadm: array /dev/md0 started.

En regardant dans /proc/mdstat on voit que la synchronisation se fait :
Personalities : [raid1]
md0 : active raid1 hda1[1] sda6[0]
      14651136 blocks [2/2] [UU]
      [==>..................]  resync = 13.9% (2039232/14651136) finish=8.0min speed=26024K/sec

unused devices: <none>


On peut avoir plus de détail sur le RAID avec la commande :
mdadm --detail /dev/md0

Qui donne :
/dev/md0:
        Version : 00.90.03
Creation Time : Sun May 13 23:34:55 2007
       Raid Level : raid1
       Array Size : 14651136 (13.97 GiB 15.00 GB)
       Device Size : 14651136 (13.97 GiB 15.00 GB)
       Raid Devices : 2
       Total Devices : 2
       Preferred Minor : 0
       Persistence : Superblock is persistent

Update Time : Sun May 13 23:34:55 2007
         State : clean, resyncing
         Active Devices : 2
         Working Devices : 2
         Failed Devices : 0
         Spare Devices : 0

Rebuild Status : 37% complete

         UUID : 6865669d:01b200c2:911d6f4c:5f0c1da2 (local to host pipote)
         Events : 0.1

Number   Major   Minor   RaidDevice State
       0       8        6        0      active sync   /dev/sda6
       1       3        1        1      active sync   /dev/hda1


Attendre la fin de la synchronisation avant de passer à la suite ...
La ligne suivante nécessite l'installation de utils-linux. Il n'est pas nécessaire de refaire ce formatage si cela a été fait lors de l'installation (voir plus haut).
On va maintenant formater les partitions en ext3 (-j) en vérifiants la présence de blocs défectueux (-c) :
mke2fs -j -c /dev/md0

Le système de fichier sera vérifié tous les 23 montages ou tous les 180 jours. Si ces valeurs ne vous conviennent pas, vous pouvez les modifier à l'aide de la commande "tune2fs" (voir les options -c et -i).

On peut passer à l'étape suivante : le déclarer dans le /etc/fstab. Pour cela rajouter la ligne suivante :
/dev/md0    /home    auto    defaults,errors=remount-ro 0 1

On peut aussi le monter à la main pour vérifier :
mount /dev/md0 /home

Ca y est c'est terminé !


Ci-dessous l'ancienne version, maintenant obsolète :

Courage, la majeure partie du travail est désormais finie...

Si vous n'avez pas encore installé le package raidutils2, il faut le faire maintenant avant de passer à la suite.

Avant de créer les partitions raid, il faut définir un fichier /etc/raidtab, contenant les définitions raid.


Voici un aperçu du contenu de ce fichier :

raiddev /dev/md0 # On peut configurer jusqu'à 16 RAIDs différents sur une machine.

raid-level 1 # Type de RAID utilisé.

nr-raid-disks 2 # Nombre de disques utilisés dans ce RAID.

nr-spare-disks 0 # Nombre de disque en spare => remplace à chaud le disque défaillant.

persistent-superblock 1 # Il faut que l'auto-détection du RAID soit activé dans le noyau.

chunk-size 4 # Indique la répartition sur les différents disque durs des données que l'on écrit à un moment donné.

device /dev/hda3 # On utilise le disque (la partition) /dev/hda3.

raid-disk 0 # Le disque /dev/hda3 est le numéro 0.

device /dev/hdc3 # On utilise aussi le disque (la partition) /dev/hdc3.

raid-disk 1 # Le disque /dev/hdc3 est le numéro 1.

# device /dev/hdb3 # Si j'avais des disques en plus, je les définirais ici pour qu'ils remplacent à chaud le disque défaillant.

# spare-disk 0 # On peut même en mettre plusieurs en attente ! Ici ce serait le premier pour ce RAID.


# On recommence ici pour définir un autre RAID.

raiddev /dev/md1

raid-level 5

nr-raid-disks 3

nr-spare-disks 0

persistent-superblock 1

parity-algorithm left-symmetric # Algorithme de placement de la parité. Ici c'est le cas qui permet d'obtenir les meilleures performances.

chunk-size 32

device /dev/hda2

raid-disk 0

device /dev/hdc2

raid-disk 1

device /dev/hdd2

raid-disk 2

# device /dev/hdb2 # Toujours pas de disque en spare.

# spare-disk 0


# Cette partition sera activée lorsque j'aurais mis le / sur une partition raid, et que je pourrai disposer de la partition /dev/hda4...

# raiddev /dev/md2

# raid-level 0

# nr-raid-disks 2

# nr-spare-disks 0

# persistent-superblock 1

# chunk-size 4

# device /dev/hda4

# raid-disk 0

# device /dev/hdc4

# raid-disk 1

#

## device /dev/hdc4

## spare-disk 0



Maintenant, nous pouvons créer les partitions raid.

On initialise tout d'abord la partition md0 puis la partition md1

mkraid /dev/md0

mkraid /dev/md1


Il faut ensuite y mettre en place un système de fichiers :

mke2fs /dev/md0

mke2fs /dev/md1



Tout est maintenant en place et l'on peut voir l'activité du RAID à travers le fichier /proc/mdstat .

Vous pouvez désormais monter ces partitions où bon vous semble, et si vous les voulez à chaque redémarrage, une petite modification au fichier /etc/fstab s'impose. Rajouter la ligne suivante, en remplaçant X par le numéro du RAID :

/dev/mdX /raid ext2 defaults,errors=remount-ro 0 0


Les plus courageux peuvent passer à l'étape suivante : booter sur une partition RAID !


Le Root / sur la pente RAID :

Il y a ici une restriction : on ne peut booter que sur des partitions RAID0 ou RAID1 avec la version actuelle de lilo (22.1). Ce n'est pas encore possible pour le RAID5.

Si tout ce qui vient d'être définit précédemment est réalisé, nous pouvons dire que le plus gros est fait.

Premièrement : monter votre future partition raid avec la commande suivante (penser à créer le répertoire /mnt/raid si cela n'a pas déjà été fait) :

mount /dev/md0 /mnt/raid


Ensuite, si vous n'avez pas de système de fichiers monté, taper les commandes suivantes :

cd /

find . -xdev | cpio -pm /mnt/raid


Une fois que tout est copié, il faut modifier le /mnt/raid/etc/fstab avec votre éditeur préféré :

/dev/md0 / ext2 defaults,errors=remount-ro 0 1


Ensuite, il faut modifier le fichier /mnt/raid/etc/lilo.conf . Pour cela, il vous faut alors connaître la géométrie exacte de votre disque sur lequel vous démarrez (secteurs, pistes, têtes). Il en suit le fichier /etc/lilo.conf suivant :

disk=/dev/md0

bios=0x80

sectors=63

heads=16

cylinders=29770

boot=/dev/md0

map=/boot/map

install=/boot/boot.b

message=/boot/bootmess.txt

prompt

delay=20 #nombre de déci-secondes d'attente: augmenter si nécéssaire

timeout=20

default=Linux

image=/bzImage

label=Linux

read-only

image=/bzImage.old

label=LinuxOLD

read-only

optional


En fait, avec les premières lignes, on arrive à 'tromper' le système...

Une fois sauvegardé, il faut l'écrire en dur sur votre disque dur :

lilo -r /mnt/raid


Ceci permet de 'chrooter' l'environnement, et de permettre le boot adéquat.

Il reste plus qu'à redémarrer la machine, et s'extasier sur la beauté de l'Oeuvre !

Maintenant, il ne vous reste plus qu'à mettre en place la partition qui fut utilisée avec le système original, pour l'inclure dans une partition raid. Saurez-vous le faire ? Je pense que oui ;)


Test à ne pas faire et que j'ai fait :) :

Vous vous êtes constitué un joli jouet, mais comme tout grand enfant, il faut le faire souffrir pour voir s'il est bien ;)

On peut commencer par les test simples : pour ma vielle machine (P133 avec 48Mo de RAM), j'avais de débits de l'ordre de 2,7 Mo/s sur le Raid5 (et 100% de CPU), et de l'ordre de 12 Mo/s en RAID 1 (avec 40% de CPU), pour la reconstruction des données (équivalent du e2fsck...).

Pour le transfert, j'ai sacrément été surpris : le débits ont tout simplement doublé par rapport au système " NonRaid ", avec une charge CPU de 2% en RAID 1, et 8% en RAID 5.

Mais le plus intéressant, reste la solidité en cas de défaillance : Ceci est EXPLICITEMENT DECONSEILLE, mais je n'ai pas pu m'empêcher de le réaliser.... :-|

Après avoir commencé un gros transfert entre '/dev/md1' (RAID 5) et '/dev/md0' (RAID 1), j'ai DEBRANCHE le disque dur à chaud (hda) : après 2 ou 3 secondes d'interruption, le transfert à repris, et le disque était simplement marqué comme défaillant !

Le disque ayant été rebranché A CHAUD, le système s'est bloqué pendant 5 ou 6 secondes, puis a repris le transfert tranquillement.

Il faut l'avouer : les performances de ce système sont impressionnantes : il a alors suffi d'une ligne de commande pour réintégrer le disque comme valide, et le système a alors commencé à synchroniser les données !

Ne pouvant m'empêcher de mener à bien mes tests, la même manipulation fut alors effectuée sur le disque hdc. Le bus entier fut mis comme défectueux, et le disque hdd se retrouva au chômage forcé. Je fus alors obligé de redémarrer la machine pour récupérer la main sur le disque, mais en ce qui concerne les données ... rien ne fut perdu.

Moralité : Si vous le pouvez, essayez de mettre vos disque sur des contrô;leurs différents, notamment pour les systèmes en RAID 1.


Pour aller plus loin :

Quelques commandes pour la manipulation du RAID ...
Marquer comme défectueux une partition de ma matrice RAID :
mdadm /dev/md0 -f /dev/sda6
S'affiche alors :
mdadm: set /dev/sda6 faulty in /dev/md0

Enlever une partition de la matrice RAID :
mdadm /dev/md0 -r /dev/sda6
S'affiche alors :
mdadm: hot removed /dev/sda6

Ajouter une partition à la matrice RAID :
mdadm /dev/md0 -a /dev/sda6
S'affiche alors :
mdadm: hot added /dev/sda6

Démarrer tous les RAID :
mdadm --assemble --scan
ou pour monter seulement le RAID md0 (avec les partition hda1 et sda6) :
mdadm --assemble /dev/md0 /dev/sda6 /dev/hda1

Arrêter le RAID md0 :
mdadmin --stop /dev/md0

Pour connaître toutes les possibilités de mdadm (comme envoyer un email si une défaillance est détectée !), se référé à "man 8 mdadm".


Contact :

Olivier LAMBERT (dixit ceituna!) : ceituna at ardilla point asso point fr

Guillaume LEHMANN (dixit porki) : lehmann at free point fr

Valid HTML 4.01!