mdadm

mdadm : RAID Logiciel sous Linux

Introduction

Le RAID est un ensemble de techniques de virtualisation du stockage permettant de répartir des données sur plusieurs disques durs afin d’améliorer soit les performances, soit la sécurité ou la tolérance aux pannes de l’ensemble du ou des systèmes.

Il existe 3 principaux de RAID :

  • le RAID 0 : volume agrégé par bandes
  • le RAID 1 : disques en miroir
  • le RAID 5 : volume agrégé par bandes à parité répartie

Je vous renvoie à Wikipedia si vous voulez en savoir plus sir le RAID : https://fr.wikipedia.org/wiki/RAID_(informatique)

Prérequis MDADM

Pour manipuler le RAID avec MDADM, il faut évidemment avoir les droits root et être très prudent !

Voici mon état des lieux pour ce tuto :

Code BASH :

fdisk -l

Code TEXT :

Disque /dev/sda : 28 GiB, 30064771072 octets, 58720256 secteurs
Périphérique Amorçage   Début      Fin Secteurs Taille Id Type
/dev/sda1                 2048 41945087 41943040    20G 83 Linux
/dev/sda2             41945088 46139391  4194304     2G 83 Linux
/dev/sda3             46139392 58720255 12580864     6G 83 Linux
Disque /dev/sdb : 8 GiB, 8589934592 octets, 16777216 secteurs
Disque /dev/sdc : 8 GiB, 8589934592 octets, 16777216 secteurs
Disque /dev/sdd : 8 GiB, 8589934592 octets, 16777216 secteurs

Pour les gentooistes, voici la configuration du kernel à mettre en place :

Code TEXT :

[*] Device Drivers  --->
    <*> Multiple devices driver support (RAID and LVM)
        <*> RAID support
            [*] Autodetect RAID arrays during kernel boot
            If you want to combine multiple disks or partitions to one (bigger) device:
                <*> Linear (append) mode
            If you want to increase IO performance by striping data across multiple disks (at the expense of reliability):
                <*> RAID-0 (striping) mode
            If you want to increase reliability by mirroring data across multiple disks (at the expense of less storage capacity):
                <*> RAID-1 (mirroring) mode
            If you want to combine the previous two options (for whatever reason):
                <*> RAID-10 (mirrored striping) mode
            If you want to combine 3 or more disks for reliability and performance:
                <*> RAID-4/RAID-5/RAID-6 mode

Il faut bien sûr installer le logiciel mdadm si ce n’est pas le cas.

Ajouter et démarrer les services au démarrage.

OpenRC :
Code BASH :

rc-update add mdraid boot
rc-update add mdadm boot
/etc/init.d/mdadm start
/etc/init.d/mdraid start

Systemd :
Code BASH :

systemctl enable mdmonitor 
systemctl start mdmonitor

Utiliser le RAID

Exemple RAID1 (le plus simple)

Création d’un RAID 1 sur SDB et SDC :

Code BASH :

mdadm --create /dev/md0 --level=1 --raid-devices=2 /dev/sdb /dev/sdc

Un message peut prévenir si on compte mettre /boot sur le RAID qu’il faut utiliser –metadata=0.90. On peut valider la création avec y.

Code TEXT :

mdadm: Note: this array has metadata at the start and
    may not be suitable as a boot device.  If you plan to
    store '/boot' on this device please ensure that
    your boot-loader understands md/v1.x metadata, or use
    --metadata=0.90
Continue creating array? y

Le RAID 1 est créé :

Code TEXT :

mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md0 started.

On peut faire la même avec ces options courtes :
Code BASH :

mdadm --create /dev/md0 -l1 -n2 /dev/sdb /dev/sdc

Voici aussi un exemple avec un RAID 5 :
Code BASH :

mdadm --create /dev/md0 --level=5 --raid-devices=4 /dev/sdb /dev/sdc /dev/sdb /dev/sde

Un fichier important, c’est /proc/mdstat ! Il affche des infos sur les RAID en exécution :

Code BASH :

cat /proc/mdstat

Ici, la construction du RAID 1 :
Code TEXT :

Personalities : [raid0] [raid1] [raid10] [raid6] [raid5] [raid4] [multipath] [faulty]
md0 : active raid1 sdc[1] sdb[0]
      8380416 blocks super 1.2 [2/2] [UU]
      [===>.................]  resync = 17.8% (1495808/8380416) finish=0.6min speed=186976K/sec
unused devices: <none>

Quand c’est fini :

Code BASH :

Personalities : [raid0] [raid1] [raid10] [raid6] [raid5] [raid4] [multipath] [faulty]
md0 : active raid1 sdc[1] sdb[0]
      8380416 blocks super 1.2 [2/2] [UU]
unused devices: <none>

On peut avoir aussi des infos plus détaillées avec

Code BASH :

mdadm --detail /dev/md0

Exemple avec mon md0 :

Code TEXT :

/dev/md0:
        Version : 1.2
  Creation Time : Wed Dec 28 10:35:53 2016
     Raid Level : raid1
     Array Size : 8380416 (7.99 GiB 8.58 GB)
  Used Dev Size : 8380416 (7.99 GiB 8.58 GB)
   Raid Devices : 2
  Total Devices : 2
    Persistence : Superblock is persistent
    Update Time : Wed Dec 28 10:44:21 2016
          State : clean
 Active Devices : 2
Working Devices : 2
 Failed Devices : 0
  Spare Devices : 0
           Name : gentoo:0  (local to host gentoo)
           UUID : 865a5ba1:35b67b23:a3dd29e0:c9981bfb
         Events : 17
    Number   Major   Minor   RaidDevice State
       0       8       16        0      active sync   /dev/sdb
       1       8       32        1      active sync   /dev/sdc

On formate ensuite notre volume RAID comme une partition :

Code BASH :

mkfs.ext4 /dev/md0

Code TEXT :

mke2fs 1.43.3 (04-Sep-2016)
En train de créer un système de fichiers avec 2095104 4k blocs et 524288 i-noeuds.
UUID de système de fichiers=4d2e437d-ce7b-4f56-ac39-1e073c7c2045
Superblocs de secours stockés sur les blocs :
        32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632
Allocation des tables de groupe : complété
Écriture des tables d'i-noeuds : complété
Création du journal (16384 blocs) : complété
Écriture des superblocs et de l'information de comptabilité du système de
fichiers : complété

Et évidemment, on monte le volume RAID comme une partition :

Code BASH :

mount /dev/md0 /mnt

Code BASH :

mount
/dev/md0 on /mnt type ext4 (rw,relatime,data=ordered)

Pour garder la configuration du nom (ici md0) il est possible d’ajouter les infos du RAID dans /etc/mdadm.conf :

Code BASH :

 vi /etc/mdadm.conf

Code BASH :

ARRAY /dev/md0 UUID=032e4ab2:53ac5db8:98806abd:420716a5

Si malgré tout le md0 se nomme md127 après un redémarrage, et que le fichier mdadm.conf est bien renseigné, il est peut être nécessaire de regénérer le fichier initramfs.

Gérer le RAID

Ajouter un disque

Pour ajouter un disque :

Code BASH :

mdadm --manage /dev/md0 --add /dev/sdd

Code TEXT :

mdadm: added /dev/sdd

Si aucune option n’est spécifiée, par défaut c’est –manage :
Code BASH :

mdadm /dev/md0 --add /dev/sdd

Le nouveau disque est notté (S) :

Code BASH :

cat /proc/mdstat

Code TEXT :

Personalities : [raid0] [raid1] [raid10] [raid6] [raid5] [raid4] [multipath] [faulty]
md0 : active raid1 sdd[2](S) sdc[1] sdb[0]
      8380416 blocks super 1.2 [2/2] [UU]
unused devices: <none>

Il a été ajouté comme disque de SPARE (secours).

Le mdadm –detail nous le confirme :

Code BASH :

mdadm --detail /dev/md0

Code TEXT :

/dev/md0:
        Version : 1.2
  Creation Time : Wed Dec 28 10:35:53 2016
     Raid Level : raid1
     Array Size : 8380416 (7.99 GiB 8.58 GB)
  Used Dev Size : 8380416 (7.99 GiB 8.58 GB)
   Raid Devices : 2
  Total Devices : 3
    Persistence : Superblock is persistent
    Update Time : Wed Dec 28 10:57:47 2016
          State : clean
 Active Devices : 2
Working Devices : 3
 Failed Devices : 0
  Spare Devices : 1
           Name : gentoo:0  (local to host gentoo)
           UUID : 865a5ba1:35b67b23:a3dd29e0:c9981bfb
         Events : 18
    Number   Major   Minor   RaidDevice State
       0       8       16        0      active sync   /dev/sdb
       1       8       32        1      active sync   /dev/sdc
       2       8       48        -      spare   /dev/sdd

Supprimer des disques

prenons un exemple, le disque sdc a des défauts (SMART incorrect, signe de panne, …) , on le retire du RAID :

Code BASH :

mdadm --manage /dev/md0 --fail /dev/sdc --remove /dev/sdc

Ou la commande en deux temps :

Code BASH :

mdadm --manage /dev/md0 --fail /dev/sdc 
mdadm --manage /dev/md0 --remove /dev/sdc

Dans le cas du RAID 5, si un disque n’est plus présent, le disque de SPARE prend le relais.
Mais s’il n’y a plus de disque de SPARE, on peut avoir 1 disque en faute. Pour le retirer, on est obligé d’arrêter le RAID et de le réassembler.

Exemple : RAID 5 avec 5 disques, disque SDC n’est plus présent, mais que, SDB SDD SDE sont OK :

Code BASH :

umount /dev/md0
mdadm --stop /dev/md0
mdadm --assemble /dev/md0 /dev/sdb /dev/sdd /dev/sde

Code TEXT :

mdadm /dev/md0 has been with 4 (out of 5).

puis on rajoute un disque (le manquant) et éventuellement plus qui seront ajoutés en SPARE :

Code BASH :

mdadm /dev/md0 --add /dev/sdf

Créer un raid sans avoir tous les disques

Voici un exemple de création de RAID 1 avec qu’un seul disque :

Code BASH :

mdadm --create /dev/md0 --level=1 --raid-devices=2 /dev/sdb missing

On ajoute par la suite le disque. Il faudra l’ajouter dans le RAID :

Code BASH :

mdadm --manage /dev/md0 --add /dev/sdc

Stopper un RAID

Pour “stopper” un RAID, il faut le démonter :

Code BASH :

umount /dev/md0

Puis on le “stoppe” :

Code BASH :

 mdadm --stop /dev/md0

Agrandir un RAID

Cas RAID5 où on a 3 disques :

Code BASH :

mdadm --detail /dev/md0

Code TEXT :

/dev/md0:
        Version : 1.2
  Creation Time : Wed Dec 28 16:10:21 2016
     Raid Level : raid5
     Array Size : 16760832 (15.98 GiB 17.16 GB)
  Used Dev Size : 8380416 (7.99 GiB 8.58 GB)
   Raid Devices : 3
  Total Devices : 3
    Persistence : Superblock is persistent
    Update Time : Wed Dec 28 16:12:37 2016
          State : clean
 Active Devices : 3
Working Devices : 3
 Failed Devices : 0
  Spare Devices : 0
         Layout : left-symmetric
     Chunk Size : 512K
           Name : gentoo:0  (local to host gentoo)
           UUID : 84ed4603:efb73350:ce82659b:c9bdd7f4
         Events : 18
    Number   Major   Minor   RaidDevice State
       0       8       16        0      active sync   /dev/sdb
       1       8       32        1      active sync   /dev/sdc
       3       8       48        2      active sync   /dev/sdd

Voyez la taille prise par ce RAID 5 (16Go) :

Code BASH :

df -h /dev/md0
Sys. de fichiers Taille Utilisé Dispo Uti% Monté sur
/dev/md0            16G     45M   15G   1% /mnt

On ajoute le disque :

Code BASH :

mdadm --manage /dev/md0 --add /dev/sde

Code TEXT :

mdadm: added /dev/sde

Il est noté en SPARE (car la config du RAID a 3 actifs) :

Code BASH :

mdadm --detail /dev/md0

Code TEXT :

/dev/md0:
        Version : 1.2
  Creation Time : Wed Dec 28 16:10:21 2016
     Raid Level : raid5
     Array Size : 16760832 (15.98 GiB 17.16 GB)
  Used Dev Size : 8380416 (7.99 GiB 8.58 GB)
   Raid Devices : 3
  Total Devices : 4
    Persistence : Superblock is persistent
    Update Time : Wed Dec 28 16:14:05 2016
          State : clean
 Active Devices : 3
Working Devices : 4
 Failed Devices : 0
  Spare Devices : 1
         Layout : left-symmetric
     Chunk Size : 512K
           Name : gentoo:0  (local to host gentoo)
           UUID : 84ed4603:efb73350:ce82659b:c9bdd7f4
         Events : 19
    Number   Major   Minor   RaidDevice State
       0       8       16        0      active sync   /dev/sdb
       1       8       32        1      active sync   /dev/sdc
       3       8       48        2      active sync   /dev/sdd
       4       8       64        -      spare   /dev/sde

On étend le RAID au 4ème disque :

Code BASH :

mdadm --grow /dev/md0 --raid-devices=4

Le SPARE n’est plus et le RAID se reconstruit :

Code BASH :

mdadm --detail /dev/md0

Code TEXT :

/dev/md0:
        Version : 1.2
  Creation Time : Wed Dec 28 16:10:21 2016
     Raid Level : raid5
     Array Size : 16760832 (15.98 GiB 17.16 GB)
  Used Dev Size : 8380416 (7.99 GiB 8.58 GB)
   Raid Devices : 4
  Total Devices : 4
    Persistence : Superblock is persistent
    Update Time : Wed Dec 28 16:14:21 2016
          State : clean, reshaping
 Active Devices : 4
Working Devices : 4
 Failed Devices : 0
  Spare Devices : 0
         Layout : left-symmetric
     Chunk Size : 512K
 Reshape Status : 0% complete
  Delta Devices : 1, (3->4)
           Name : gentoo:0  (local to host gentoo)
           UUID : 84ed4603:efb73350:ce82659b:c9bdd7f4
         Events : 30
    Number   Major   Minor   RaidDevice State
       0       8       16        0      active sync   /dev/sdb
       1       8       32        1      active sync   /dev/sdc
       3       8       48        2      active sync   /dev/sdd
       4       8       64        3      active sync   /dev/sde

On attend que tout soit reconstruise :

Code BASH :

watch cat /proc/mdstat

Code TEXT :

Personalities : [raid0] [raid1] [raid10] [raid6] [raid5] [raid4] [multipath] [faulty]
md0 : active raid5 sde[4] sdd[3] sdc[1] sdb[0]
      16760832 blocks super 1.2 level 5, 512k chunk, algorithm 2 [4/4] [UUUU]
      [==>..................]  reshape = 10.5% (887808/8380416) finish=6.1min speed=20211K/sec
unused devices: <none>

Code TEXT :

Personalities : [raid0] [raid1] [raid10] [raid6] [raid5] [raid4] [multipath] [faulty]
md0 : active raid5 sde[4] sdd[3] sdc[1] sdb[0]
      25141248 blocks super 1.2 level 5, 512k chunk, algorithm 2 [4/4] [UUUU]
unused devices: <none>

On agrandit ensuite le FS (ici ext4, donc ça se fait à chaud) :

Code BASH :

resize2fs /dev/md0

On contrôle que la taille a augmenté :

Code BASH :

df -h /dev/md0
Sys. de fichiers Taille Utilisé Dispo Uti% Monté sur
/dev/md0            24G     44M   23G   1% /mnt

Au final les infos :

Code BASH :

mdadm --detail /dev/md0

Code TEXT :

/dev/md0:
        Version : 1.2
  Creation Time : Wed Dec 28 16:10:21 2016
     Raid Level : raid5
     Array Size : 25141248 (23.98 GiB 25.74 GB)
  Used Dev Size : 8380416 (7.99 GiB 8.58 GB)
   Raid Devices : 4
  Total Devices : 4
    Persistence : Superblock is persistent
    Update Time : Wed Dec 28 16:20:20 2016
          State : clean
 Active Devices : 4
Working Devices : 4
 Failed Devices : 0
  Spare Devices : 0
         Layout : left-symmetric
     Chunk Size : 512K
           Name : gentoo:0  (local to host gentoo)
           UUID : 84ed4603:efb73350:ce82659b:c9bdd7f4
         Events : 80
    Number   Major   Minor   RaidDevice State
       0       8       16        0      active sync   /dev/sdb
       1       8       32        1      active sync   /dev/sdc
       3       8       48        2      active sync   /dev/sdd
       4       8       64        3      active sync   /dev/sde

Astuces MDADM

Accélérer la synchronisation des volumes RAID

Par défaut, la vitesse est faible pour synchroniser les volumes entre eux.
Il est tout à fait possible d’augmenter cette limite.

Par exemple, pour autoriser une écriture à 100MB/s sur le disque au maximum :
Code BASH :

echo 1000000 > /proc/sys/dev/raid/speed_limit_max

On peut aussi définir une valeur minimale de 10MB/s :
Code BASH :

echo 100000 > /proc/sys/dev/raid/speed_limit_min


Sources