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.

Dans ce didacticiel, les disques/clés USB seront notés disquesles grappes (“arrays”) RAID seront notées volumes RAIDCette 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 (Redundant Array of Independent Disks) 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 4des 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 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) USBRepé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éesDé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 fdw pour écrire les modifications et quitterClonez 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 volumeremplacez /dev/sd[a-b]1 selon votre configurationSurveillez 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: <none>

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: <none>

Arrêtez la surveillance en tapant Ctrl+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/dataRé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:f5269ca5

Le 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 Msmtp : envoyer un courriel par smtp en ligne de commande.É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 --oneshot

Vous devez recevoir un mail sur votre messagerie du style :

Sujet : TestMessage event on /dev/md/0:framboise4
De : mdadm monitoring <root>
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: <none>

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 --oneshot Vous devez recevoir un mail sur votre messagerie.

Simuler une panne de disque

Remplacer un disque défectueux

Supprimer un RAID

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: <none>

...@...:~$ 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: <none>
...@...:~$ 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: <none>

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 << Build a Raspberry Pi RAID NAS Server – [UPDATED 2020] >> par Richie.