LINUX SOFT RAID

Détails

On veut configurer 2 disques en mirroring sous Linux pour y mettre notre système. Certaines distributions sont tout à fait capable de s'installer sur un RAID 1 (ou autre type de RAID) mais dans notre cas, on veut passer en RAID 1 après que le système soit installé et fonctionne.

Versions :

- mdadm 1.9.0-4 / Debian package mdadm

Les deux disques seront pour l'exemple /dev/sda et /dev/sdb, le système boot actuellement sur /dev/sda avec grub.

Vérifiez tout d'abord que votre noyau supporte le RAID. Si le module necessaire (md) est intégré à votre noyau, vous devriez voir dans vos logs de kernel des lignes du type :

Jun 13 14:41:02 server kernel: md: raid1 personality registered for level 1
Jun 13 14:41:02 server kernel: md: md driver 0.90.3 MAX_MD_DEVS=256, MD_SB_DISKS=27
Jun 13 14:41:02 server kernel: md: bitmap version 4.39

Sinon vérifier qu'il est disponible en tant que module avec par exemple la commande :

server:/usr/src/linux# modprobe -l | grep md

S'il est présent vous pouvez donc le charger et vérifier qu'il fonctionne bien :

server:/usr/src/linux# modprobe md
server:/usr/src/linux# lsmod | grep md

Le problème d'avoir md en module, c'est qu'il va vous falloir créer un initrd pour pouvoir charger le module au démarrage et avoir accés à votre périphérique RAID pour booter dessus. Ceci est hors sujet mais vous pouvez chercher du côté de mkinitrd.
Sinon recompilez vous un noyau en intégrant le support multi-device, les options concernées sont les suivantes :

#
# Multi-device support (RAID and LVM)
#
CONFIG_MD=y
CONFIG_BLK_DEV_MD=y
CONFIG_MD_RAID1=y

Ensuite, récupérez l'utilitaire de gestion du RAID :

server:/usr/src/linux# apt-get install mdadm

Maintenant que nous avons tout ce qu'il nous faut, nous allons partitionner notre nouveau disque dur . Vous pouvez faire du soft raid sur tout le disque ou bien par partition. Il vaut mieux le faire par partition et réserver un peu d'espace sur chaque disque hors RAID pour le swap. Le RAID soft utilise de la mémoire, donc si on venait à nécessiter le swap disque et que ce swap est en RAID soft, il nous faudrait encore plus de mémoire et ainsi de suite, je n'ai pas testé le résultat mais à vous de voir...

server:/usr/src/linux# cfdisk /dev/sdb

       Name                    Flags                 Part Type            FS Type                 Size (MB)
 -------------------------------------------------------------------------------------------------------------
       sdb1                                           Primary             Linux swap / Solaris    296.12
       sdb2                                           Primary             Linux raid autodetect   32.91
       sdb5                                           Logical             Linux raid autodetect   12000.69
       sdb6                                           Logical             Linux raid autodetect   70013.59

Créez les partitions que vous désirez et attribuez leur le type FD (Linux raid autodetect). C'est ce qui va permettre au support multi-device de reconnaitre les disques dur qui vont faire parti d'une grappe RAID au démarrage.Ici /dev/sdb1 sera la partition de swap,/dev/sdb2 la partition de boot, /dev/sdb5 la racine et /dev/sdb6 le /home. Cela nous fera donc 3 disques virtuels RAID 1 au final. On crée notre swap :

server:/usr/src/linux# mkswap /dev/sdb1

Ensuite, nous allons créer chaque disque RAID avec le disque /dev/sdb en précisant dans la commande que le second disque n'est pas disponible ou faulty. Nous aurons donc pour le moment des disques virtuels en RAID 1 dégradé. Cela donne avec mdadm :

server:/usr/src/linux# mdadm -C /dev/md0 -n 2 -l 1 /dev/sdb2 missing
server:/usr/src/linux# mdadm -C /dev/md1 -n 2 -l 1 /dev/sdb5 missing
server:/usr/src/linux# mdadm -C /dev/md2 -n 2 -l 1 /dev/sdb6 missing

Nous avons maintenant nos périphériques RAID à disposition, pour voir leur états, un petit tour du coté de /proc, le résultat de la commande ne sera pas le même pour vous car je présente ici des périphériques RAID non dégradé... :

server:/usr/src/linux# cat /prod/mdstat
Personalities : [raid1] [multipath]
md1 : active raid1 sdb5[1] sda5[0]
      11719296 blocks [2/2] [UU]

md2 : active raid1 sdb6[1] sda6[0]
      68372544 blocks [2/2] [UU]

md0 : active raid1 sdb2[1] sda2[0]
      32064 blocks [2/2] [UU]

Maintenant, on peut traiter ces nouveaux périphériques comme des disques dur, on va donc créer un système de fichier ext3 sur chacun d'eux avec la command mkfs.ext3 par exemple. Ensuite il faut recopier le système dessus, monter les sur un point de votre arborescence et recopier les données d'un disque à l'autre en conservant les droits :

server:/usr/src/linux# mount /dev/sdb6 /mnt
server:/usr/src/linux# cp -pr /home/* /mnt
server:/usr/src/linux# umount /mnt

Rincer et répéter pour tout vos points de montage, ne recopier pas les arborescences générés par le système comme le /proc ou le /sys et créé des répertoires vides sur la racine pour vos points de montage situé sur un autre périphérique (dans notre exemple /home et /boot).
Pour que tout cela fonctionne bien au reboot, editez le fichier fstab dans /etc de votre nouveau système pour changer les périphériques utilisés :

/dev/md1        /               ext3    defaults,errors=remount-ro 0       1
/dev/md0        /boot           ext3    defaults        0       2
/dev/md2        /home           ext3    defaults        0       2

Editez ensuite toujours sur le nouveau système le fichier de conf de grub, rajouter un pavé pour booter sur votre nouveau périphérique RAID :

title           Debian GNU/Linux, kernel-2.6.16.17 RAID1 SOFT
root            (hd1,1)
kernel          /kernel-2.6.16.17 root=/dev/md1 ro
savedefault
boot

Enfin installer grub sur vos disques dur pour pouvoir démarrer sur l'un ou l'autre :

server:/usr/src/linux# grub
grub> root (hd0,1)
grub> setup (hd0)
grub> root (hd1,1)
grub> setup (hd1)

C'est maintenant que l'on se lance...
Rebooter et via le bios ou directement via le menu de grub, booter sur votre nouveau système. Si tout se passe bien vous revenez sous votre bonne vieille Debian avec en root le /dev/md1 , sinon c'est certainement que vous ne bootez pas sur le bon disque dur ou qu'il y a une erreur dans les optons de boot de grub. Vous pouvez via le menu de lancement de grub éditer les configurations à la main pour finalement démarrer comme il faut sur le disque dur en RAID.

Une fois que vous vous êtes assuré que tout fonctionne comme il faut, que les partitions ont bien été monté, etc... Il est temps d'inclure l'ancien disque dur dans le périphérique RAID. Re-partitionner le avec cfdisk et le bon type de partition puis initialiser votre partition de swap. Une fois cela fait rajouter les partitions dans votre RAID :

server:/usr/src/linux#mdadm -a /dev/md0 /dev/sdb2
server:/usr/src/linux#mdadm -a /dev/md1 /dev/sdb5
server:/usr/src/linux#mdadm -a /dev/md2 /dev/sdb6

Votre RAID va se reconstruire et vous pouvez suivre l'avancement avec un cat /proc/mdstat. Rajouter vos partitions de swap dans le fichier fstab et activer le :

/dev/sda1       none            swap    sw              0       0
/dev/sdb1       none            swap    sw              0       0
  
server:/usr/src/linux#swapon

Une fois la reconstruction fini rebooter votre machine pour vérifier que tout se passe bien et que votre RAID n'est pas dégradé (cat /proc/mdstat).
Vous voilà l'heureux propriétaire d'un système Linux tolérant au panne de disques :)
Je vous conseille quand même de faire un ou deux test de panne en eteignant votre machine et en débranchant un des deux disques, comme cela vous ne serait pas pris au dépourvu quand un "vrai" problème surviendra.