Comment gérer son espace mémoire avec LVM (Logical Volume Manager) ?
Nous allons ici voir comment gérer son espace mémoire dynamiquement en le partitionnant avec des Volumes Logiques (LV).
Les exemples de cet article viennent de l'installation d'un serveur de fichiers et plus particulièrement de cette page. Nous allons montrer comment gérer un espace mémoire (ici un RAID 5 de 2To, mais cela vaut pour n'importe quel autre espace disque) avec LVM.
1 - Mais quel est l'intérêt de LVM (Logical Volume Manager) ?
La question mérite d'être posée car à première vue, il y a peu d'intérêt à ajouter une surcouche de gestion avec la crainte d'avoir un risque supplémentaire de perdre ses données lors de manipulations hasardeuses. D'autant plus que l'apport de ce système de gestion n'est pas apparent au premier abord si ce n'est pour les gros systèmes avec de nombreux disques durs.
C'est certainement pour ces raisons que peu de particuliers la mettent en œuvre. Pourtant, les solutions d'entreprise (comme Red Hat Enterprise Linux) l'intègrent par défaut et sont utiles même pour des petits systèmes. Pour illustrer l'intérêt de ce système de gestion très perfectionné des supports de stockage, je vais prendre un exemple qui rappellera certainement des souvenirs à ceux qui ont un peu de vécu Linux.
Vous avez installé votre Linux sur votre ordinateur, et comme c'était votre première installation, vous avez défini vos partitions 'au petit bonheur la chance'. Les mois passent, et Linux est devenu votre compagnon indispensable pour réaliser vos documents, surfer sur Internet, stocker vos photos, films de vos vacances, etc.. Bref, votre partition /home devient trop juste. Quelle solution s'offre à vous ?
- soit vous envisagez de rééquilibrer avec une autre partition sous-utilisée
- soit vous ajoutez un disque dur
Dans ces 2 cas, au mieux, vous allez devoir démonter les partitions pour les recréer aux bonnes dimensions, et remettre vos données dessus car bien sûr dans ces manip vos données auront été effacées.
Avec LVM installé dès le départ c'est beaucoup plus simple, car il vous est possible de redimensionner "à chaud" vos volumes. Bon soyons honnêtes, l'augmentation de volume est plus facile que la diminution. Mais avouez que des partitions initiales réduites au strict minimum et que vous augmentez au fur à mesure de vos besoins, c'est plutôt sympa, non ?
Bon, concrètement voici comment cela se passe ...
2 - Le paquetage logiciel nécessaire (lvm2)
Les volumes logiques se gère à l'aide du paquetage lvm2. Il nous faut donc l'installer si ce n'est pas déjà fait.
L'installation via l'interface graphique est le plus simple, mais
lorsqu'on sait exactement ce que l'on doit installer, la ligne de
commande (en administrateur) est toute aussi simple. Ici, il s'agit de
la commande sous Mandriva, vous l'adapterez selon votre distribution
(apt-get pour Debian, emerge pour Gentoo, etc.) :
# urpmi lvm2
3 - Créer un Groupe de Volume (VG)
Oui, il est possible de créer un VG sur un RAID, la preuve nous allons le faire !
Si vous avez joué avec les LV lors de l'installation, ce qui suit n'a plus de secret pour vous.
On commence donc par créer une partition sur notre RAID que l'on 'type' en 'Linux LV' code hexa 8E. Pour cela, on lance fdisk sur notre RAID md127 (pour le créer voir cette page) :
# fdisk /dev/md127 Le périphérique ne contient pas une table de partitions DOS ou Sun, SGI, OSF valide Création d'une nouvelle étiquette DOS avec id de disque 0x2c0e51a5. Les modifications restent en mémoire jusqu'à ce que vous les écriviez. Après quoi, bien sûr, le contenu précédent sera irrécupérable. Le nombre de cylindres pour ce disque est fixé à 488379968. Il n'y a rien d''incorrect avec cela, mais c'est plus grand que 1024, et cela pourrait causer des problèmes pour certaines installations: 1) logiciels qui sont exécutés à l'amorçage (i.e., vieilles versions de LILO) 2) logiciels d'amorçage et de partitionnement pour d'autres OS (i.e., DOS FDISK, OS/2 FDISK) AVERTISSEMENT: fanion 0x0000 non valide dans la table de partitions 4, sera corrigé par w(écriture) Commande (m pour l'aide) : n Commande d'action e étendue p partition primaire (1-4) p Numéro de partition (1-4): 1 Premier cylindre (1-488379968, par défaut 1): Utilisation de la valeur par défaut 1 Dernier cylindre, +cylindres or +taille{K,M,G} (1-488379968, par défaut 488379968): Utilisation de la valeur par défaut 488379968 Commande (m pour l'aide) : t Partition sélectionnée 1 Code Hexa (taper L pour lister les codes): 8e Type système de partition modifié de 1 à 8e (Linux LVM) Commande (m pour l'aide) : w La table de partition a été altérée ! Appel de ioctl() pour relire la table de partitions. Synchronisation des disques
Ne vous inquiétez pas des avertissements initiaux, ils ne nous concernent pas ici.
Voilà, vous avez maintenant un /dev/md127p1, restent la création du PV (Volume Physique) puis du VG (Volume Groupe) proprement dit, en n'oubliant pas (pour le nom) qu'il y a déjà un vg01 sur le disque qui accueille le système d'exploitation :
# pvcreate /dev/md127p1 Physical volume "/dev/md127p1" successfully created # vgcreate vg_user_data /dev/md127p1 Volume group "vg_user_data" successfully created
A ce stade, vous avez la possibilité de voir les propriétés de votre PV et VG, avec respectivement les commandes pvdisplay et vgdisplay.
4 - Créer les Volumes Logiques (LV)
Nous pouvons maintenant créer nos LV aux dimensions voulues.
Le process de création d'un LV est le même pour tous, je ne vous montre que pour le volume lv_archives de 200Go :
# lvcreate -n lv_archives -L 200Go vg_user_data Logical volume "lv_archives" created
Vous aurez compris que l'option -n permet de définir le nom (sinon il est créé par le système) et que l'option -L permet de spécifier sa taille en Mo, Go, To ou Po. Enfin il faut préciser dans quel volume de groupe on veut le construire, ici vg_user_data.
Voilà, votre Volume Logique (LV) est créé et on peut l'utiliser comme une simple partition, c.a.d qu'on peut le "formater" :
# mkfs -t ext4 /dev/vg_user_data/lv_archives ....
et le monter :
# mount /dev/vg_user_data/lv_archives /mnt/archives
N'oubliez pas avant le 'mount' de créer le répertoire /mnt/archives si ce n'est déjà fait :
# mkdir /mnt/archives
Comme toute partition, on peut voir son taux d'occupation avec :
# df -h /mnt/archives
5 - Quelques commandes d'administration
5.1 - pvdisplay, vgdisplay et lvdisplay
Comme leurs noms le suggèrent, ces commandes permettent d'afficher les propriétés des PV, VG et LV. Les 3 peuvent être utilisées tel quel ou avec comme argument le nom, respectivement, du PV (ex /dev/sda3), du VG (ex /dev/vg01), du LV (ex /dev/vg01/lv_archives). Les options les plus intéressantes sont :
- pour vgdisplay : -v pour verbeux ce qui donne notamment la liste des PV qui composent le VG.
- pour lvdisplay : -m vous donne les segments qu'utilise le LV au sein du (ou des) PV . Voici un exemple sans option et le même exemple avec l'option -m
5.2 - vgextend
Là aussi on se doute : vgextend permet d'étendre un Groupe de Volumes (VG). Et c'est la première commande qui donne tout l'intérêt du LVM, à savoir la gestion dynamique de l'espace mémoire.
Supposons que vous ayez un vg01 qui commence à être saturé. Vous avez ajouté un disque dur de 100Go (sur /dev/sdc1 par exemple) de type 8E, que vous souhaitez ajouté à vg01, et bien la commande vgextend est fait pour cela, de plus elle fonctionne comme vgcreate :
#pvcreate /dev/sdc1 Physical volume "/dev/sdc1" successfully created #vgextend vg01 /dev/sdc1 Volume group "vg01" successfully extended
La commande "vgdisplay vg01" vous montera que vg01 possède maintenant un PV supplémentaire.
Et vous pouvez maintenant créer des Volumes Logiques sur ce VG agrandi.
Nota : En principe LVM cherchera à optimiser l'allocation des PE afin qu'ils soient les plus contigus possibles et si possible sur le même PV, mais il est possible que votre LV soit "assis" sur 2 disques différents.
5.3 - lvextend et resize2fs
Nous avons vu comment agrandir un VG, maintenant nous allons voir comment agrandir un LV existant avec successivement :
- lvextend pour agrandir le LV
- resize2fs pour agrandir le système de fichier.
Voici la situation de départ :
Et la commande lvextend :
Quelques précisions :
- le paramètre -L (ou -l pour le nombre de PE) sont les mêmes que pour lvcreate
- le + indique un ajout, sans le + il faut indiquer la taille que l'on souhaite
Agrandissement du système de fichier (fs)
Nous avons agrandi le LV, mais le système de fichier n'a pas suivi. Pour vous en convaincre lancez un "df -h /mnt/user1".
Pour cela il nous faut utiliser la commande resize2fs :
A noter :
- normalement il n'y a pas besoin d'options : le type de fichier sera reconnu et la taille du LV pris en compte
- l'agrandissement se fait sans démonter le fs (par contre nous y serons contraints pour le réduire)
Nous pouvons vérifier le nouveau dimensionnement de notre LV :
Les plus curieux pourront également aller voir ce que donne un lvdisplay -m
5.4 - lvreduce avec fsck et resize2fs
Après l'agrandissement, voici le temps de réduire un LV, pour cela il faudra lancer successivement :
- fsck pour vérifier le système de fichier (fs) à réduire
- resize2fs pour réduire le fs
- lvreduce pour réduire le LV
Mais avant toute chose, il nous faut démonter le fs :
# umount /home/user1
Puis lancer fsck :
Redimensionner le système de fichiers à 5Go avec resize2fs :
Par curiosité et pour se rassurer, on peut vérifier la nouvelle taille du système de fichiers avec dumpe2fs :
Vous constatez que 1310720*4096 est bien égal à 5Go soit 5*(1024)*(1024)*(1024)
Et enfin réduire le LV, avec lvreduce dont la syntaxe est la même que lvextend. Ici il s'agit de ne pas se tromper car le risque de perte de données est alors réel.
Et voilà il nous reste plus qu'à remonter le système de fichier et constater que notre LV est bien redimensionné.
Les curieux pourront aussi voir ce que donne un lvdisplay -m
5.4 - Liste d'autres commandes
- pvmove commande courante en entreprise car elle permet de libérer un PV (pour changer un disque dur par ex) en déplaçant son contenu sur un autre. Attention : les PV doivent appartenir au même VG. Exemple : pvmove -v /dev/sdb1 /dev/sdc1
- vgreduce permet de supprimer un PV d'un VG. Bien sûr il faut que le PV soit libre (avec pvmove). Exemple vgreduce vg01 /dev/sdb1
- vgremove supprime un VG. Mais pour cela, il y a des étapes préalables incontournables : démonter tous les fs des LV (umount); supprimer tous les LV (lvremove); retirer tous les PV (vgreduce -a vg01); et enfin supprimer le VG (vgremove vg01)
- pvremove supprime un PV après bien sûr avoir supprimé le ou les VG. On obtient le même effet avec fdisk
- pvchange modifie l'état d'un PV
- pvresize redimensionne un PV si sa partition ou disque d'origine a été agrandie ou réduite
- pvscan recherche tous les PV présents sur tous les supports de stockage du système
- vgchange modifie les attributs d'un VG, pour l'activer ou le désactiver par exemple. (Cf. son utilisation sur cette FAQ)
- vgscan recherche tous les VG sur tous les supports (Cf. son utilisation sur cette FAQ)
- vgrename renomme un VG
- vgmerge regroupe 2 VG en un seul
- lvresize redimensionne un LV, comme lvextend et lvreduce
- lvchange modifie les attributs d'un LV
- lvrename renomme un LV
6 - Autres liens sur le sujet :
Pour ceux qui en veulent plus, ces liens m'ont été utiles :
- http://www.traduc.org/Guides_pratiques/Suivi/LVM-HOWTO/Document
- http://linuxbsdos.com/2009/11/24/how-to-configure-lvm-on-mandriva-one-2010/
- et pour terminer un livre : "Linux - Maîtrisez l'administration du système" de Sébastien Rohaut aux éditions ENI