Vous avez un serveur, du stockage et une furieuse envie de stocker des VMS en LVM ?
Bienvenue alors !
Nous allons voir comment proposer du stockage LVM sur du RAID pour servir de stockage à nos futures VMs KVM en optimisant un peu l’espace disque…
Cela vous parait complexe ? Meuh non !
Cet article s’intègre dans la série New Box 2022. Vous y trouverez le pourquoi du comment, les prérequis, paquets à installer, etc…
Sommaire
I – Présentation
Le serveur que j’utilise (Dedibox) propose deux SSD de 250G chacun, le tout en RAID1. C’est bien, mais on perd quand même pas mal d’espace.
Par défaut, après l’installation du serveur, un espace en RAID 1 est monté dans /data :
/dev/sda1 -> 300M -> RAID1 /dev/md0 -> montage /boot /dev/sda2 -> 512M -> SWAP /dev/sda2 -> 15G -> RAID1 /dev/md1 -> montage / /dev/sda4 -> 222G -> RAID1 /dev/md2 -> montage /data /dev/sdb1 -> 300M -> RAID1 /dev/md0 -> montage /boot /dev/sdb2 -> 512M -> SWAP /dev/sdb2 -> 15G -> RAID1 /dev/md1 -> montage / /dev/sdb4 -> 222G -> RAID1 /dev/md2 -> montage /data
Et donc 222G de disponible pour mon futur Volume Group.
Pour ne pas perdre trop espace disque tout en bénéficiant d’une certaine sécurité, je vais mettre en place un Raid1 et un Raid0 de sorte à avoir ceci :
/dev/sda1 -> 300M -> RAID1 /dev/md0 -> montage /boot /dev/sda2 -> 512M -> SWAP /dev/sda2 -> 15G -> RAID1 /dev/md1 -> montage / /dev/sda4 -> 145G -> RAID1 /dev/md2 -> lvm vg0 /dev/sda5 -> 77G -> RAID0 /dev/md3 -> lvm vg1 /dev/sdb1 -> 300M -> RAID1 /dev/md0 -> montage /boot /dev/sdb2 -> 512M -> SWAP /dev/sdb2 -> 15G -> RAID1 /dev/md1 -> montage / /dev/sdb4 -> 145G -> RAID1 /dev/md2 -> lvm vg0 /dev/sdb4 -> 77G -> RAID0 /dev/md3 -> lvm vg1
J’ai alors deux Volume Group pour LVM :
- un VG0 de 145G en Raid1
- un VG1 de 154G (2*77) en Raid0
soit 299G au total. Un gain de 77G !
Alors, oui si un disque me lache, je perd le VG1… mais je garde le VG0. L’astuce est alors de répartir intelligemment les VMS.
Sachant que je les redonde presque toutes, il me suffit de mettre les masters sur le VG1 et les slaves sur le VG0. Ainsi, les masters bénéficient de l’écriture rapide (Raid 0). Et si un disque pète, mon infra passe sur les slaves …
Malynx !
Bon, à l’installation de la box, avec l’outil d’Online, j’ai tenté de faire les manips que j’explique ci dessous, mais ça a tendance à merdouiller. Je conseille donc de laisser l’installation de base et de défaire-refaire après.
II – Pétage de l’existant
Par défaut, chez Online, l’espace du Raid 1 est monté dans /data. On le démonte :
# umount /data
Puis on pense à supprimer la référence dans le fichier /etc/fstab.
On va regarder les volumes concernés par le raid :
# mdadm --detail /dev/md2
Ce qui nous donne :
/dev/md2: Version : 1.2 Creation Time : Thu Mar 10 12:34:59 2022 Raid Level : raid1 Array Size : 227906560 (217.35 GiB 233.38 GB) Used Dev Size : 227906560 (217.35 GiB 233.38 GB) Raid Devices : 2 Total Devices : 2 Persistence : Superblock is persistent Intent Bitmap : Internal Update Time : Thu Mar 10 13:02:29 2022 State : clean, resyncing Active Devices : 2 Working Devices : 2 Failed Devices : 0 Spare Devices : 0 Consistency Policy : bitmap Resync Status : 78% complete Name : k:2 (local to host k) UUID : 889b4197:103be046:7216a8c6:e59f41b1 Events : 315 Number Major Minor RaidDevice State 0 8 4 0 active sync /dev/sda4 1 8 20 1 active sync /dev/sdb4
On arrête le raid en question :
# mdadm --stop /dev/md2
Histoire d’éviter que ce raid soit détecté de nouveau automatiquement lors du prochain démarrage :
# mdadm --zero-superblock /dev/sda4 /dev/sdb4
On termine en modifiant le fichier /etc/mdadm/mdadm.conf pour supprimer la référence au md2.
ARRAY /dev/md/2 metadata=1.2 UUID=889b4197:103be046:7216a8c6:e59f41b1 name=k:2
III – Partitionnement
On va re-partitionner les disques :
# cfdisk /dev/sda On va sur /dev/sda4 : on delete Ensuite, New, Taille au max, puis Extended On descend sur FreeSpace, NEW, 145G On descend sur FreeSpace, NEW, le reste On write On quitte
Et rebelote sur /dev/sdb, où l’on fait la même opération :
# cfdisk /dev/sdb ....
Ce qui, au final, donne ceci (exemple sur /dev/sdb) :
Disk: /dev/sdb Size: 238.5 GiB, 256060514304 bytes, 500118192 sectors Label: dos, identifier: 0x81c8c3a2 Device Boot Start End Sectors Size Id Type /dev/sdb1 * 2048 614399 612352 299M fd Linux raid autodetect /dev/sdb2 614400 1662975 1048576 512M 82 Linux swap / Solaris /dev/sdb3 1662976 33120255 31457280 15G fd Linux raid autodetect /dev/sdb4 33120256 500118191 466997936 222.7G 5 Extended ├─/dev/sdb5 33122304 337209343 304087040 145G 83 Linux >> └─/dev/sdb6 337211392 500118191 162906800 77.7G 83 Linux
On reboote pour recharger tout ça :
# reboot
IV – Création Raids
Une fois la machine redémarrée, un :
# lsblk
nous donne :
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 238.5G 0 disk ├─sda1 8:1 0 299M 0 part │ └─md0 9:0 0 298M 0 raid1 /boot ├─sda2 8:2 0 512M 0 part [SWAP] ├─sda3 8:3 0 15G 0 part │ └─md1 9:1 0 15G 0 raid1 / ├─sda4 8:4 0 1K 0 part ├─sda5 8:5 0 145G 0 part └─sda6 8:6 0 77.7G 0 part sdb 8:16 0 238.5G 0 disk ├─sdb1 8:17 0 299M 0 part │ └─md0 9:0 0 298M 0 raid1 /boot ├─sdb2 8:18 0 512M 0 part [SWAP] ├─sdb3 8:19 0 15G 0 part │ └─md1 9:1 0 15G 0 raid1 / ├─sdb4 8:20 0 1K 0 part ├─sdb5 8:21 0 145G 0 part └─sdb6 8:22 0 77.7G 0 part
Nos nouveaux sda5, sda6, sdb5, sdb6 sont bien présents.
Passons maintenant à la création du nouveau Raid 1 :
# mdadm --create /dev/md2 --level=1 --raid-devices=2 /dev/sda5 /dev/sdb5
Puis le Raid 0
# mdadm --create /dev/md3 --level=0 --raid-devices=2 /dev/sda6 /dev/sdb6
On peut vérifier :
# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 238.5G 0 disk ├─sda1 8:1 0 299M 0 part │ └─md0 9:0 0 298M 0 raid1 /boot ├─sda2 8:2 0 512M 0 part [SWAP] ├─sda3 8:3 0 15G 0 part │ └─md1 9:1 0 15G 0 raid1 / ├─sda4 8:4 0 1K 0 part ├─sda5 8:5 0 145G 0 part │ └─md2 9:2 0 144.9G 0 raid1 └─sda6 8:6 0 77.7G 0 part └─md3 9:3 0 155.2G 0 raid0 sdb 8:16 0 238.5G 0 disk ├─sdb1 8:17 0 299M 0 part │ └─md0 9:0 0 298M 0 raid1 /boot ├─sdb2 8:18 0 512M 0 part [SWAP] ├─sdb3 8:19 0 15G 0 part │ └─md1 9:1 0 15G 0 raid1 / ├─sdb4 8:20 0 1K 0 part ├─sdb5 8:21 0 145G 0 part │ └─md2 9:2 0 144.9G 0 raid1 └─sdb6 8:22 0 77.7G 0 part └─md3 9:3 0 155.2G 0 raid0
La création du Raid 2 /dev/md2 n’est pas instantanée. Pour voir ou en est sa création :
# mdadm --detail /dev/md2
Ce qui affiche, entre autres :
... Resync Status : 7% complete ...
ou :
# cat /proc/mdstat
->
... md2 : active raid1 sdb5[1] sda5[0] 151911424 blocks super 1.2 [2/2] [UU] [=>...................] resync = 8.9% (13593728/151911424) finish=13.0min speed=176598K/sec bitmap: 2/2 pages [8KB], 65536KB chunk ...
Et on attends….
Une fois la synchro à 100 % (oui, ce peut être long) :
# mdadm --examine --scan
Vous affiche quelque chose comme :
ARRAY /dev/md/0 metadata=1.2 UUID=96804c6b:ad627216:044763bd:ae5ee769 name=k:0 ARRAY /dev/md/1 metadata=1.2 UUID=eaee93c7:670bf48b:2b683425:28982e72 name=k:1 ARRAY /dev/md/2 metadata=1.2 UUID=6ae5bb51:5b292216:854d41a5:6e478366 name=k:2 ARRAY /dev/md/3 metadata=1.2 UUID=5ee5dade:190198bd:dddb4176:c010594f name=k:3
Et bien, on va ajouter ceci au fichier /etc/mdadm/mdadm.conf
ARRAY /dev/md/2 metadata=1.2 UUID=6ae5bb51:5b292216:854d41a5:6e478366 name=k:2 ARRAY /dev/md/3 metadata=1.2 UUID=5ee5dade:190198bd:dddb4176:c010594f name=k:3
Tada ! Les Raids sont prêts à être utilisés.
V – LVM
Passons à la création des PVs (Physical Volume) et VGs (Volume Group) dans LVM.
Pour rappel, nous sommes dans le cadre du tuto complet et les paquets LVMs ont déjà été installés. Si vous ne savez pas de quoi je parle, retour en haut de l’article 😉
Et pour installer lvm au cas ou :
# apt install lmv2
Si vous voulez en savoir plus sur LVM : LVM, le gestionnaire de volume logique
Auparavant, pour éviter un éventuel message :
Device /dev/md2 excluded by a filter.
à la création du PV, on efface les traces des anciens FS :
# wipefs -a /dev/md2 # wipefs -a /dev/md3
On créer les PVs :
# pvcreate /dev/md2 # pvcreate /dev/md3
Puis les VGs : # vgcreate vg0 /dev/md2 # vgcreate vg1 /dev/md3
LVM, done. Le VG1 est sur le Raid0, le VG0 est sur le Raid1.
VI – Pool de stockage KVM
Il ne nous reste plus qu’à définir nos nouveaux pools dans KVM.
# virsh pool-define-as lvm0 logical --source-name vg0 --target /dev/vg0 # virsh pool-define-as lvm1 logical --source-name vg1 --target /dev/vg1
Ensuite, on active :
# virsh pool-start lvm0 # virsh pool-start lvm1 # virsh pool-autostart lvm0 # virsh pool-autostart lvm1
On peut lister
# virsh pool-list
->
Name State Autostart ---------------------------- lvm0 active yes lvm1 active yes
On est prêt a déployer nos premières VMs !
Et comme ca risque de ne pas être clair à un moment, résume :
- LVM1 sera pour les masters (sur le Raid0 )
- LVM0 sera pour les backups (sur le RAID1)
Je vous propose donc de revenir à l’article initial et de poursuivre la feuille de route 😉