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