Bienvenue dans mon /dev/null

Préparation de clefs usb pour faire du raid (3/3)

Publié le: par Au_Hasard

Mis à jour le: • 10 min de lecture

Contexte

C’est la troisième partie de ce post et la suite de celui-ci

On a déja vu pas mal de commandes dans les deux précédents posts donc hésite pas à les relires au cas où.

Présentation

On va donc voir plusieurs choses importantes dans ce post  : - Raid : Ça permets la tolérance de panne entre les différents périphériques de stockages qui font partie d’un gratte raid et peut aussi améliorer la performance en répartissant les données sur les différents disques. - LVM : Logical Volume Manager - Permets la création et la gestion de volumes logiques sous linux.

Je ne rentre pas trop dans les délais pour l’instant, je ferai probablement des posts sur ces deux fonctionnalitées.

Cambouis

RAID

Il y plusieurs types de raid, on ne vas rentrer dans les détails de ces différents modes ici.

Prérequis

Pour pouvoir configurer le RAID correctement, il faut d’abord préparer les partitions des clefs USB et pour ça, on va utiliser fdisk sur chacune des clefs.

[!WARNING] Comme d’habitude avec fdisk, il faut que tu fasses bien gaffe, on joue avec les partititons de périphériques de stockages donc ne te trompes de devices si tu veux pas casser ton système.

Sachant que ces clefs vont être utilisés seulement pour faire de la sauvegarde, on va faire qu’une seule partition en RAID.

utilisateur·ice@au-hasard:~ $ sudo fdisk /dev/sdb

Welcome to fdisk (util-linux 2.41).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.


Command (m for help): d # La lettre d permets de supprimer une partition. J'avais déja une partition de présente pour partir de 0, je préfère la supprimer.
Selected partition 1
Partition 1 has been deleted.

Command (m for help): n # La lettre n permets de créer une partition, je laisse les arguments suivants pas défaut, parce que je ne veux qu'une partition primaire sur toute la clef.
Partition type
   p   primary (0 primary, 0 extended, 4 free)
   e   extended (container for logical partitions)
Select (default p):

Using default response p.
Partition number (1-4, default 1):
First sector (2048-30326783, default 2048):
Last sector, +/-sectors or +/-size{K,M,G,T,P} (2048-30326783, default 30326783):

Created a new partition 1 of type 'Linux' and of size 14.5 GiB.

Command (m for help): t # La lettre t permets de modifier le type de partition, de base il créer la partition en `Linux`, on va la changer en `raid`
Selected partition 1
Hex code or alias (type L to list all): fd # Les lettres fd sont le raccourci pour indiqués à la partition d'être en `raid`
Changed type of partition 'Linux' to 'Linux raid autodetect'.

Command (m for help): p # La lettre p permets de visualiser les modifications que l'on a faite avant
Disk /dev/sdb: 14.46 GiB, 15527313408 bytes, 30326784 sectors
Disk model: Micro OTG
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x7d98f6f9

Device     Boot Start      End  Sectors  Size Id Type
/dev/sdb1        2048 30326783 30324736 14.5G fd Linux raid autodetect

Command (m for help): w #La lettre w permets d'écrire donc de modifier les partitions pour ensuite quitter `fdisk`. Attention à bien vérifier les modifications que vous faites, c'est irréversible après ça.
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.

Il faut ensuite faire ça pour toutes les autres clefs USB. De mon côté, le nom des périphériques est /dev/sdb,/dev/sdc,/dev/sdb.

Pour vérifier que tout est bon au niveau de tes nouvelles partitions, tu peux taper cette commande : 

utilisateur·ice@au-hasard:~ $ lsblk -o NAME,TYPE,PARTTYPENAME
NAME        TYPE PARTTYPENAME
[…]
sdb         disk
└─sdb1      part Linux raid autodetect
sdc         disk
└─sdc1      part Linux raid autodetect
sdd         disk
└─sdd1      part Linux raid autodetect
[…]

L’argument -o de la commande lsblk est très intéressant, tu peux créer tes colonnes comme tu le souhaites avec une mutltitude d’informations. Par exemple, on peut récupérer l’UUID des périphériques via cette argument, on verras ça dans la suite du post.

Création

On va maintenant installer le paquet mdadm pour configurer le raid.

utilisateur·ice@au-hasard:~ $ sudo apt update && sudo apt install mdadm -y

Ensuite, on créé le raid avec la commande suivante, attention à bien choisir le type de raid qu’il te faut selon le nombre de périphérique de stockage que tu as sous la main. L’explication fait suite à la commande : 

utilisateur·ice@au-hasard:~ $ sudo mdadm --create /dev/md0 --level=5 --raid-devices=3 /dev/sdb1 /dev/sdc1 /dev/sdd1
To optimalize recovery speed, it is recommended to enable write-indent bitmap, do you want to enable it now? [y/N]? y
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md0 started.

Sur cette commande, on créé le périphérique /dev/md0, c’est le petit nom de notre raid avec le level 5 qui corresponds au Raid 5 ce qui signifie que l’on utilise chaque disques (3 minimuns pour le raid5) pour la donnée et sa parité. La parité va servir à recréé la donnée à partir des autres disques en cas de dysfonctionnement de l’un d’eux. Attention quand même le raid 5 ne peut avoir qu’un seul disque défectueux à la fois. Pour la suite de la commande, on indique le nombre de partitions qu’il va y avoir dans la grappe du raid et les partitions en questions.

Je te vois venir avec ta question, pourquoi on ne mets pas l’UUID de la partition dans ta commande ? Parce que mdadm va créé un UUID bien à lui pour les partitions faisant partis de sa grappe.

J’ai répondu y à la question qui est posé pour que mdadm puisse utiliser le bitmap d’écriture qui permets de savoir où sont les données dans les blocs des disques lors d’une opération de récupération d’une panne, ça améliore la vitesse de récupération donc mais ça diminue la vitesse en écriture des données vu que ça écrit la donnée et ça indique aussi que cet emplacement n’est pas vide.

On va maintenant faire en sorte que mdadm soit reconnu comme un deamon via le système, c’est à dire qu’il soit démarrer au lancement de ton serveur : 

utilisateur·ice@au-hasard:~ $ sudo mdadm --daemonise /dev/md0
mdadm: --daemonise does not set the mode, and so cannot be the first option.
#Si vous avez un message d'erreur comme ci-dessus, lancer la commande suivante
utilisateur·ice@au-hasard:~ $ sudo mdadm --monitor --daemonise /dev/md0
mdadm: Warning: One autorebuild process already running.
62921

Pour avoir des informations sur le raid nouvellement créé, on peut taper la commande suvante : 

utilisateur·ice@au-hasard:~ $ sudo mdadm --detail /dev/md0
/dev/md0:
           Version : 1.2
     Creation Time : Mon Mar  9 14:43:13 2026
        Raid Level : raid5
        Array Size : 30306304 (28.90 GiB 31.03 GB)
     Used Dev Size : 15153152 (14.45 GiB 15.52 GB)
      Raid Devices : 3
     Total Devices : 3
       Persistence : Superblock is persistent

     Intent Bitmap : Internal # Le bitmap est stocké en interne donc avec la métadonnée de l'écriture et donc est répliqué sur tous les périphériques de stockage.

       Update Time : Mon Mar  9 14:55:16 2026
             State : clean, degraded, recovering
    Active Devices : 2
   Working Devices : 3
    Failed Devices : 0
     Spare Devices : 1

            Layout : left-symmetric
        Chunk Size : 512K

Consistency Policy : bitmap

    Rebuild Status : 18% complete # La construction de la grappe est en cours.

              Name : rpi-3:0  (local to host rpi-3)
              UUID : cce68065:bedd2069:3e55820e:aad5a2ab
            Events : 136

    Number   Major   Minor   RaidDevice State
       0       8       17        0      active sync   /dev/sdb1
       1       8       33        1      active sync   /dev/sdc1
       3       8       49        2      spare rebuilding   /dev/sdd1

Où vérifier le processus mdstat :

utilisateur·ice@au-hasard:~ $ cat /proc/mdstat
Personalities : [raid6] [raid5] [raid4]
md0 : active raid5 sdd1[3] sdc1[1] sdb1[0]
      30306304 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/2] [UU_]
      [==>..................]  recovery = 14.0% (2125300/15153152) finish=53.0min speed=4090K/sec
      bitmap: 0/1 pages [0KB], 65536KB chunk

unused devices: <none>

Pour vérifier ça avec des commandes que l’on a déja vu, tu peux de nouveau taper la commande lsblk :

utilisateur·ice@au-hasard:~ $ lsblk
NAME        MAJ:MIN RM  SIZE RO TYPE  MOUNTPOINTS
[…]
sdb           8:16   1 14.5G  0 disk
└─sdb1        8:17   1 14.5G  0 part
  └─md0       9:0    0 28.9G  0 raid5
sdc           8:32   1 14.5G  0 disk
└─sdc1        8:33   1 14.5G  0 part
  └─md0       9:0    0 28.9G  0 raid5
sdd           8:48   1 14.5G  0 disk
└─sdd1        8:49   1 14.5G  0 part
  └─md0       9:0    0 28.9G  0 raid5
[…]

On peut voir que les partitions que l’on a créé sont rattachés à md0 qui est notre raid.

LVM

Cette partie n’est pas nécessaire mais conseiller, si tu veux passer cette partie, il te suffit d’ajouter ton périphérique raid dans /etc/fstab pour qu’il soit monté dans un répertoire. Je te laisse relire la partie 1 de ces tutos si tu veux plus d’infos.

Maintenant que le raid est configuré, on va s’attaquer à la partie LVM. Ça va nous permettre d’ajouter le volume RAID dans un LVM et de pouvoir gérer plus facilement le stockage de tout ça.

Installation

sudo apt update && sudo apt install lvm2 -y

Configuration

pv : physical volume

Le pv corresponds aux périphériques de stockage que l’on veut ajouter dans la configuration de notre LVM, ici, ça sera notre raid /dev/md0.

On va donc créé ce pv avec la commande suivante : 

utilisateur·ice@au-hasard:~ $ sudo pvcreate /dev/md0
Physical volume "/dev/md0" successfully created.

vg : volume group

Le vg est donc un groupe de volume qui peut permettre de regrouper les données par fonctionnalités où par tout autre chose à ton bon vouloir.

Le groupe de volume doit obligatoirement faire parti d’un pv donc dans la commande de la création, on le rattachera à son pv.

Je nomme toujours mes vg de la manière suivante : vg_nomduvg pour avoir plus de visibilités à sa lecture.

utilisateur·ice@au-hasard:~ $ sudo vgcreate vg_backups /dev/md0
  Volume group "vg_backups" successfully created

lv : logical volume

Le lv corresponds au volume logique donc à l’emplacement où sera la données elle même.

Le volume logique doit obligatoirement faire parti d’un vg donc dans la commande de la création, on le rattachera à son vg.

Je nomme toujours mes lv de la manière suivante : lv_nomdulv pour avoir plus de visibilités à sa lecture.

utilisateur·ice@au-hasard:~ $ sudo lvcreate -L 5G -n lv_blog vg_backups
Logical volume "lv_blog" created.

L’avantage du LV, c’est que l’on peut augmenter sa capacité tant qu’il reste de la place sur le pv et le vg, j’ai donc mis pour l’instant 5Go.

Ce qui est top, c’est que si je veux faire un autre site sur le même serveur, je peux créer un autre LV pour les sauvegardes et l’intégrer dans le vg_backups et d’un coup d’oeil, je reconnaitrais mon arborescence de données de sauvegarde.

Vérification

Pour vérifier tout ça, on a toujours notre commande lsblk qui doit nous présenter quelque chose comme ceci : 

au_hasard@rpi-3:~ $ lsblk
NAME                     MAJ:MIN RM  SIZE RO TYPE  MOUNTPOINTS
[…]
sdb                        8:16   1 14.5G  0 disk
└─sdb1                     8:17   1 14.5G  0 part
  └─md0                    9:0    0 28.9G  0 raid5
    └─vg_backups-lv_blog 252:0    0    5G  0 lvm
sdc                        8:32   1 14.5G  0 disk
└─sdc1                     8:33   1 14.5G  0 part
  └─md0                    9:0    0 28.9G  0 raid5
    └─vg_backups-lv_blog 252:0    0    5G  0 lvm
sdd                        8:48   1 14.5G  0 disk
└─sdd1                     8:49   1 14.5G  0 part
  └─md0                    9:0    0 28.9G  0 raid5
    └─vg_backups-lv_blog 252:0    0    5G  0 lvm
[…]

Configuration du volume

Pour finir, oui, c’est bientôt fini, je te félicite si tu es arrivé·e jusqu’ici. /

On va configurer le LV et le monter dans un répertoire comme on a pu le voir dans le premier post.

sudo mkfs.ext4 /dev/mapper/vg_backups-lv_blog
mkdir ~/backups #Si il n'existe pas

Pour récupérer l’UUID à indiquer dans /etc/fstab, tu peux utiliser la commande suivante : 

au_hasard@rpi-3:~ $ lsblk -o NAME,TYPE,PARTTYPENAME,UUID
NAME                     TYPE  PARTTYPENAME          UUID
[…]
sdb                      disk
└─sdb1                   part  Linux raid autodetect cde68065-bedd-2069-3e55-820eaad5a2ab
  └─md0                  raid5                       Tb8bxg-LHR5-eEXw-YsNi-Nt68-i1lL-fdEt2i
    └─vg_backups-lv_blog lvm                         c99a6dbc-0a1c-476c-8c1e-33f6a2db9780
sdc                      disk
└─sdc1                   part  Linux raid autodetect cde68065-bedd-2069-3e55-820eaad5a2ab
  └─md0                  raid5                       Tb8bxg-LHR5-eEXw-YsNi-Nt68-i1lL-fdEt2i
    └─vg_backups-lv_blog lvm                         c99a6dbc-0a1c-476c-8c1e-33f6a2db9780
sdd                      disk
└─sdd1                   part  Linux raid autodetect cde68065-bedd-2069-3e55-820eaad5a2ab
  └─md0                  raid5                       Tb8bxg-LHR5-eEXw-YsNi-Nt68-i1lL-fdEt2i
    └─vg_backups-lv_blog lvm                         c99a6dbc-0a1c-476c-8c1e-33f6a2db9780
[…]

On récupère l’UUID du lv et on peut ensuite l’ajouté dans /etc/fstab.

Et voila !! Tu as maintenant du raid et du LVM pour ta sauvegarde !!! Bien joué.

Je pense qu’un de mes prochains posts sera de mettre en place un petit monitoring des périphériques de stockage pour savoir si l’un d’eux est HS et doit être changé.