====== Créer un RAID logiciel ====== {{ :wiki:creer-un-raid-logiciel-sous-linux-logo.jpeg?nolink&100 |}} ---- Le [[https://fr.wikipedia.org/wiki/RAID_(informatique)|Redundant Array of Independent Disks]] est une technique pour répartir les données sur plusieurs disques dans le but d'optimiser les taux de réponses et/ou d'assurer de la redondance. ===== RAID 1 ===== On part du principe que nous avons deux disques qui ont chacun une partition de taille strictement identique (sdb1 et sdd1) dont-elles seront utilisées pour le RAID de type miroir. Techniquement, les données seront réparties sur les deux partitions. Ce qui a pour effet d'améliorer le temps de lecture au détriment d'une écriture un peu plus lente que la normale. mdadm --create /dev/md0 --level=1 --raid-devices=2 /dev/sdb1 /dev/sdd1 Une fois la "nape" md0 a été créée, il reste plus qu'a la formater avec le système de fichier que l'on veut et la monter dans notre système : mkfs.ext4 /dev/md0 mount /dev/md0 /mnt Pour que ce montage soit toujours présent après un reboot : mdadm --detail --scan >> /etc/mdadm/mdadm.conf echo "/dev/md0 /mnt/ ext4 noatime,rw 0 0" >> /etc/fstab La mise en place des autres RAID (0,5,6 et 10), le procédé est pratiquement le même. ==== Cas spéciaux ==== Admettons que nous souhaitons ajouter encore 1 disque, soit un total de 3 disques dans le raid 1. On devra faire dans ce cas : mdadm /dev/md0 --add /dev/sdc1 Puis agrandir la grappe : mdadm --grow /dev/md0 --raid-devices=3 ===== RAID 5 ===== Admettons que nous ayons besoin d'une grande quantité de stockage avec la possibilités d'avoir un disque de rechange en cas de panne d'un des disques. En d'autres termes, nous avons besoin de 4 disques dont 3 qui seront en fonction et 1 en arrêt le temps qu'un des disques actifs tombe en panne. On devra donc lancer cette commande : mdadm --create /dev/md5 --level=5 --raid-devices=4 /dev/sdb1 /dev/sdc1 /dev/sdd1 /dev/sde1 --spare-devices=1 /dev/sdf1 Admettons que nous avons le disque /dev/sdb1 qui tombe en panne. On peut le changer de cette manière : mdadm --manage /dev/md5 --set-faulty /dev/sdb1 mdadm --manage /dev/md5 --remove /dev/sdb1 mdadm --manage /dev/md5 --add /dev/sdb1 ===== Changer un disque défectueux ===== Reprenons l'exemple avec le RAID 1 car j'ai eu un cas réel lorsque j'ai exécuté la commande suivante : mdadm --detail /dev/md0 On obtient ce genre de message : {{ :wiki:raid_linux_degrader.png?500 | }} On peut s'apercevoir que la partition sdd1 est hors fonctionnement vu qu'elle est en état "removed". Faire les procédures suivantes pour le remplacer par un nouveau : mdadm /dev/md0 --fail /dev/sdd1 mdadm /dev/md0 --remove /dev/sdd1 Arrêt de la machine pour changer physiquement le disque : poweroff Après le redémarrage de la machine on copie les partitions d'un disque déjà présent dans le raid : sfdisk -d /dev/sdb | sfdisk /dev/sdd On joint la nouvelle partition au raid : mdadm /dev/md0 --add /dev/sdd1 Il est possible de voir l'avancement de la synchronisation avec cette commande : watch "cat /proc/mdstat" Si rien ne se passe d'ici quelques petites minutes, c'est qu'il faut lancer manuellement la synchronisation : mdadm --action=repair /dev/md0 Ou au pire : mdadm --grow --raid-devices=2 /dev/md0 ===== Changer deux disques défectueux ===== Admettons que l'on est dans la situation d'avoir 3 disque dont un disque est valide avec un qui a lâché depuis plus d'une semaine et le dernier quelques heures avant le remplacement des disques. L'idéal, est de cloner physiquement ces disques pour réduire le taux de corruptions de données. === Reconnaitre les disques défectueux === La commande suivante va permettre de connaitre : * l'"Array UUID" qui est l'identifiant reliant le dique à la grappe raide * l'"Events" qui permet de savoir combien de retard il a par rapport aux autres * l'"Update Time" qui indique le dernier moment où le disque a été actif * l'"Layout" qui indique comment sont positionné les bits de parités * l'"Raid Devices" qui correspond à sa position dans la grappe * l'"Raid Level" qui info le type de RAID * l'"Array State" qui permet de connaitre la position du disque avant l'incident mdadm --eamine /dev/sd*1 On peut ainsi voir quel est le disque qui s'est arrêté en premier et ainsi dessuite. Grâce au positionnement des disques au boot (sda, sdb, sdc), la commande suivante permet de connaitre les disques défaillants : hdparm -I /dev/sd*1 Ces infos sont importantes : * Serial Number pour le numéro de série qui doit etre affiché physiquement sur le disque * Model Number qui permet de commander un disque aux caractéristiques similères sur les internets === Rassembler la grappe === Executer cette commande suite au remplacement des disques : mdadm --assemble --force --freeze-reshape --verbose /dev/md5 /dev/sdb1 /dev/sdc1 /dev/sdd1 Il se peut que mdadm expulse le disque marqué comme défaillant et théoriquement, la grappe est accéssible via un point de montage pour récupérer les données. L'option `--freeze-reshape` permet d'indiquer que l'on veut seulement rassembler les block sans reconstruire ce qui manque. On pourra ensuite rajouter le disque défaillant ainsi : mdadm /dev/md5 --add /dev/sdd1 La reconstruction devrait être reprise imédiatement et durer plusieurs heures. ===== D'autres commandes ===== * Supprimer un disque physiquement absent mdadm /dev/md0 -r detached * Éradiquer un raid D'abord nous le démontons : umount /raid1 Puis nous l'arrêtons : mdadm --stop /dev/md0 Pour au final supprimer les métas-données présent sur les disques qui été rattacher au raid : mdadm --zero-superblock /dev/sdb mdadm --zero-superblock /dev/sdd * Scanner / réactiver le RAID mdadm --examine --scan * benchmark hdparm -tT /dev/mdX * Migrer des données d'un RAID à un autre : mdadm -A /dev/md1 --update=super-minor -m0 /dev/sdf1 /dev/sdg1 * Stopper la syncrhonisation directement dans l'environnement kernel : echo "frozen" > /sys/block/mdX/md/sync_action * Définir la vitesse de synchronisation des disques (200 000 par défaut) : echo 0 > /proc/sys/dev/raid/speed_limit_max * Détruire un raid mdadm --stop /dev/md1 mdadm --remove /dev/md1 mdadm --zero-superblock /dev/sdf1 /dev/sde1