Gestion par volumes logiques
La gestion par volumes logiques (en anglais, logical volume management ou LVM) est à la fois une méthode et un logiciel de gestion de l'utilisation des espaces de stockage d'un ordinateur. Il permet de gérer, sécuriser et optimiser de manière souple les espaces de stockage en ligne dans les systèmes d'exploitation de type UNIX.
On parle également de gestionnaire de volumes ou volume manager en anglais.
Concepts
modifierVolumes physiques PV
modifierLes disques durs, partitions de disques durs, volumes RAID ou unités logiques provenant d'un SAN forment des « volumes physiques » (physical volumes ou PV).
Groupes de volumes VG
modifierOn concatène ces volumes physiques dans des « groupes de volumes » (volume groups ou VG).
Ces VG sont équivalents à des pseudo-disques-durs.
Volumes logiques LV
modifierDes « volumes logiques » (logical volumes ou LV) sont alors découpés dans les groupes de volumes, puis formatés et montés dans des systèmes de fichiers ou utilisés en tant que raw devices.
Les LV sont équivalents à des pseudo-partitions.
Volumes agrégés par bandes (striping)
modifierLes volumes logiques peuvent être « stripés » sur un ensemble de volumes physiques, à l'instar du RAID 0.
Cette technique est utilisée pour améliorer les performances, mais rend plus vulnérable à une panne disque.
Miroir (mirroring)
modifierLes volumes logiques peuvent être également mirrorés, à l'instar du RAID 1.
Cette technique permet de se protéger contre une panne sur un disque dur.
Extensions
modifierLes extensions sont les plus petites unités de stockage LVM, la taille des extensions est la même pour chaque volume logique d'un même groupe de volume. Les extensions non utilisées peuvent servir à augmenter la taille d'un groupe de volumes.
Il existe deux types d'extensions :
- les extensions physiques ou PE (Physical Extents)
- les extensions logiques ou LE (Logical Extent)
Instantanés (snapshots)
modifierLes snapshots sont des volumes logiques permettant d'effectuer une sauvegarde cohérente d'un autre volume logique du même groupe de volumes.
La création d'un snapshot consiste à prendre une « photo », un instantané du volume logique cible (ce qui est quasi immédiat) et on commence alors à enregistrer les modifications apportées au volume logique cible.
- Avantage des snapshots
- Ils peuvent être utilisés comme une méthode de sauvegarde. Ils permettent de stocker une image statique d'un volume logique à un instant précis. On peut ensuite effectuer une sauvegarde sur cartouche du snapshot, qui contiendra les données présentes sur le volume cible au moment de la création du snapshot.
- Limite des snapshots
- Ils ne sont pas une sauvegarde complète d'un volume logique, ils enregistrent uniquement les modifications apportées au volume cible, ils ne contiennent pas les données de celui-ci ; de plus ils ne sont pas persistants, c’est-à-dire qu'ils disparaissent en cas de redémarrage de la machine. [À corriger ou effacer, car vrai pour certains gestionnaires de volumes, mais faux pour celui généralement utilisé sous Linux.]
- Taille des snapshots
- Une idée très répandue veut que la taille d'un snapshot doit être égale à environ 15-20 % de la taille du volume logique cible. Ces approximations sont totalement infondées, la taille nécessaire à un snapshot dépendant de l'activité en écriture sur le volume logique cible pendant la durée de vie de ce snapshot. La suppression de toutes les données sur le volume logique cible demandera par exemple un snapshot d'une taille au moins égale à la taille du volume logique cible. La taille d'un snapshot doit donc être calculée suivant l'estimation du volume de données écrit sur le lecteur cible pendant la durée de votre sauvegarde. Dans la plupart des cas cela nécessitera bien moins de 15 %. En outre, un facteur très important dans le calcul de l'espace disponible pour le snapshot est la quantité d'opération d'écriture par seconde. Un effacement complet du volume logique attaché nécessitera effectivement 100% d'espace disponible mais pourrait durer plusieurs jours alors que l'utilisation d'un snapshot pour externaliser un backup pendant que le volume principal continue d'être utilisé risque de remplir très rapidement l'espace disponible.
Il est également possible de créer des snapshot dit thin-provisionné pour lesquels la taille disponible n'est pas spécifiée préalablement. Elle permet notamment de prendre autant d'espace que nécessaire pendant que le volume groupe lui-même est étendu pour faire face aux besoins d'espace.
Partitions et systèmes de fichiers
modifierLes partitions et systèmes de fichiers (filesystems) ne font pas partie de LVM.
Une partition peut être utilisée en volume physique, un système de fichiers doit être installé sur un volume logique pour pouvoir être monté et utilisé.
Agrandissement et réductions
modifierIl est possible d'ajouter des volumes physiques à chaud dans des groupes de volumes, mais un volume physique doit être inutilisé (aucune donnée) pour être retiré d'un groupe de volumes.
Il est possible d'agrandir ou réduire des volumes logiques, mais les systèmes de fichiers installés dessus doivent prendre en charge cette opération. De nombreux systèmes de fichiers prennent en charge l'agrandissement et la réduction à chaud, à défaut il doit être démonté (donc interruption de service) pour subir cette opération.
Fonctionnalités
modifierLes disques durs peuvent être locaux (branchés dans le serveur) ou distants, sur un SAN (Storage Area Network) ou un DAS (Direct Attach Storage) sous forme d'unités logiques (auxquelles on a associé des LUN, Logical Unit Number).
L'intérêt du LVM est que l'on peut modifier la taille des volumes logiques sans perte de données (voire à chaud dans le cas d'un agrandissement sur JFS2, ext2, ext3, ext4 et reiserFS). Le démontage préalable est tout de même recommandé pour ext2 et ext3.
Pour JFS2 et reiserFS, le rétrécissement est aussi possible à chaud.
Exemples
modifierLes logiciels libres LVM1, LVM2 et EVMS (en) sous Linux sont des exemples de Volume Managers, comme les logiciels propriétaires LVM d'IBM, de HP-UX ou Veritas Enterprise (VxVM) sous HP-UX et Solaris.
LVM2
modifierLes commandes usuelles de LVM2
modifierAvant d'utiliser LVM, il faut partitionner les disques (voir Outils de partitionnement) en type LVM.
Ensuite,
- Pour les volumes physiques :
pvcreate
,pvresize
,pvscan
,pvs
,pvdisplay
,pvremove
,pvmove
,pvchange
- Pour les groupes de volume :
vgcreate
,vgdisplay
,vgscan
,vgs
,vgck
,vgremove
- Pour les volumes logiques :
lvcreate
,lvmdiskscan
,lvs
,lvdisplay
,lvremove
,lvextend
- Pour la sauvegarde/restauration de la structure LVM :
vgcfgbackup
,vgcfgrestore
Exemples concrets d'utilisation
modifierChangement d'un disque défectueux
modifierVotre serveur sous Linux contient deux disques durs qui partagent un volume groupe commun appelé ici henryvg (LVM) : l'un, nommé A, de 40 Go natif avec l'achat du PC, l'autre, B, de 80 Go acheté à la suite d'un besoin de place. En achetant ce nouveau disque, vous avez créé au moins une grande partition de type « 8e - Gestion par volumes logiques » ; soit /dev/hdb6 son nom. Tout comme la partition /dev/hda6 du disque A, cette partition hdb6 avait été incorporée (au moment de l'achat du second disque) au volume groupe henryvg.
L'un des deux disques donne des signes de défaillance et une commande fsck
a créé, à répétition, un fichier lost+found sur un ou plusieurs volumes logiques. Un de vos disques est donc défaillant ; le noyau doit avoir signalé dans un fichier warnings (par exemple sous /var/log/kernel) de quel disque, hda ou hdb, il s'agit. Supposons qu'il s'agisse du disque B qu'on doit remplacer par un disque d'une taille au moins égale, nommé C.
L'intérêt d'une « gestion par volumes logiques » réside dans le fait que les temps de déconnexion du serveur peuvent être minimes. La procédure suivante peut être appliquée :
- faire une sauvegarde des partitions de votre serveur (si vous avez une coupure de courant au cours de l'opération, vous risquez d'être embarrassé) ;
- éteindre votre PC, puis ajouter le nouveau et troisième disque C, par exemple sur la nappe du DVD ;
- allumer de nouveau votre serveur (il sera de nouveau opérationnel tout au long de l'opération), puis créer une ou plusieurs partitions sur /dev/hdc sous une forme analogue à celles du disque défectueux /dev/hdb. Soit /dev/hdc6 la grande partition de type 8e - LVM. Les commandes de lvm2 sous root sont alors les suivantes (beaucoup de distributions actuelles ont renommé lvm2 en lvm), la séquence et les paramètres restant identiques) :
lvm2 pvcreate /dev/hdc6
# de manière à créer un descripteur de groupe de volume en tête de la partition /dev/hdc6 ;lvm2 vgextend henryvg /dev/hdc6
# de manière à incorporer la partition physique hdc6 au groupe de volume henryvg ;lvm2 pvmove /dev/hdb6 /dev/hdc6
# de manière à déplacer le contenu du « disque physique » B (et dans tous les volumes logiques créés sur votre serveur comme /usr, /var, /home etc.) sur les autres disques A et C. Cette étape peut être longue en fonction de la taille du disque, 45 minutes pour 40 Go par exemple ;lvm2 vgreduce henryvg /dev/hdb6
# de manière à ôter le disque B de la gestion LVM (henryvg). L'option --removemissing n'est à utiliser que dans le cas où on aurait retiré la partition /dev/hda6. Dans ce cas il ne faut pas mentionner /dev/hda6 sur la ligne de commande;lvm2 pvremove /dev/hdb6
# de manière à retirer /dev/hdb6 de la structure de henryvg (sinon il restera disponible) ;- le disque B peut alors être enlevé lors d'un prochain redémarrage. Le disque C sera alors mis en place du disque défectueux B (même endroit sur la nappe par exemple, même paramétrage) avant de rallumer le PC. En effet, l'ensemble de la configuration ayant été transféré à C, le serveur fonctionnera à l'identique sans aucune autre intervention ;
- il conviendra néanmoins de restaurer les fichiers qui avaient été endommagés par le disque défectueux et qui se trouvent sous le répertoire lost+found de chacun des volumes logiques (partitions dans l'ancien jargon).
Augmentation de la taille d'un système de fichier à chaud
modifierAvec les derniers noyaux de Linux (2.6.22 au moins), il est possible d'augmenter à chaud la taille d'un système de fichier, sans même le démonter (du moins pour certains systèmes de fichier). Soit ainsi un volume logique de nom /dev/henryvg/homelv
monté sur /home
. La commande df
(disk free) vous donne sa taille actuelle :
df -BG /home
Sys. de fich. Tail. Occ. Disp. %Occ. Monté sur
/dev/mapper/henryvg-homelv
25G 20G 3,7G 85% /home
Notez qu'il est fréquent sur certains systèmes qu'un mapper réalloue /dev/henryvg/homelv en /dev/mapper/henryvg-homelv, mais il s'agit des mêmes noms. On souhaite augmenter le système de fichier de 25 Go à 30 Go. On vérifie la place disponible sur les disques (dans cet exemple, il y a deux disques physiques 'PV', mais un seul groupe volume 'VG') par l'une des deux commandes complémentaires:
# lvm2 pvs
PV VG Fmt Attr PSize PFree
/dev/sda6 henryvg lvm2 a-- 70,47g 41,63g
/dev/sdb6 henryvg lvm2 a-- 70,47g 15,89g
# lvm2 vgs
VG #PV #LV #SN Attr VSize VFree
henryvg 2 9 0 wz--n- 140,95g 57,52g
Il faut d'abord augmenter la taille du volume logique (LV) par la commande :
lvm2 lvextend -L30G /dev/henryvg/homelv
Et dans un deuxième temps augmenter la taille du système de fichier lui-même. S'il s'agit d'un système de fichier ext3 ou ext4, la commande est :
resize2fs -p /dev/henryvg/homelv
et s'il s'agit d'un système de fichier XFS, la partition doit être montée (ici sur /home) et la commande est :
xfs_growfs /home
La taille s'ajustera automatiquement à celle du volume logique.
Rappelons qu'on peut connaitre le système de fichier utilisé et où il est monté en regardant le fichier de configuration /etc/fstab
(ou /etc/mtab
) par une commande du genre :
grep homelv /etc/fstab
/dev/mapper/henryvg-homelv /home xfs defaults 0 0
Dans cet exemple, il s'agit d'un système de fichier XFS monté sur /home.
Réduction d'une partition
modifierIl faut tout d'abord réduire la taille du système de fichiers avant celle du volume logique.
En fonction du système de fichiers, il faudra éventuellement démonter ce système de fichier (Ext3). Cela n'est parfois pas possible car il est occupé par des processus (cas du /, /usr). En général, il est plus rapide d'utiliser un disque de démarrage Linux comme Knoppix ou un Mandriva (il faut dans ce dernier cas aller jusqu'à l'étape d'une nouvelle installation et demander un partitionnement manuel) qui charge les modules lvm. Une fois ce système de fichier démonté et pour réduire un volume logique /dev/henryvg/homelv
de 30 Go à 25 Go, il faut appliquer la commande :
resize2fs -p /dev/henryvg/homelv 25G
Il faut désactiver avant réduction (évite les pertes de données):
lvchange -an /dev/henryvg/homelv
Puis il faut réduire le volume logique par la commande (notez qu'il faut spécifier la taille) :
lvm2 lvreduce -L25G /dev/henryvg/homelv
Et activer :
lvchange -ay /dev/henryvg/homelv
Si tout se passe bien, on peut alors monter la partition par la commande :
mount -t ext3 /dev/henryvg/homelv /home
Bien évidemment, par précaution il faut avoir des sauvegardes de vos données avant de se lancer dans ce genre d'opération. A titre de précaution, il peut parfois s'avérer pratique de réduire le filesystem de façon plus importante (p. ex. 24G à la place de 25G), réduire la taille du volume logique et ensuite ré-étendre le filesystem à la taille exacte du nouveau volume logique et ce afin d'éviter des incohérences d'espaces entre le filesysteme et le volume logique.
Extension d'un volume logique sur un autre disque à chaud
modifierPrenons l'exemple où vous venez d'installer de manière quasi automatique un système Linux sur une station de travail initialement sous Windows. Vous avez donc déjà libéré, depuis Windows, de la place pour cette installation. Puis, en démarrant depuis une clé USB, l'installateur Linux vous propose d'utiliser une gestion par volume logique (lvm) pour créer deux volumes logiques /
pour le système et un second /home
pour vos données personnelles. Ne souhaitant pas utiliser toute la place libérée pour bénéficier de la souplesse de lvm, vous vous limitez par exemple à 691Gb au lieu des 1098Gb libérés sous Windows pour votre installation linux. Une fois que vous avez redémarré sous Linux, et n'ayant pas vraiment bien compris l'avertissement pourtant donné par l'installateur Linux, vous réalisez que vous ne pouvez plus créer de nouveaux volumes logiques car la partition automatique créée est entièrement utilisée par les volumes logiques /
et /home
. Pour réduire /home
, il faudrait pouvoir la démonter mais comment s'en sortir à chaud ?
Une solution consiste à utiliser la place libre du disque en un groupe physique pv
, de l'intégrer à votre groupe de volume logique existant et ainsi de disposer de place pour créer de nouveaux volumes logiques.
La commande parted -l
vous indique que votre disque a une table de partition de type gpt
(et non mbr
) qui vous permet de créer de nombreuses partitions physiques et non plus être limité à 4, et que dans l'exemple retenu, la 6e et dernière partition de type lvm
s'étend de 211GB à 902GB. C'est sur cette partition que sont /
et /home
.
# parted -l
Modèle : KINGSTON SNV2S2000G (nvme)
Disque /dev/nvme0n1 : 2000GB
Taille des secteurs (logiques/physiques) : 512B/512B
Table de partitions : gpt
Drapeaux de disque :
Numéro Début Fin Taille Système de fichiers Nom Drapeaux
1 1049kB 106MB 105MB fat32 EFI System Partition démarrage, esp
2 106MB 123MB 16,8MB Microsoft reserved partition msftres
3 123MB 210GB 210GB ntfs Basic data partition msftdata
5 210GB 211GB 1074MB ext4
6 211GB 902GB 691GB lvm
4 2000GB 2000GB 633MB ntfs caché, diag
Pour être certain de créer la nouvelle partition sur le bon disque, on le spécifie dans la commande parted, puis on crée par mkpart
une partition physique, sans nom ni système de fichier en utilisant une chaine vide "", le point de départ de la nouvelle partition, et 100% si on souhaite l'étendre sur toute la place libre:
parted /dev/nvme0n1
(parted) mkpart "" 902Gb 100%
la sous commande print
vous indique alors qu'une 7e partition est créée:
(parted) print
Modèle : KINGSTON SNV2S2000G (nvme)
Disque /dev/nvme0n1 : 2000GB
Taille des secteurs (logiques/physiques) : 512B/512B
Table de partitions : gpt
Drapeaux de disque :
Numéro Début Fin Taille Système de fichiers Nom Drapeaux
1 1049kB 106MB 105MB fat32 EFI System Partition démarrage, esp
2 106MB 123MB 16,8MB Microsoft reserved partition msftres
3 123MB 210GB 210GB ntfs Basic data partition msftdata
5 210GB 211GB 1074MB ext4
6 211GB 902GB 691GB lvm
7 902GB 2000GB 1098GB
4 2000GB 2000GB 633MB ntfs caché, diag
On peut alors créer un volume physique de type lvm
par la commande pvcreate
:
# lvm pvcreate /dev/nvme0n1p7
Physical volume "/dev/nvme0n1p7" successfully created.
mais il n'est pas encore intégré à l'ancien volume group "fedora_localhost-live":
# lvm pvs
PV VG Fmt Attr PSize PFree
/dev/nvme0n1p6 fedora_localhost-live lvm2 a-- 643,44g 4,00m
/dev/nvme0n1p7 lvm2 --- <1022,51g <1022,51g
# lvm vgs
VG #PV #LV #SN Attr VSize VFree
fedora_localhost-live 1 2 0 wz--n- 643,44g 4,00m
Pour ce faire, on utilise la commande vgextend
:
# lvm vgextend fedora_localhost-live /dev/nvme0n1p7
Volume group "fedora_localhost-live" successfully extended
[root@fedora /]# lvm pvs
PV VG Fmt Attr PSize PFree
/dev/nvme0n1p6 fedora_localhost-live lvm2 a-- 643,44g 4,00m
/dev/nvme0n1p7 fedora_localhost-live lvm2 a-- 1022,50g 1022,50g
La commande
# lvm vgs
VG #PV #LV #SN Attr VSize VFree
fedora_localhost-live 2 3 0 wz--n- <1,63t <799,55g
montre qu'en effet le groupe de volume intitulé fedora_localhost-live a augmenté de 643,44g à 1,63t. Il vous est alors possible de créer de nouveaux volumes logiques, comme /home/mapomme/Movies
pour vos films, /home/mapomme/Mail
pour vos courriers ou /var/log/httpd
si vous avez un serveur web très utilisé, ou encore /opt
pour les logiciels non natifs de votre distribution, bref pour tous les répertoires dont la taille peut croitre fortement: vous serez alors averti de leur dépassement de capacité avant que l'ensemble du système ne se bloque et pourrez augmenter leur taille de manière contrôlée.
Groupe physique plein
modifierSi le disque physique de 640 Go /dev/nvme0n1p6
est presque plein et qu'il reste 800Go sur le disque physique /dev/nvme0n1p7
, on peut dans un premier temps déplacer tout ce qui est dans ce disque physique plein /dev/nvme0n1p6
vers un disque physique /dev/nvme0n1p7
par pvmove (ce qui prend un peu de temps), puis ôter le volume groupe qui était commun aux deux disques physiques par vgreduce
.
lvm> vgs
VG #PV #LV #SN Attr VSize VFree
fedora_localhost-live 2 12 0 wz--n- <1,63t <799,55g
lvm> pvscan
PV /dev/nvme0n1p6 VG fedora_localhost-live lvm2 [643,44 GiB / 4,00 MiB free]
PV /dev/nvme0n1p7 VG fedora_localhost-live lvm2 [1022,50 GiB / 799,54 GiB free]
Total: 2 [<1,63 TiB] / in use: 2 [<1,63 TiB] / in no VG: 0 [0 ]
lvm> pvs
PV VG Fmt Attr PSize PFree
/dev/nvme0n1p6 fedora_localhost-live lvm2 a-- 643,44g 4,00m
/dev/nvme0n1p7 fedora_localhost-live lvm2 a-- 1022,50g 799,54g
lvm> pvmove /dev/nvme0n1p6 /dev/nvme0n1p7
/dev/nvme0n1p6: Moved: 0,02%
/dev/nvme0n1p6: Moved: 2,04%
...
/dev/nvme0n1p6: Moved: 98,36%
/dev/nvme0n1p6: Moved: 99,16%
/dev/nvme0n1p6: Moved: 99,96%
lvm> pvs
PV VG Fmt Attr PSize PFree
/dev/nvme0n1p6 fedora_localhost-live lvm2 a-- 643,44g 643,44g
/dev/nvme0n1p7 fedora_localhost-live lvm2 a-- 1022,50g <156,11g
lvm> vgreduce fedora_localhost-live /dev/nvme0n1p6
Removed "/dev/nvme0n1p6" from volume group "fedora_localhost-live"
lvm> vgs
VG #PV #LV #SN Attr VSize VFree
fedora_localhost-live 1 12 0 wz--n- 1022,50g <156,11g
lvm> pvs
PV VG Fmt Attr PSize PFree
/dev/nvme0n1p6 lvm2 --- 643,44g 643,44g
/dev/nvme0n1p7 fedora_localhost-live lvm2 a-- 1022,50g <156,11g
On pourrait supprimer complètement le disque physique par
lvm> pvremove /dev/nvme0n1p6
Fichiers de configuration
modifier- lvmtab (créé initialement par la commande vgscan).
- lvm.conf
Divers
modifierL'identificateur d'une partition utilisée comme volume physique est 0x8E (hexadécimal) sous Linux et certains systèmes UNIX.