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,
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 (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.
pi@framboise4:~ $ sudo apt update pi@framboise4:~ $ sudo apt upgrade
pi@framboise4:~ $ sudo apt install mdadm
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 /
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
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 <...>
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): wThe partition table has been altered. Calling ioctl() to re-read partition table. Syncing disks.
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.
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 /
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.90Continue creating array? ymdadm: Defaulting to version 1.2 metadata mdadm: array /dev/md0 started.
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.
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
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): wThe 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
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
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 ...
pi@framboise4:~ $ sudo e2label /dev/md0p1 home pi@framboise4:~ $ sudo e2label /dev/md0p2 data
pi@framboise4:~ $ sudo mkdir -p /media/{home,data}
pi@framboise4:~ $ sudo mount /dev/md0p1 /media/home/ pi@framboise4:~ $ sudo mount /dev/md0p2 /media/data/
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"
... 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
... LABEL=home /media/home ext4 defaults,noatime,nofail 0 0 LABEL=data /media/data ext4 defaults,noatime,nofail 0 0
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…)
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)
pi@framboise4:~ $ sudo addgroup raid Ajout du groupe « raid » (GID 1001)... Fait.
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
pi@framboise4:~ $ sudo chown -R pi:raid /media/{home,data} pi@framboise4:~ $ sudo chmod -R 2775 /media/{home,data}
pi@framboise4:~ $ sudo shutdown -r now
... AUTOCHECK=true ... START_DAEMON=true
... MAILADDR votre_adresse@email.fr
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.
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.
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>
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
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.