{{tag>tutoriel}} ====== Installer et gérer un volume RAID 1 logiciel ====== Nous prendrons **l'exemple d'un Raspberry Pi 4**. Nous créerons un RAID 1 sur deux clés USB de 256 Go. Ce didacticiel montre comment créer un volume RAID 1 logiciel (deux disques usb en miroir). Le RAID 1 synchronise l'accès aux données sur l'ensemble des supports mis en œuvre, chacun d'entre-eux étant le miroir des autres. {{ tutoriel:disque:raid:raid-01.png |}} Dans ce didacticiel, * les disques/clés USB seront notés **disques** * les grappes ("arrays") RAID seront notées **volumes RAID** Cette solution est économique avec un débit faible (le Raspberry Pi consomme peu et les clés usb seront le plus souvent en veille). **RAID** (**R**edundant **A**rray of **I**ndependent **D**isks) combine plusieurs supports (disques durs ou clés USB). Il existe différents niveaux de RAID, les plus courants sont RAID-0, RAID-1 et RAID-5. - **RAID-0** : les blocs de données sont répartis sur au moins 2 disques regroupés en un volume. Très grande **rapidité** de lecture / écriture mais **aucune redondance** : si un disque tombe en panne, les données sont perdues définitivement. - **RAID-1**: c'est le niveau de RAID utilisé dans ce tutoriel. RAID-1 copie en miroir les blocs de données sur les disques du volume RAID. Si un disque tombe en panne, il peut être remplacé sans aucune perte de données. - **RAID-5** : les blocs de données sont répartis sur au moins 3 disques. Il n'y a perte de données que si plusieurs disques sont en panne. ===== Pré-requis ===== * un **PC** ou un **Raspberry Pi** avec ses accessoires (alimentation, boîtier,carte µSD) et son OS installé et configuré. Nous prendrons l'exemple d'un **Raspberry Pi 4** * des **disques** ou des **clés USB** de même taille et si possible du même modèle. Nous prendrons l'exemple de deux clés USB de 256 G à mettre en RAID 1. ===== Première étape ===== - **Mettez à jour** le système :pi@framboise4:~ $ sudo apt update pi@framboise4:~ $ sudo apt upgrade - **Installez** le paquet **[[apt>mdadm]]** ou dans un terminal :pi@framboise4:~ $ sudo apt install mdadm ===== Autres étapes ===== ==== Configuration des lecteurs ==== - Faites le point des **montages** :pi@framboise4:~ $ lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT mmcblk0 179:0 0 59,6G 0 disk ├─mmcblk0p1 179:1 0 256M 0 part /boot └─mmcblk0p2 179:2 0 59,4G 0 part / - **Branchez vos disques (ou clés) USB** - **Repérez-les** :pi@framboise4:~ $ lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 1 232,9G 0 disk └─sda1 8:1 1 232,9G 0 part /media/pi/81FC-2755 sdb 8:16 1 233,3G 0 disk └─sdb1 8:17 1 233,3G 0 part /media/pi/5CE2-DE99 mmcblk0 179:0 0 59,6G 0 disk ├─mmcblk0p1 179:1 0 256M 0 part /boot └─mmcblk0p2 179:2 0 59,4G 0 part / -> Ici, les clés USB sont **/dev/sda** et **/dev/sdb** et sont partitionnées - **Démontez les éventuelles partitions** :pi@framboise4:~ $ sudo umount /dev/sd[a-b]1 pi@framboise4:~ $ lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 1 232,9G 0 disk └─sda1 8:1 1 232,9G 0 part sdb 8:16 1 233,3G 0 disk └─sdb1 8:17 1 233,3G 0 part <...> - **Formatez le premier disque** :pi@framboise4:~ $ sudo fdisk /dev/sda ... Command (m for help): o Created a new DOS disklabel with disk identifier 0x837c1279. Command (m for help): n Partition type ... Select (default p): ... Partition number (1-4, default 1): First sector (2048-488374271, default 2048): Last sector, +/-sectors or +/-size{K,M,G,T,P} (2048-488374271, default 488374271): Created a new partition 1 of type 'Linux' and of size 232,9 GiB. Command (m for help): t Selected partition 1 Hex code (type L to list all codes): fd Changed type of partition 'Linux' to 'Linux raid autodetect'. Command (m for help): w The partition table has been altered. Calling ioctl() to re-read partition table. Syncing disks. * **o** pour créer une table de partition DOS vide. * **n** pour créer une nouvelle partition ; Pour chaque option, appuyez sur Entrée pour utiliser la valeur par défaut jusqu'à retrouver l'invite **Commande (m pour l'aide) :** * **t** pour définir le type de partition **fd** * **w** pour écrire les modifications et quitter - **Clonez la table de partitions** du premier disque **/dev/sda** sur le second **/dev/sdb** :pi@framboise4:~ $ sudo sfdisk -d /dev/sda | sudo sfdisk /dev/sdb ... New situation: Disklabel type: dos Disk identifier: 0x54ed3050 Device Boot Start End Sectors Size Id Type /dev/sdb1 2048 488374271 488372224 232,9G fd Linux raid autodetect The partition table has been altered. Calling ioctl() to re-read partition table. Syncing disks. ==== Création du volume RAID ==== - Situation :pi@framboise4:~ $ lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 1 232,9G 0 disk └─sda1 8:1 1 232,9G 0 part sdb 8:16 1 233,3G 0 disk └─sdb1 8:17 1 232,9G 0 part mmcblk0 179:0 0 59,6G 0 disk ├─mmcblk0p1 179:1 0 256M 0 part /boot └─mmcblk0p2 179:2 0 59,4G 0 part / - Lancez la **création du volume RAID-1** (/dev/md0) et attendez la fin :pi@framboise4:~ $ sudo mdadm --create /dev/md0 --level=mirror --raid-devices=2 /dev/sd[a-b]1 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 mdadm: Defaulting to version 1.2 metadata mdadm: array /dev/md0 started. * tapez **y** pour continuer à créer le volume * remplacez **/dev/sd[a-b]1** selon votre configuration - Surveillez l'avancement :pi@framboise4:~ $ watch cat /proc/mdstat Every 2,0s: cat /proc/mdstat framboise4: Wed Dec 9 14:47:57 2020 Personalities : [raid1] md0 : active raid1 sdb1[1] sda1[0] 244054016 blocks super 1.2 [2/2] [UU] [===>.................] resync = 19.7% (48275840/244054016) finish=234.7min speed=13896K/sec bitmap: 2/2 pages [8KB], 65536KB chunk unused devices: Soyez patient : cela peut prendre une heure. Quand tout s'est bien passé : Every 2,0s: cat /proc/mdstat framboise4: Wed Dec 9 19:40:13 2020 Personalities : [raid1] md0 : active raid1 sdb1[1] sda1[0] 244054016 blocks super 1.2 [2/2] [UU] bitmap: 0/2 pages [0KB], 65536KB chunk unused devices: Arrêtez la surveillance en tapant C-c. - Pour voir le détail du résultat :pi@framboise4:~ $ sudo mdadm --detail /dev/md0 /dev/md0: Version : 1.2 Creation Time : Wed Dec 9 13:49:55 2020 Raid Level : raid1 Array Size : 244054016 (232.75 GiB 249.91 GB) Used Dev Size : 244054016 (232.75 GiB 249.91 GB) Raid Devices : 2 Total Devices : 2 Persistence : Superblock is persistent Intent Bitmap : Internal Update Time : Wed Dec 9 18:53:14 2020 State : clean Active Devices : 2 Working Devices : 2 Failed Devices : 0 Spare Devices : 0 Consistency Policy : bitmap Name : framboise4:0 (local to host framboise4) UUID : 999fcdb6:f37b29d7:224d2564:f5269ca5 Events : 3547 Number Major Minor RaidDevice State 0 8 1 0 active sync /dev/sda1 1 8 17 1 active sync /dev/sdb1 ==== Partitionnement du volume RAID ==== - Partitionnez le volume RAID :pi@framboise4:~ $ sudo fdisk /dev/md0 ... Command (m for help): n Partition type ... Select (default p): ... Partition number (1-4, default 1): First sector (2048-488108031, default 2048): Last sector, +/-sectors or +/-size{K,M,G,T,P} (2048-488108031, default 488108031): +99G Created a new partition 1 of type 'Linux' and of size 99 GiB. Command (m for help): n Partition type ... Select (default p): ... Partition number (2-4, default 2): First sector (207620096-488108031, default 207620096): Last sector, +/-sectors or +/-size{K,M,G,T,P} (207620096-488108031, default 488108031): Created a new partition 2 of type 'Linux' and of size 133,8 GiB. Command (m for help): t Partition number (1,2, default 2): Hex code (type L to list all codes): fd Changed type of partition 'Linux' to 'Linux raid autodetect'. Command (m for help): t Partition number (1,2, default 2): 1 Hex code (type L to list all codes): fd Changed type of partition 'Linux' to 'Linux raid autodetect'. Command (m for help): w The partition table has been altered. Calling ioctl() to re-read partition table. Syncing disks.Dans cet exemple, nous avons créé une partition de 99 GiB pour /home et le reste pour /media/data - Résultat :pi@framboise4:~ $ lsblk /dev/md0 NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT md0 9:0 0 232,8G 0 raid1 ├─md0p1 259:2 0 99G 0 part └─md0p2 259:3 0 133,8G 0 part ==== Montage et formatage des partitions ==== - Formatez les partitions :pi@framboise4:~ $ sudo mkfs.ext4 /dev/md0p1 ... Filesystem UUID: aeb60630-ea0d-4ab4-9c3e-39f61befd172 ... pi@framboise4:~ $ sudo mkfs.ext4 /dev/md0p2 ... Filesystem UUID: 2b4fc944-e7d7-4b48-81c8-48113e2905ce ... - Donnez-leur un label :pi@framboise4:~ $ sudo e2label /dev/md0p1 home pi@framboise4:~ $ sudo e2label /dev/md0p2 data - Créez les répertoires de montage :pi@framboise4:~ $ sudo mkdir -p /media/{home,data} - Montez-les :pi@framboise4:~ $ sudo mount /dev/md0p1 /media/home/ pi@framboise4:~ $ sudo mount /dev/md0p2 /media/data/ - Repérez leurs UUID :pi@framboise4:~ $ sudo blkid /dev/md0p[1-2] /dev/md0p1: LABEL="home" UUID="aeb60630-ea0d-4ab4-9c3e-39f61befd172" TYPE="ext4" PARTUUID="535856bf-01" /dev/md0p2: LABEL="data" UUID="2b4fc944-e7d7-4b48-81c8-48113e2905ce" TYPE="ext4" PARTUUID="535856bf-02" - Éditez avec les droits d'administration le fichier **/etc/fstab** pour ajouter une ou des lignes : * avec les UUID : ... UUID=aeb60630-ea0d-4ab4-9c3e-39f61befd172 /media/home ext4 defaults,noatime,nofail 0 0 UUID=2b4fc944-e7d7-4b48-81c8-48113e2905ce /media/data ext4 defaults,noatime,nofail 0 0 * avec les labels des partitions : ... LABEL=home /media/home ext4 defaults,noatime,nofail 0 0 LABEL=data /media/data ext4 defaults,noatime,nofail 0 0 ==== Montage du RAID au démarrage ==== * Mettez à jour mdadm pour pouvoir monter au démarrage :pi@framboise4:~ $ sudo mdadm --detail --scan | sudo tee -a /etc/mdadm/mdadm.conf ARRAY /dev/md0 metadata=1.2 name=framboise4:0 UUID=999fcdb6:f37b29d7:224d2564:f5269ca5Le retour affiche la ligne ajoutée au fichier /etc/mdadm/mdadm.conf Cette commande est **à renouveler après toute modification** sur le volume (ajout de disque, remplacement de disque HS, etc…) ==== Vérification ==== Jetez un œil à vos partitions RAID :pi@framboise4:~ $ lsblk /dev/md0 NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT md0 9:0 0 232,8G 0 raid1 ├─md0p1 259:2 0 99G 0 part /media/home └─md0p2 259:3 0 133,8G 0 part /media/data pi@framboise4:~ $ ls /media/data/ lost+found pi@framboise4:~ $ ls /media/home/ lost+found Elles doivent être vides (sauf lost+found) ==== Utilisateurs autorisés ==== - Créez le groupe **raid** dont les utilisateurs seront les seuls à avoir accès au volume RAID :pi@framboise4:~ $ sudo addgroup raid Ajout du groupe « raid » (GID 1001)... Fait. - Ajoutez au groupe raid chaque utilisateur qui aura le droit d'accès au raid :pi@framboise4:~ $ sudo adduser $USER raid Ajout de l'utilisateur « pi » au groupe « raid »... Adding user pi to group raid Fait. Vous pouvez ajouter d'autres utilisateurs :pi@framboise4:~ $ sudo adduser www-data raid Ajout de l'utilisateur « www-data » au groupe « raid »... Adding user www-data to group raid Fait. pi@framboise4:~ $ sudo adduser autre_utilisateur raid - Appliquez les droits aux points de montage :pi@framboise4:~ $ sudo chown -R pi:raid /media/{home,data} pi@framboise4:~ $ sudo chmod -R 2775 /media/{home,data} - Redémarrez le Raspberry Pi pour vérifier que tout se met bien en place au démarrage :pi@framboise4:~ $ sudo shutdown -r now ==== Mise en place de la surveillance d’un disque ==== - **Installez [[logiciel:systeme:msmtp:start]]**. - Éditez avec les droits d'administration le fichier **/etc/default/mdadm** pour vérifier que ces lignes sont bien présentes : ... AUTOCHECK=true ... START_DAEMON=true - Éditez avec les droits d'administration le fichier **/etc/mdadm/mdadm.conf** pour renseigner votre email : ... MAILADDR votre_adresse@email.fr - Testez l'envoi d'une notification :pi@framboise4:~ $ sudo mdadm --monitor --scan --test --oneshotVous devez recevoir un mail sur votre messagerie du style :Sujet : TestMessage event on /dev/md/0:framboise4 De : mdadm monitoring Date : 17/10/2020 à 08:24 Pour : votre_adresse@email.fr This is an automatically generated mail message from mdadm running on framboise4 A TestMessage event had been detected on md device /dev/md/0. Faithfully yours, etc. P.S. The /proc/mdstat file currently contains the following: Personalities : [raid1] md0 : active raid1 sda1[0] sdb1[1] 117153216 blocks super 1.2 [2/2] [UU] bitmap: 0/1 pages [0KB], 65536KB chunk unused devices: **Méthode avec une ligne dans crontab** : Ajoutez dans la crontab un job qui envoie un mail d’alerte :...@...:~$ crontab -e ... # Vérifier l'état du raid toutes les heures 0 * * * * /bin/grep 'UU' /proc/mdstat || /usr/bin/mail -s "[ALERTE] Raid en erreur sur $(hostname)" nicolas@frapp.fr < /proc/mdstat Pensez à tester l'envoi d'une notification :...@...:~$ sudo mdadm --monitor --scan --test --oneshotVous devez recevoir un mail sur votre messagerie. ==== Simuler une panne de disque ==== * [[tutoriel:disque:raid:simupanne:start]] ==== Remplacer un disque défectueux ==== * [[tutoriel:disque:raid:panne:start]] ==== Supprimer un RAID ==== * [[tutoriel:disque:raid:del:start]] ==== Panne logicielle ==== Le système est tombé mais les disques sont probablement intacts. Le système de sauvegarde est donc mort et il faut remonter un système pour remettre en place notre NAS. Mais dans l’attente, vous voulez récupérer vos données. === Récupérer les données à l’aide d’un autre système et d’un seul des disques === Sur un autre PC sous Linux, branchez un des disques de notre ex RAID. Repérez la partition en question avec un fdisk. En fait, cette étape est superflue dans mon cas car lors de l’installation de mdadm, celui-ci détecte le volume existant et le remonte. ...@...:~$ sudo fdisk -l Disk /dev/sda: 8388 MB, 8388108288 bytes 255 heads, 63 sectors/track, 1019 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x000ed18d Device Boot Start End Blocks Id System /dev/sda1 * 1 972 7804928 83 Linux Partition 1 does not end on cylinder boundary. /dev/sda2 972 1020 384001 5 Extended Partition 2 does not end on cylinder boundary. /dev/sda5 972 1020 384000 82 Linux swap / Solaris Disk /dev/sdb: 12.6 GB, 12582420480 bytes 255 heads, 63 sectors/track, 1529 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x3961ebcf Device Boot Start End Blocks Id System /dev/sdb1 1 1529 12281661 fd Linux raid autodetect ...@...:~$ sudo cat /proc/mdstat Personalities : [raid1] md0 : active raid1 sdb1[3] 12280637 blocks super 1.2 [2/1] [U_] unused devices: ...@...:~$ sudo mount /dev/md0 /mnt/ ...@...:~$ ssudo cd /mnt/ ...@...:~$ ssudo ls lost+found toto.txt Et hop, mdadm a tout remonté lui même. Pour tester le cas où tout ne se serait pas si bien passé, cassez le volume existant, vérifiez qu’il n’existe plus et tentez de le remonter. ...@...:~$ sudo mdadm -S /dev/md0 mdadm: stopped /dev/md0 ...@...:~$ sudo cat /proc/mdstat Personalities : [raid1] unused devices: ...@...:~$ sudo mdadm -A /dev/md0 /dev/sdb1 mdadm: /dev/md0 has been started with 1 drive (out of 2). ...@...:~$ sudo cat /proc/mdstat Personalities : [raid1] md0 : active raid1 sdb1[3] 12280637 blocks super 1.2 [2/1] [U_] unused devices: === Remonter un système pour remettre en place le raid === Deux solutions, on effectue l’étape précédente et l’on réintègre un second disque dans le volume (tout comme lorsque l’on remplace un disque défectueux). Ou, pour éviter de toute reconstruire, on repart sur un système tout propre et on installe mdadm qui va sûrement tout détecter. Si ce n’est pas le cas, utilisez le /etc/mdadm/mdadm.conf que nous avons pensé à sauvegarder, et lancez la commande : ...@...:~$ sudo mdadm --assemble --scan Sinon, on peut retrouver les disques concernés à coup de fdisk et recréer le volume : ...@...:~$ sudo mdadm --assemble /dev/md0 /dev/sdb1 /dev/sdc1 Enfin, n’oubliez pas de sauvegarder la conf pour le prochain reboot : ...@...:~$ sudo mdadm --detail --scan --verbose > /etc/mdadm/mdadm.conf ===== Conclusion ===== Nous avons créé un volume RAID qui met en miroir les deux disques. Nous pouvons maintenant utiliser le volume RAID comme stockage ou pour faire un NAS ou un serveur owncloud par exemple. ===== Problèmes connus ===== ===== Voir aussi ===== * **(fr)** [[https://www.linuxtricks.fr/wiki/mdadm-raid-logiciel-sous-linux]] * **(fr)** [[https://www.cypouz.com/article/140110/configurer-un-raid1-logiciel-sur-un-systeme-debian-existant]] * **(fr)** [[http://denisrosenkranz.com/tuto-mdadm-superviser-un-raid-logiciel/]] * **(en)** [[https://www.ricmedia.com/build-raspberry-pi3-raid-nas-server/]] * **(fr)** [[http://xaviermichel.github.io/tutoriel/2013/06/17/mise-en-place-d%27un-NAS-avec-raid-sur-mon-raspberry-pi]] * **(fr)** [[https://wiki.debian-fr.xyz/Raid_logiciel_(mdadm)]] * **(fr)** [[https://superuser.com/questions/799233/why-i-cannot-format-a-microsd-to-ext4]] * **(fr)** [[https://debian-facile.org/doc:install:supprimer-un-raid-logiciel]] ---- //Basé sur << [[https://www.ricmedia.com/build-raspberry-pi3-raid-nas-server/|Build a Raspberry Pi RAID NAS Server – [UPDATED 2020]]] >> par Richie.//