18 mai 2022

Stockage avancé avec KVM, LVM et Raid

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…

 

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 😉

 

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *