Stockage - LVM - Exemple d'architecture

L’objectif ici est de mettre en place une architecture basée sur LVM (Logical Volume Manager) correspondant au schéma ci-dessous. il s’agit d’un exemple fictif (mais possible) permettant de recouvrir plusieurs cas de figure.

Description

Hard Drives

Les disques durs physiques :

  • /dev/sda
  • /dev/sdb
  • /dev/sdc
  • /dev/sdd
  • /dev/sde

Les disques sont partionnés.

Partitions

Les partitions de chaque disque physique :

  • Le disque /dev/sda est partitionné en /dev/sda, /dev/sda, /dev/sda
  • Le disque /dev/sdb est partitionné en /dev/sdb1, /dev/sdb2
  • Le disque /dev/sdc est partitionné en /dev/sdc1
  • Le disque /dev/sdd est partitionné en /dev/sdd1, /dev/sdd2
  • Le disque /dev/sde est partitionné en /dev/sde1, /dev/sde2, /dev/sde3, /dev/sde4

Les partitions composent les PV (Physical Volumes).

Physical Volumes (PV)

Les volumes physiques sont les partitions brutes des disques (ici, sda, sdb, etc.) :

  • /dev/sda1, /dev/sda2, /dev/sda3
  • /dev/sdb1, /dev/sdb2
  • /dev/sdc1
  • /dev/sdd1, /dev/sdd2
  • /dev/sde1, /dev/sde2, /dev/sde3, /dev/sde4

Volume Groups (VG)

Les groupes de volumes sont créés à partir des volumes physiques (PV) :

  • VG_DATAS
  • VG_BACKUP

Ils permettent d’organiser et d’agréger l’espace de stockage pour les volumes logiques.

Logical Volumes (LV)

Chaque volume logique est un bloc virtuel de stockage créé dans un groupe de volumes (VG).

  • /dev/VG_DATAS/LV_HOME
  • /dev/VG_DATAS/LV_DOCUMENTS
  • /dev/VG_BACKUP/LV_ARCHIVES

Ce sont les partitions logiques qui accueillent les systèmes de fichiers.

File Systems

Les points de montage où les systèmes de fichiers sont accessibles pour les utilisateurs :

  • /mnt/home
  • /mnt/documents
  • /mnt/archives

Création de l’architecture

Base

À ce stade les disques sur le serveur sont tels que :

# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
sda 8:0 0 16G 0 disk
sdb 8:32 0 16G 0 disk
sdc 8:96 0 16G 0 disk
sdd 8:112 0 16G 0 disk
sde 8:128 0 16G 0 disk

Création des partitions sur chaque disque dur

Les disques utilisés dans le schéma sont /dev/sda, /dev/sdb, /dev/sdc, /dev/sdd, et /dev/sde.

Partionnement

Pour les partitionner, on utilise fdisk. On crée :

  • Une table des partitions GPT (g)
  • Une nouvelle partition (n), de 5Go, répété plusieurs fois si besoin
  • De type (t) LVM (Linux LVM), répété plusieurs fois si besoin
# fdisk /dev/sda

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

Device does not contain a recognized partition table.
Created a new DOS disklabel with disk identifier 0xb4d86f7a.

Command (m for help): g
Created a new GPT disklabel (GUID: DC6F891E-A8C8-1743-AF31-25E4F409D728).

Command (m for help): n
Partition number (1-128, default 1):
First sector (2048-33554398, default 2048):
Last sector, +/-sectors or +/-size{K,M,G,T,P} (2048-33554398, default 33554398): +5G

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

Command (m for help): n
Partition number (2-128, default 2):
First sector (10487808-33554398, default 10487808):
Last sector, +/-sectors or +/-size{K,M,G,T,P} (10487808-33554398, default 33554398): +5G

Created a new partition 2 of type 'Linux filesystem' and of size 5 GiB.

Command (m for help): n
Partition number (3-128, default 3):
First sector (20973568-33554398, default 20973568):
Last sector, +/-sectors or +/-size{K,M,G,T,P} (20973568-33554398, default 33554398): +5G

Created a new partition 3 of type 'Linux filesystem' and of size 5 GiB.

Command (m for help): t
Partition number (1-3, default 3): 1
Partition type or alias (type L to list all): Linux LVM

Changed type of partition 'Linux filesystem' to 'Linux LVM'.

Command (m for help): t
Partition number (1-3, default 3): 2
Partition type or alias (type L to list all): Linux LVM

Changed type of partition 'Linux filesystem' to 'Linux LVM'.

Command (m for help): t
Partition number (1-3, default 3):
Partition type or alias (type L to list all): Linux LVM

Changed type of partition 'Linux filesystem' to 'Linux LVM'.

Command (m for help): p
Disk /dev/sda: 16 GiB, 17179869184 bytes, 33554432 sectors
Disk model: Virtual disk
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: gpt
Disk identifier: DC6F891E-A8C8-1743-AF31-25E4F409D728

Device Start End Sectors Size Type
/dev/sda1 2048 10487807 10485760 5G Linux LVM
/dev/sda2 10487808 20973567 10485760 5G Linux LVM
/dev/sda3 20973568 31459327 10485760 5G Linux LVM

Command (m for help): w
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.

Ensuite, créer les autres partitions sur la même procédure.

Par la suite, on peut donner un nom à chaque partition avec parted :

# parted /dev/sda
GNU Parted 3.5
Using /dev/sda
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) name 1 A-P1
(parted) name 2 A-P2
(parted) name 3 A-P3
(parted) quit

Pour vérifier, avec parted --list ou parted /dev/sdX --print :

# parted --list
[...]
Model: VMware Virtual disk (scsi)
Disk /dev/sde: 17.2GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:

Number Start End Size File system Name Flags
1 1049kB 4296MB 4295MB E-P1 lvm
2 4296MB 8591MB 4295MB E-P2 lvm
3 8591MB 12.9GB 4295MB E-P3 lvm
4 12.9GB 16.1GB 3221MB E-P4 lvm
[...]

Model: VMware Virtual disk (scsi)
Disk /dev/sdc: 17.2GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:

Number Start End Size File system Name Flags
1 1049kB 16.1GB 16.1GB C-P1 lvm

Informer le noyau des nouvelles partitions avec partprobe :

Pour informer le noyau de l éxistance des nouvelles partitions, on utilise partprobe :

# partprobe /dev/sda
# partprobe /dev/sdb
# partprobe /dev/sdc
# partprobe /dev/sdd
# partprobe /dev/sde

Vérification

Avec lsblk :

# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
sda 8:32 0 16G 0 disk
├─sda1 8:33 0 5G 0 part
├─sda2 8:34 0 5G 0 part
└─sda3 8:35 0 5G 0 part
sdb 8:96 0 16G 0 disk
├─sdb1 8:97 0 7G 0 part
└─sdb2 8:98 0 7G 0 part
sdc 8:112 0 16G 0 disk
└─sdc1 8:113 0 15G 0 part
sdd 8:128 0 16G 0 disk
├─sdd1 8:129 0 7G 0 part
└─sdd2 8:130 0 7G 0 part
sde 8:144 0 16G 0 disk
├─sde1 8:145 0 4G 0 part
├─sde2 8:146 0 4G 0 part
├─sde3 8:147 0 4G 0 part
└─sde4 8:148 0 3G 0 part

Création des volumes physiques (PV)

Pour chaque partition dans le schéma, il fault les initialiser les partitions comme PV (volumes physiques) :

# pvcreate /dev/sda1 /dev/sda2 /dev/sda3
# pvcreate /dev/sdb1 /dev/sdb2
# pvcreate /dev/sdc1
# pvcreate /dev/sdd1 /dev/sdd2
# pvcreate /dev/sde1 /dev/sde2 /dev/sde3 /dev/sde4

Ou dirctement :

# pvcreate /dev/sda1 /dev/sda2 /dev/sda3 /dev/sdb1 /dev/sdb2 /dev/sdc1 /dev/sdd1 /dev/sdd2 /dev/sde1 /dev/sde2 /dev/sde3 /dev/sde4

Retour commande :

Physical volume "/dev/sda1" successfully created.
Physical volume "/dev/sda2" successfully created.
Physical volume "/dev/sda3" successfully created.
Physical volume "/dev/sdb1" successfully created.
Physical volume "/dev/sdb2" successfully created.
Physical volume "/dev/sdc1" successfully created.
Physical volume "/dev/sdd1" successfully created.
Physical volume "/dev/sdd2" successfully created.
Physical volume "/dev/sde1" successfully created.
Physical volume "/dev/sde2" successfully created.
Physical volume "/dev/sde3" successfully created.
Physical volume "/dev/sde4" successfully created.

S’assurer que les modifications de périphériques ont bien été prises en compte avec udevadm settle:

# udevadm settle

Cela va préparer les partitions à être incluses dans des groupes de volumes (VG).

Création des groupes de volumes (VG)

Création de 2 VG, VG_DATAS et VG_BACKUP, qui sont des regroupent des PV :

# vgcreate VG_DATAS /dev/sda1 /dev/sda2 /dev/sda3 /dev/sdb1 /dev/sdb2 /dev/sdc1
# vgcreate VG_BACKUP /dev/sdd1 /dev/sdd2 /dev/sde1 /dev/sde2 /dev/sde3 /dev/sde4

Retour commande :

# vgcreate VG_DATAS /dev/sda1 /dev/sda2 /dev/sda3 /dev/sdb1 /dev/sdb2 /dev/sdc1
Volume group "VG_DATAS" successfully created
# vgcreate VG_DATAS /dev/sda1 /dev/sda2 /dev/sda3 /dev/sdb1 /dev/sdb2 /dev/sdc1
Volume group "VG_DATAS" successfully created

Création des volumes logiques (LV)

Après avoir créé les VG, on peut créer les LV.
Chaque volume logique sera un espace qui pourra être utilisé pour un système de fichiers.

Les volumes logiques à créer sont :

  • /dev/VG_DATAS/LV_HOME
  • /dev/VG_DATAS/LV_DOCUMENTS
  • /dev/VG_BACKUP/LV_ARCHIVES

Création des LV :

# lvcreate -n LV_HOME -L 5G VG_DATAS
# lvcreate -n LV_DOCUMENTS -L 15G VG_DATAS
# lvcreate -n LV_ARCHIVES -L 20G VG_BACKUP

Les options :

  • n : spécifie le nom du volume logique
  • L : spécifie la taille du volume logique
# lvcreate -n LV_HOME -L 5G VG_DATAS
Logical volume "LV_HOME" created.
# lvcreate -n LV_DOCUMENTS -L 15G VG_DATAS
Logical volume "LV_DOCUMENTS" created.
# lvcreate -n LV_ARCHIVES -L 20G VG_BACKUP
Logical volume "LV_ARCHIVES" created.

À ce stade, un lsblk donnera :

sda                         8:32   0   16G  0 disk
├─sda1 8:33 0 5G 0 part
│ └─VG_DATAS-LV_DOCUMENTS 253:7 0 15G 0 lvm
├─sda2 8:34 0 5G 0 part
└─sda3 8:35 0 5G 0 part
sdb 8:96 0 16G 0 disk
├─sdb1 8:97 0 7G 0 part
│ └─VG_DATAS-LV_HOME 253:6 0 5G 0 lvm
└─sdb2 8:98 0 7G 0 part
sdc 8:112 0 16G 0 disk
└─sdc1 8:113 0 15G 0 part
└─VG_DATAS-LV_DOCUMENTS 253:7 0 15G 0 lvm
sdd 8:128 0 16G 0 disk
├─sdd1 8:129 0 7G 0 part
│ └─VG_BACKUP-LV_ARCHIVES 253:8 0 20G 0 lvm
└─sdd2 8:130 0 7G 0 part
└─VG_BACKUP-LV_ARCHIVES 253:8 0 20G 0 lvm
sde 8:144 0 16G 0 disk
├─sde1 8:145 0 4G 0 part
│ └─VG_BACKUP-LV_ARCHIVES 253:8 0 20G 0 lvm
├─sde2 8:146 0 4G 0 part
│ └─VG_BACKUP-LV_ARCHIVES 253:8 0 20G 0 lvm
├─sde3 8:147 0 4G 0 part
└─sde4 8:148 0 3G 0 part

Le résultat de la commande peut paraître désorganisé mais :

LVM choisit automatiquement où placer les extensions des volumes logiques, en fonction de l’espace disponible dans les PV du VG.
Lors de la création ou de l’extension d’un volume logique (LV), LVM répartit les données dans le VG de manière à utiliser l’espace disponible. Il ne se soucie pas de maintenir une cohérence géographique, et c’est pourquoi un même volume logique peut être réparti sur plusieurs PV.

Pour forcer à utiliser un PV en particulier, il est possible de le spécifier :

# lvcreate -L 5G -n LV_TRASH /dev/VG_DATAS /dev/sda3
# lvextend -L +5G /dev/VG_DATAS/LV_TRASH /dev/sda3

Formater les volumes logiques

Une fois les LV créés, il faut les formater avec un système de fichiers (par exemple ext4) :

# mkfs.ext4 /dev/VG_DATAS/LV_HOME
# mkfs.ext4 /dev/VG_DATAS/LV_DOCUMENTS
# mkfs.ext4 /dev/VG_BACKUP/LV_ARCHIVES

Création d’un système de fichiers mkfs.ext4 pour le LV LV_DOCUMENTS :

# mkfs.ext4 /dev/VG_DATAS/LV_DOCUMENTS
mke2fs 1.46.5 (30-Dec-2021)
Discarding device blocks: done
Creating filesystem with 3932160 4k blocks and 983040 inodes
Filesystem UUID: b57a8f49-45ad-48ae-9761-d2f3aa4b0d1e
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208

Allocating group tables: done
Writing inode tables: done
Creating journal (16384 blocks): done
Writing superblocks and filesystem accounting information: done

Création d’un système de fichiers mkfs.ext4 pour le LV LV_HOME :

# mkfs.ext4 /dev/VG_DATAS/LV_HOME
mke2fs 1.46.5 (30-Dec-2021)
Discarding device blocks: done
Creating filesystem with 3932160 4k blocks and 983040 inodes
Filesystem UUID: 69dd0a89-2187-4671-b952-0797504ca881
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208

Allocating group tables: done
Writing inode tables: done
Creating journal (16384 blocks): done
Writing superblocks and filesystem accounting information: done

Création d’un système de fichiers mkfs.ext4 pour le LV LV_TRASH :

# mkfs.ext4 /dev/VG_DATAS/LV_TRASH
mke2fs 1.46.5 (30-Dec-2021)
Discarding device blocks: done
Creating filesystem with 262144 4k blocks and 65536 inodes
Filesystem UUID: e1a24452-b9d2-4394-9df7-3501d28b3189
Superblock backups stored on blocks:
32768, 98304, 163840, 229376

Allocating group tables: done
Writing inode tables: done
Creating journal (8192 blocks): done
Writing superblocks and filesystem accounting information: done

Création d’un système de fichiers mkfs.ext4 pour le LV LV_ARCHIVES :

# mkfs.ext4 /dev/VG_BACKUP/LV_ARCHIVES
mke2fs 1.46.5 (30-Dec-2021)
Discarding device blocks: done
Creating filesystem with 5242880 4k blocks and 1310720 inodes
Filesystem UUID: 6f4cf71d-7686-4906-8632-49bfa270fc09
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
4096000

Allocating group tables: done
Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done

Monter les volumes logiques

Création des points de montage et montage des volumes logiques :

# mkdir -p /mnt/home /mnt/documents /mnt/archives
# mount /dev/VG_DATAS/LV_HOME /mnt/home
# mount /dev/VG_DATAS/LV_DOCUMENTS /mnt/documents
# mount /dev/VG_BACKUP/LV_ARCHIVES /mnt/archives

Ajouter les montages dans /etc/fstab pour les montages automatiques

Pour que ces volumes soient montés automatiquement au démarrage, il faut créer les entrées dans ton fichier /etc/fstab` :

/dev/VG_DATAS/LV_HOME      /mnt/home       ext4    defaults 0 0
/dev/VG_DATAS/LV_DOCUMENTS /mnt/documents ext4 defaults 0 0
/dev/VG_BACKUP/LV_ARCHIVES /mnt/archives ext4 defaults 0 0

Recharger la configuration avec systemctl daemon-reload :

# systemctl daemon-reload

Vérification de l’espace libre et des volumes

Vérification de la configuration :

# vgdisplay
# lvdisplay
# df -h

Vérification (les tailles ne correspondent pas ici, beaucoup de tests entre temps) :

# df -h
Filesystem                                  Size  Used Avail Use% Mounted on
[...]
/dev/mapper/VG_DATAS-LV_HOME 15G 24K 14G 1% /mnt/home
/dev/mapper/VG_BACKUP-LV_ARCHIVES 20G 24K 19G 1% /mnt/archives
/dev/mapper/VG_DATAS-LV_DOCUMENTS 15G 24K 14G 1% /mnt/documents

VG Display :

# vgdisplay
--- Volume group ---
VG Name VG_BACKUP
System ID
Format lvm2
Metadata Areas 6
Metadata Sequence No 3
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 2
Open LV 1
Max PV 0
Cur PV 6
Act PV 6
VG Size <28.98 GiB
PE Size 4.00 MiB
Total PE 7418
Alloc PE / Size 5123 / 20.01 GiB
Free PE / Size 2295 / 8.96 GiB
VG UUID cb1EAU-8Svl-eLKE-fv4V-iDuF-LDUL-QuptQD

--- Volume group ---
VG Name VG_DATAS
System ID
Format lvm2
Metadata Areas 6
Metadata Sequence No 10
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 5
Open LV 2
Max PV 0
Cur PV 6
Act PV 6
VG Size <43.98 GiB
PE Size 4.00 MiB
Total PE 11258
Alloc PE / Size 8706 / <34.01 GiB
Free PE / Size 2552 / <9.97 GiB
VG UUID U5jqWC-IPiq-XXU8-J55R-nGS9-hqRU-MiXKSU

LV Display :

# lvdisplay
--- Logical volume ---
LV Path /dev/VG_BACKUP/LV_ARCHIVES
LV Name LV_ARCHIVES
VG Name VG_BACKUP
LV UUID kAd6FG-4XHp-ytei-h0Em-nED2-7swB-XW4f0x
LV Write Access read/write
LV Creation host, time Redhat1-Test3, 2024-10-12 17:41:40 +0200
LV Status available
# open 1
LV Size 20.00 GiB
Current LE 5120
Segments 4
Allocation inherit
Read ahead sectors auto
- currently set to 256
Block device 253:8

--- Logical volume ---
LV Path /dev/VG_DATAS/LV_HOME
LV Name LV_HOME
VG Name VG_DATAS
LV UUID unuv2F-6HjI-3dxV-UmH1-IRnC-kVup-0JfHNi
LV Write Access read/write
LV Creation host, time Redhat1-Test3, 2024-10-12 17:40:29 +0200
LV Status available
# open 1
LV Size 15.00 GiB
Current LE 3840
Segments 3
Allocation inherit
Read ahead sectors auto
- currently set to 256
Block device 253:6

--- Logical volume ---
LV Path /dev/VG_DATAS/LV_DOCUMENTS
LV Name LV_DOCUMENTS
VG Name VG_DATAS
LV UUID gawiNW-hPF7-iQPd-bzfj-eJCx-tsgD-zWdSFr
LV Write Access read/write
LV Creation host, time Redhat1-Test3, 2024-10-12 17:40:53 +0200
LV Status available
# open 1
LV Size 15.00 GiB
Current LE 3840
Segments 2
Allocation inherit
Read ahead sectors auto
- currently set to 256
Block device 253:7

--- Logical volume ---
LV Path /dev/VG_DATAS/LV_TRASH
LV Name LV_TRASH
VG Name VG_DATAS
LV UUID nxmUKn-GMAM-hBb9-IiN4-x112-0fju-mFvq5f
LV Write Access read/write
LV Creation host, time Redhat1-Test3, 2024-10-13 12:37:25 +0200
LV Status available
# open 0
LV Size 1.00 GiB
Current LE 256
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 256
Block device 253:9

Documentation

Internet
MAN
ChatGPT

Remerciement

xakz

Merci à xakz pour le complément d'informations :)


> Partager <