Documentation du Dr FRAPPE

Ce wiki regroupe les résultats de mes expériences en informatique accumulés au cours de mes recherches sur le net.

Dans la mesure du possible, j'ai cité mes sources ; il en manque certainement… :-)

Ceci est une ancienne révision du document !


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 254 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 disques
  • les grappes (“arrays”) RAID seront notées volumes RAID

Cette solution est économique avec un débit faible (le RPI 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.

  1. 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.
  2. 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.
  3. 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 disques de 128 G à mettre en RAID 1.

Première étape

  1. Mettez à jour le système :

    pi@framboise4:~ $ sudo apt update
    pi@framboise4:~ $ sudo apt upgrade

  2. Installez le paquet mdadm ou dans un terminal :

    pi@framboise4:~ $ sudo apt install mdadm

Autres étapes

Configuration des lecteurs

  1. 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 /

  2. Branchez vos disques (ou clés) USB
  3. 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

  4. 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
    <...>

  5. 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
  6. 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

  1. 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 /

  2. 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
  3. 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: <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.

  4. 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

  1. 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

  2. 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

  1. 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
    ...

  2. Donnez-leur un label :

    pi@framboise4:~ $ sudo e2label /dev/md0p1 home
    pi@framboise4:~ $ sudo e2label /dev/md0p2 data

  3. Créez les répertoires de montage :

    pi@framboise4:~ $ sudo mkdir -p /media/{home,data}

  4. Montez-les :

    pi@framboise4:~ $ sudo mount /dev/md0p1 /media/home/
    pi@framboise4:~ $ sudo mount /dev/md0p2 /media/data/

  5. 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"

  6. Éditez avec les droits d'administration le fichier /etc/fstab pour ajouter une ou des lignes :
    • avec les UUID :
      /etc/fstab
      ...
      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 :
      /etc/fstab
      ...
      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 :

    ...@...:~ $ sudo mdadm --detail --scan | sudo tee -a /etc/mdadm/mdadm.conf
    ARRAY /dev/md/0 metadata=1.2 name=framboise4:0 UUID=f88601ca:d0e78820:c242a066:82223b32

    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 :

...@...:~ $ lsblk /dev/md0
NAME    MAJ:MIN RM   SIZE RO TYPE  MOUNTPOINT
md0       9:0    0 111,7G  0 raid1 
├─md0p1 259:0    0    64G  0 part  /media/data
└─md0p2 259:1    0  47,7G  0 part  /media/nas
...@...:~ $ ls /media/data/
lost+found
...@...:~ $ ls /media/nas/
lost+found

Elles doivent être vides (sauf lost+found)

Utilisateurs autorisés

  1. Créez le groupe raid dont les utilisateurs seront les seuls à avoir accès au volume RAID :

    ...@...:~ $ sudo addgroup raid
    Ajout du groupe « raid » (GID 1001)...
    Fait.

  2. Ajoutez au groupe raid chaque utilisateur qui aura le droit d'accès au raid :

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

    ...@...:~ $ sudo adduser www-data raid
    Ajout de l'utilisateur « www-data » au groupe « raid »...
    Adding user www-data to group raid
    Fait.
    ...@...:~ $ sudo adduser autre_utilisateur raid

  3. Appliquez les droits aux points de montage :

    ...@...:~ $ sudo chown -R pi:raid /media/{data,nas}
    ...@...:~ $ sudo chmod -R 2775 /media/{data,nas}

  4. Faites un reboot pour vérifier que tout se met bien en place au démarrage :

    ...@...:~ $ sudo shutdown -r now

Mise en place de la surveillance d’un disque

  1. Éditez avec les droits d'administration le fichier /etc/default/mdadm pour vérifier que ces lignes sont bien présentes :
    /etc/default/mdadm
    ...
    AUTOCHECK=true
    ...
    START_DAEMON=true
  2. Éditez avec les droits d'administration le fichier /etc/mdadm/mdadm.conf pour renseigner votre email :
    /etc/mdadm/mdadm.conf
    ...
    MAILADDR votre_adresse@email.fr
  3. Testez l'envoi d'une notification :

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