Академический Документы
Профессиональный Документы
Культура Документы
Cet article présente la création d'un disque RAID logiciel sous Linux. Les exemples ont été mis en
oeuvre avec Linux Ubuntu. La forme logicielle est intéressante dans certains cas mais ne peut
jamais se substituer à la mise en oeuvre d'un RAID matériel, ne serait-ce que pour des raisons de
performance. Nous présentons presque tous les cas de RAID logiciel. Nous renvoyons le lecteur qui
le souhaite aux HOWTO pour connaître toutes les subtilités de réalisation. Sauf exception, tous les
noyaux Linux d'aujourd'hui sont compilés avec le support des disques RAID. Selon les
distributions, vous aurez parfois à installer le « package » pour accéder aux commandes et
éventuellement installer le pilote (« driver »).
1) Un peu de vocabulaire
Objet Description
L'ensemble des disques du RAID forment un seul disque. Les données sont écrits
Linéaire
linéairement sur les disques.
L'ensemble des disques du RAID forment un seul disque. Les données, logiquement
contiguës, sont écrites sur des bandes réparties uniformément sur les disques
RAID 0 physiques. Cela permet d'augmenter la rapidité en écrivant les bandes d'un bloc de
données simultanément sur plusieurs disques du RAID.
RAID 1 Il y a une redondance d'informations. Les disques sont en miroir.
On cumule les avantages du RAID 0et du RAID 1. Une bande de parité assure la
RAID 5
redondance de l'information. Un disque défaillant est reconstruit à partir des autres.
En RAID 6, il y a deux bandes de parité. Le RAID6 supporte la défaillance de deux
RAID 6
disques du RAID.
Le RAID 10 (1+0) met en RAID 0 des disques en RAID 1. On peut avoir la
RAID 10
défaillance simultanée de disques de plusieurs miroirs.
C'est un paramètre du RAID. Il désigne la plus petite quantité d'informations qui peut
chunk size
être écrite sur un disque. Dans Linux, il est de 64Ko par défaut.
Les disques qui font partie d'un RAID, généralement des partitions, sont de type "fd".
Ce type est positionné avec les commandes fdisk ou parted. Le pilote des disques
RAID les détecte automatiquement au moment du boot. Pour qu'il active les RAID
Persistent
sans que vous interveniez, il faut qu'il trouve sur ces disques les metadata qui
super block
décrivent le RAID auquel elles appartiennent. Ces informations sont stockées dans le
"Persistent super block". Si vous créez un RAID sans "Persistent super block", vous
aurez la tâche moins aisée de l'activer manuellement.
Les disques de secours ("spare disk") constituent une réserve de disques dans lesquels
le noyau puise automatiquement pour remplacer et reconstruire un disque défaillant. Si
Spare Disk le RAID n'a pas de "spare disk", c'est à l'administrateur d'ajouter manuellement au
RAID le disque qui remplace le disque défaillant. Il faut espérer qu'il n'y ait pas de
nouvelles défaillances avant le remplacement.
2) Les outils
Depuis que Linux supporte le RAID logiciel, presque tout ce qui touche aux disques RAID contient
les lettres md (« Multiple Disks »). Il en est ainsi des noms des disques RAID : /dev/md* et du
pilote. Il n'en est pas de même pour les commandes. Les premières commandes disponibles étaient
nombreuses et connues sous le nom générique de « raidtools ». Dans pratiquement toutes les
distributions, elles ont été abandonnées au profit de la seule commande mdadm qui gère toutes les
fonctionnalités du RAID. C'est, vous vous en doutez, cette commande que nous allons présenter.
Commande
mdadm La commande qui administre les disques RAID.
Fichiers
/etc/mdadm/mdadm.conf Le fichier qui contient les paramètres du(es) RAID(s)
La table du système, pseudo fichier de /proc, qui contient la description
/proc/mdstat
du(es) RAID vus par le noyau Linux.
Pour connaître la syntaxe complète de mdadm, nous renvoyons le lecteur aux pages du manuel
(man mdadm, man mdadm.conf) Nous mentionnons les éléments les plus significatifs qui
permettent la lecture des exemples.
3) Un exemple
L'exemple a été réalisé sur un système Linux Ubuntu où le le logiciel n'est pas installé. C'est la
première étape à effectuer.
# apt-get install mdadm
L'installation nous met à disposition la commande mdadm mais a aussi mis à jour le fichier initrd
pour que le noyau puisse charger le pilote des disques RAID's. Bien que cette opération soit
transparente, il nous semble utile d'en montrer quelques aspects. La lecture du prochain encadré
peut être reportée à plus tard.
# ls -l /boot/initrd*
-rw-r--r-- 1 root root 7493465 2007-10-08 21:03 /boot/initrd.img-2.6.20-16-generic
-rw-r--r-- 1 root root 8309695 2008-04-02 12:13 /boot/initrd.img-2.6.22-14-generic
-rw-r--r-- 1 root root 8043038 2008-03-21 13:36 /boot/initrd.img-2.6.22-14-generic.bak
dm-mod.ko
-rw-r--r-- 1 root root 36656 Feb 12 05:32 lib/modules/2.6.22-14-generic/kernel/drivers/md/
dm-mirror.ko
Il faut ensuite rebooter. Nous vérifions que le démon mdadm est actif et que tous les liens
symboliques ont été créés pour automatiser l'arrêt et le démarrage du service.
# ps -e | grep mdadm
6725 ? 00:00:00 mdadm
# updatedb
# locate mdadm
/etc/default/mdadm
/etc/udev/rules.d/85-mdadm.rules
/etc/udev/rules.d/65-mdadm.vol_id.rules
/etc/rc1.d/K25mdadm
/etc/cron.d/mdadm
/etc/rc3.d/S25mdadm
/etc/rc2.d/S25mdadm
/etc/rc4.d/S25mdadm
/etc/mdadm
/etc/mdadm/mdadm.conf
/etc/init.d/mdadm
/etc/logcheck/violations.d/mdadm
/etc/logcheck/ignore.d.server/mdadm
/etc/rc5.d/S25mdadm
/etc/rc0.d/K25mdadm
/etc/rc6.d/K25mdadm
...
/sbin/mdadm
Nous pouvons maintenant passer à la création des RAID's. Dans un premier temps, nous allons
créer les partitions que nous allons utiliser. Pour cela, nous disposons de quatre disques SCSI de
512 Mo /dev/sdb,/dev/sdc,/dev/sdd et /dev/sde. Sur chacun d'eux, nous allons créer une partition
/dev/sdx1 qui occupe tout le disque.
# fdisk /dev/sdb
Nous créons un RAID 0 avec les partitions /dev/sdb1 et /dev/sdc1. Le pseudo fichier /proc/mdstat
nous montre la vision des disques RAID par le noyau. Pour le visualiser, nous ferons exécuter
périodiquement la commande 'cat /proc/mdstat' par la commande watch. Nous utilisons le mode
Create et nous indiquons que le niveau de RAID est zéro et qu'il y a deux disques dans le RAID.
--detail.
# ls -l /dev/md*
brw-rw---- 1 root disk 9, 0 2008-04-02 14:11 /dev/md0
# mkfs.ext3 /dev/md0
mke2fs 1.40.2 (12-Jul-2007)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
131072 inodes, 262080 blocks
13104 blocks (5.00%) reserved for the super user
...
This filesystem will be automatically checked every 28 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.
# mount /dev/md0 /mnt/repertoire/
# mount
/dev/mapper/ubuntu-root on / type ext3 (rw,errors=remount-ro)
...
/dev/md0 on /mnt/repertoire type ext3 (rw)
# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/ubuntu-root
12G 3,1G 7,5G 29% /
...
/dev/md0 1008M 18M 940M 2% /mnt/repertoire
Raid Devices : 2
Total Devices : 1
Preferred Minor : 0
Persistence : Superblock is persistent
Version : 00.90.03
Creation Time : Thu Apr 3 08:02:22 2008
Raid Level : raid1
Array Size : 524160 (511.96 MiB 536.74 MB)
Used Dev Size : 524160 (511.96 MiB 536.74 MB)
Raid Devices : 2
Total Devices : 2
Preferred Minor : 0
Persistence : Superblock is persistent
Failed Devices : 0
Spare Devices : 1
2 8 49 - spare /dev/sdd1
# cat /proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md0 : active raid1 sdd1[2](S) sdc1[1] sdb1[0]
524160 blocks [2/2] [UU]
Nous allons créer un RAID 5 avec les trois disques /dev/sdb1 /dev/sdc1 et /dev/sdd1. Nous
présentons le détail pendant la construction et après qu'elle soit terminée. Vous remarquerez que la
place disque disponible est de 1 Go. En effet, l'un des trois disques contient les bandes de parité.
# mdadm --create --verbose /dev/md0 --level=5 --raid-devices=3 /dev/sdb1 /dev/sdc1
/dev/sdd1
mdadm: array /dev/md0 started.
Layout : left-symmetric
Layout : left-symmetric
Chunk Size : 64K
Events : 0.8
Le RAID 6 utilise deux bandes de parité. Pour cela, il lui faut au moins quatre disques et il peut
donc résister à la défaillance de deux disques. C'est l'objet de l'exemple, rien d'autre.
# mdadm --create --verbose /dev/md0 --level=6 --raid-devices=4 /dev/sdb1 /dev/sdc1
/dev/sdd1 /dev/sde1
mdadm: array /dev/md0 started.
# watch -n2 'cat /proc/mdstat'
Every 2,0s: cat /proc/mdstat Thu Apr 3 11:23:48 2008
4 8 49 - spare /dev/sdd1
# watch -n2 'cat /proc/mdstat'
Every 2,0s: cat /proc/mdstat Thu Apr 3 11:38:58 2008
Un RAID 10, c'est un RAID 0 construit à partir de deux RAID 1. Ce type de RAID autorise la
défaillance de deux disques, à condition qu'ils n'appartiennent pas au même RAID 1. Cette solution
est moins souple, à priori, que le RAID 6 où les disques défaillants peuvent être quelconques.
Créons le RAID 10 et construisons un système de fichiers ext3. Vous ne serez pas étonné de voir
que notre RAID offre un espace utile de 1Go pour un espace total de 2Go.
# mdadm --create --verbose /dev/md10 --level=10 --raid-devices=4 /dev/sdb1 /dev/sdc1
/dev/sdd1 /dev/sde1
mdadm: array /dev/md10 started.
# mkfs.ext3 /dev/md10
mke2fs 1.40.2 (12-Jul-2007)
Filesystem label=
# ls /mnt/repertoire/
lost+found
# mdadm --remove /dev/md10 /dev/sdb1
mdadm: hot removed /dev/sdb1
9) MULTIPATH
La technique du « multipath » (chemin multiple) est utile si vous disposez d'un disque ou d'une baie
de disques, connecté à plusieurs contrôleurs. Il existe alors plusieurs chemins, un par contrôleur,
pour accéder au disque. La création d'un « multipah » permet de regrouper à tous les noms
physiques existants (/dev/sdx, /dev/sdy...) un nom logique unique (/dev/mdx). Pour nommer le
disque, vous utilisez le nom logique (/dev/mdx). C'est le système qui choisit le chemin physique à
emprunter (/dev/sdx). En cas de défaillance d'un chemin, c'est un autre qui prend le relais. Le
multipath que nous traitons ici est bien le multipath logiciel intégré au noyau Linux depuis la
version 2.6.13. Pour sa mise en oeuvre réelle, il faut bien entendu disposer d'un matériel élaboré tel
qu'une baie de disque externe (« SAN, Storage Area Network »), accessible par par fibre optique via
au moins deux « switch's ». Dans notre exemple, les noms /dev/sdx que nous utilisons sont associés
à des disques SCSI différents. Son seul intérêt est d'illustrer la syntaxe et le comportement du
noyau.
Filesystem label=
OS type: Linux
...
Un, puis deux chemins ne sont plus valides. Le disque est toujours opérationnel.
# mdadm --set-faulty /dev/md0 /dev/sdc1
mdadm: set /dev/sdc1 faulty in /dev/md0
# tail /var/log/messages
Apr 3 17:41:11 ubuntu kernel: [36565.566009] ^IOperation continuing on 3 IO paths.
Apr 3 17:41:11 ubuntu kernel: [36565.570440] MULTIPATH conf printout:
Apr 3 17:41:11 ubuntu kernel: [36565.570448] --- wd:3 rd:4
Apr 3 17:41:11 ubuntu kernel: [36565.570454] disk0, o:1, dev:sde1
Apr 3 17:41:11 ubuntu kernel: [36565.570457] disk1, o:1, dev:sdd1
Apr 3 17:41:11 ubuntu kernel: [36565.570460] disk2, o:0, dev:sdc1
Apr 3 17:41:11 ubuntu kernel: [36565.570463] disk3, o:1, dev:sdb1
Apr 3 17:41:11 ubuntu kernel: [36565.581758] MULTIPATH conf printout:
Apr 3 17:41:11 ubuntu kernel: [36565.581773] --- wd:3 rd:4
Apr 3 17:41:11 ubuntu kernel: [36565.581779] disk0, o:1, dev:sde1
Apr 3 17:41:11 ubuntu kernel: [36565.581782] disk1, o:1, dev:sdd1
Apr 3 17:41:11 ubuntu kernel: [36565.581785] disk3, o:1, dev:sdb1
# tail /var/log/messages
Apr 3 17:44:17 ubuntu kernel: [36751.413857] ^IOperation continuing on 2 IO paths.
Apr 3 17:44:17 ubuntu kernel: [36751.417758] MULTIPATH conf printout:
Apr 3 17:44:17 ubuntu kernel: [36751.417766] --- wd:2 rd:4
Apr 3 17:44:17 ubuntu kernel: [36751.417771] disk0, o:1, dev:sde1
Apr 3 17:44:17 ubuntu kernel: [36751.417774] disk1, o:1, dev:sdd1
Apr 3 17:44:17 ubuntu kernel: [36751.417778] disk3, o:0, dev:sdb1
Apr 3 17:44:17 ubuntu kernel: [36751.425503] MULTIPATH conf printout:
Apr 3 17:44:17 ubuntu kernel: [36751.425514] --- wd:2 rd:4
Apr 3 17:44:17 ubuntu kernel: [36751.425520] disk0, o:1, dev:sde1
Apr 3 17:44:17 ubuntu kernel: [36751.425523] disk1, o:1, dev:sdd1
# cp /etc/passwd /mnt/repertoire/
# mkdir /mnt/repertoire/rep1
# umount /mnt/repertoire/
Le fichier /etc/mdadm/mdadm.conf est le fichier qui, par défaut, est utilisé pour décrire les RAID's
connus de Linux. Il n'est pas systématiquement utilisé pour démarrer les RAID's au moment du
boot, si les disques d'un RAID sont en « autodetect » avec un « Persistent Super Bloc ». Par contre
son usage s'avère pratique pour économiser la syntaxe de démarrage d'un RAID en mode interactif,
après qu'il ait été arrêté.
Nous renvoyons le lecteur à la commande man mdadm.conf pour connaître toutes les directives de
définition d'un RAID. C'est la clause ARRAY qui est fondamentale. Il existe un moyen simple pour
renseigner un RAID dans le fichier, c'est à dire créer la ligne ARRAY associée, c'est de le faire faire
par la commande mdadm. Il suffit de rediriger la sortie de la commande mdadm --examine –scan
à la fin du fichier mdadm.conf.
# mdadm --create --verbose /dev/md0 --level=5 --raid-devices=3 --spare-devices=1 /dev/sdb1 /
dev/sdc1 /dev/sdd1 /dev/sde1
Continue creating array? y
mdadm: array /dev/md0 started.
Layout : left-symmetric
Chunk Size : 64K
3 8 65 - spare /dev/sde1
La commande mdadm --assemble permet d'activer un RAID préalablement arrêter. Avec l'option
--scan, la commande explore le fichier pour déterminer les RAID à démarrer.
# mdadm --stop /dev/md0
# mdadm --assemble --scan
mdadm: /dev/md0 has been started with 3 drives and 1 spare.
Bonne chance
Gilles GOUBET