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
Cette page a été vue 5400 fois