Vous connaissez déjà LVM, le gestionnaire de volumes logiques qui permet d’agréger et de subdiviser librement vos périphériques de stockage. Eh bien, depuis quelques années, LVM permet également de définir des volumes en RAID.
LVM et RAID, version traditionnelle
Pour utiliser LVM avec du RAID, on utilise d’habitude LVM et MD, qui est l’implémentation du RAID logiciel de Linux. Pour cela, on les empile :
- soit en agrégeant ses périphériques de stockage en un volume RAID, qu’on utilise ensuite comme un volume LVM physique : il s’agit de LVM au‐dessus de RAID ;
- soit, à l’inverse, ce qui est plus compliqué, en agrégeant en RAID des volumes LVM logiques soigneusement définis : il s’agit donc de RAID par dessus LVM.
Manque de souplesse
Outre le côté un peu artificiel de cet empilement, cette solution manque de souplesse pour au moins un cas d’usage. En effet, sur un ordinateur disposant de plusieurs périphériques de stockage, on peut vouloir redonder une partie du système de fichiers en RAID, tout en laissant une autre partie sans redondance pour minimiser son utilisation du stockage. Parmi les usages qui ne méritent pas forcément une telle redondance : des films qu’on a par ailleurs sur DVD, les nouvelles Usenet ou encore des caches de divers logiciels.
Bref, ce cas d’usage passe mal. Avec du LVM sur RAID, c’est tout simplement infaisable. On peut toujours partitionner ses périphériques de stockage pour en utiliser une partie en RAID et l’autre sans, mais on retrouve alors un partitionnement statique. Avec du RAID sur LVM, c’est faisable, mais c’est une solution compliquée à gérer.
Cela passe encore plus mal avec GRUB, qui peut ne pas apprécier cet empilement et ne pas réussir à lire le système de fichiers où il doit aller chercher le noyau à démarrer. On se retrouve alors à utiliser une partition statique dédiée à /boot
.
Nous en arrivons donc à cette fonctionnalité de RAID intégrée à LVM.
Rappel sur LVM
Avec LVM, on commence par formater ses périphériques de stockage pour en faire des volumes physiques LVM, ou PV pour physical volumes : ce sont des périphériques bloc, visibles dans /dev
, qu’on confie simplement à LVM.
# J’ai deux périphériques, sda et sdb, avec une première partition
# système EFI, et une seconde partition avec l’essentiel de l’espace,
# qui sera utilisé avec LVM
pvcreate /dev/sda2 /dev/sdb2
On agrège ensuite un ou plusieurs volumes physiques pour former un groupe de volumes, ou VG pour volume group : contrairement aux volumes physiques, les groupes de volumes ne sont qu’une abstraction de LVM et n’ont, autant que je sache, pas d’existence dans /dev
.
# Je donne à mes groupes de volume le même nom que l’ordinateur
vgcreate vg-camembert /dev/sda2 /dev/sdb2
On définit ensuite des volumes logiques ou LV pour logical volumes, qui sont des périphériques bloc émulés par LVM, apparaissant dans /dev
et prêts à être formatés et montés pour héberger un système de fichiers.
lvcreate --size 10G --name root vg-camembert
mkfs.ext4 -L root /dev/vg-camembert/root
lvcreate --size 50G --name home vg-camembert
mkfs.ext4 -L home /dev/vg-camembert/home
Lorsqu’on crée un volume logique, on doit évidemment indiquer dans quel groupe de volumes il sera mis en œuvre, mais on peut également préciser au besoin, sur quel volume physique en particulier – membre de ce groupe de volumes – il sera effectivement stocké. Cette possibilité est déjà utile pour diverses raisons, par exemple si les volumes physiques ont des caractéristiques différentes ; typiquement pour stocker des films sur un gros disque dur lent et son système d’exploitation sur un petit SSD très rapide, le tout sous LVM avec un seul groupe de volumes.
# sda est petit et rapide, parfait pour héberger /
lvcreate --size 10G --name root vg-camembert /dev/sda1
# sdb est gros et moins rapide, ce qui me convient pour /home
lvcreate --size 50G --name home vg-camembert /dev/sdb1
RAID intégré à LVM
Au moment de créer un volume logique, on peut donc également indiquer qu’il s’agit d’un volume RAID, en précisant le niveau de RAID et la redondance souhaitée :
# Mieux vaut mettre / en RAID1
# Le --nosync sert à éviter l’inutile synchronisation des données
# initialement présentes
lvcreate --size 10G --name root --type raid1 --nosync vg-camembert
# Soyons fous, /home en RAID0
lvcreate --size 50G --name home --type raid0 vg-camembert
On peut aussi convertir un volume logique existant en RAID, ou à l’inverse, convertir un volume logique RAID en classique, c’est‐à‐dire linéaire — c’est leur vrai nom, ce qui peut être utile en vue d’un changement de périphérique par exemple.
La page de manuel de lvmraid(7)
donne toute les informations utiles, en particulier les commandes permettant de lancer une procédure de vérification de la correspondance des données dupliquées :
lvchange --syncaction check vg-camembert/root
Avantages
L’utilisation de la fonctionnalité de RAID intégrée à LVM a l’avantage d’être simple à mettre en œuvre, il n’est ainsi plus nécessaire de se demander dans quel ordre empiler LVM et MD, ou comment organiser tout cela : il suffit d’utiliser LVM comme d’habitude, avec quelques options en plus, le fait d’être en RAID ou non étant simplement une caractéristique de chaque volume logique, qui peut même être changée a posteriori.
Les volumes logiques de type RAID sont également pris en charge par GRUB, de sorte qu’il n’est pas nécessaire de mettre en place une partition /boot
séparée.