LVM : Utilisation des LVM

From Deimos.fr / Bloc Notes Informatique
Jump to: navigation, search

1 Introduction

La gestion par volumes logiques (en anglais, logical volume management ou LVM) est une méthode et un logiciel de découpage, de concaténation et d'utilisation des espaces de stockage d'un serveur. 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/Linux.

On parle également de gestionnaire de volumes ou Volume Manager en anglais.

LVM n'étant pas très simple à utiliser, et ne le maniant pas non plus tous les jours, j'me suis dis qu'une petite doc était indispensable. Je la remplierais au fur et à mesure de mes besoins.

Voici les principaux fichiers et dossiers utilisés par LVM :

File/Folder Description
/etc/lvm/lvm.conf Fichier de configuration d'LVM
/etc/lvm/cache.cache Fichier de cache des noms des devices
/etc/lvm/backup Dossier contenant les backups automatiques des metadata des VG
/etc/lvm/archive Dossier contenant les archives automatiques des metadata des VG
/var/lock/lvm Fichier de lock permettant d'éviter le lancement simultané de plusieurs outils LVM, évitant la corruption de metadata

2 Créer une partition

Lorsque vous utilisez fdisk pour créer une partition et l'assigner en tant qu'LVM, il est possible qu'elle ne s'affiche pas dans les devices. Pour éviter de rebooter afin de la voir, il suffit de lancer cette commande sur le disque en question (sda par exemple) :

Command partx
partx -a /dev/sda

Si ensuite vous avez besoin de l'ajouter dans le fstab, il est préférable d'utiliser les UUID. Pour les repérer, il existe une commande :

Command blkid
$ blkid
blkid/dev/sda1: UUID="fd292b5c-091f-4a2f-b694-7d881e2eaa54" TYPE="ext4" 
/dev/sda2: UUID="a4ljAA-KRHZ-sSHH-E4yy-tKmc-ZsHF-Scrc2N" TYPE="LVM2_member" 
/dev/mapper/vg_redhatsrv1-lv_root: UUID="74706659-f76e-4dd3-8f93-b3629923d356" TYPE="ext4" 
/dev/mapper/vg_redhatsrv1-lv_swap: UUID="c02b0c7b-88b3-4521-820f-a42c27871e35" TYPE="swap" 
/dev/sdb1: UUID="c7b14f0b-1ccd-40f8-8183-7e85cbcb9d64" TYPE="crypto_LUKS"

Il ne vous reste plus qu'a rajouter une ligne de ce type dans le fstab :

Configuration File /etc/fstab
UUID=fd292b5c-091f-4a2f-b694-7d881e2eaa54 /mnt                   ext4    defaults        0 0

3 Utilisation

3.1 Activer une partition LVM

Pour activer une partition LVM, nous allons utiliser pvcreate :

Command pvcreate
pvcreate /dev/sda1

Vous pouvez voir ensuite l'état avec la commande pvdisplay.

3.2 Créer un Volume Group

Nous devons ensuite créer un VG si nous voulons pouvoir créer ensuite des volumes :

Command vgcreate
vgcreate mon_vg /dev/sda1

Vous devez mettre ici le nom du VG que vous souhaitez à la place de 'mon_vg'.

3.3 Créer des volumes

Pour créer les volumes :

Command lvcreate
lvcreate -n mon_lv1 -L 5G mon_vg

Il faut donc :

  • mon_lv1 : le nom du LV souhaité
  • -L 5G : la taille du volume group
  • mon_vg : le nom du VG sur lequel le LV doit être stocké.

3.4 Redimentionnement

3.4.1 Augmentation

Pour augmenter la taille d'une partition :

Command lvextend
lvextend -L +10G /dev/mapper/ma_partition

Puis il ne reste plus qu'à redimensionner le filesystem (xfs_grow par exemple pour le XFS)

3.4.2 Réduction

Diminuer la taille d'un système de fichier est un peu plus délicat. En effet, si jamais on commet l'erreur de diminuer la taille du volume logique avant de réduire la taille du contenu (le système de fichier lui même) alors on détruit son système de fichier... pareil si on réduit trop la taille du volume logique.

Pour éviter tout risque, je conseille d'utiliser la méthode suivante (un peu plus longue que la normale, mais beaucoup plus fiable) :

  • Réduire la taille du système de fichier plus que nécessaire
  • Réduire la taille du volume logique pour lui donner exactement la nouvelle taille souhaitée.
  • Agrandir le système de fichier pour qu'il occupe tout l'espace disponible.

De cette façon, le risque d'erreur est beaucoup plus faible.

3.4.2.1 Reduction du FS

Si vous ne souhaitez pas faire cette opération à la main, utilisez un live CD avec gparted inclu.

Attention, tous les systèmes de fichiers ne peuvent pas être "réduits". Pour ext3 et reiserfs, cela se fait très bien. Voila un exemple avec reiserfs...

Command df
df -h 

Dans cet exemple, le volume "ca", se trouve dans le groupe de volume svg. Sur ce volume logique existe un système de fichier en reiserfs d'une taille de 512 Mo. Or, je n'utilise que 230 Mo. De plus, je sais que je n'ajouterai jamais rien dans ce volume. Je désire donc diminuer sa taille à 256 Mo (pour se laisser une marge de sécurité, et parce que ca fait un compte rond ;) Je commence par démonter le système de fichier :

Command umount
umount /home/ca

Ensuite je vais donc diminuer la taille du système de fichier, plus que nécessaire. Plutôt que de retirer 256 Mo, je vais donc en retirer 258. Je peux le faire, car il reste 283 Mo de libre... Evidement, retirer plus de place qu'il n'en reste serait suicidaire...

Command resize_reiserfs
resize_reiserfs -s -258M /dev/svg/ca

ATTENTION : Si vous êtes en ext3, on ne peut pas indiquer la quantité d'espace à enlever, il faut donner la taille finale voulue (512-258). la bonne commande aurait été :{{

Command resize2fs
resize2fs -p /dev/svg/ca 254M

Il est possible qu'il vous demande de faire cette commande avant. Si c'est le cas, faites le :

Command e2fsck
e2fsck -f /dev/svg/ca

3.4.2.2 Reduction du LV

Dans le cas ou vous ne verriez pas le LV dans /dev/mapper, alors il faudra l'activer :

Command lvchange
lvchange -a y /dev/svg/ca

Note: pour désactiver un LV, il faut change le "y" en "n".

Maintenant que le système de fichier à diminué, il faut donner au volume logique sa nouvelle taille, 256 Mo au lieu de 512 :

Command lvresize
lvresize -L -256M /dev/svg/ca
  WARNING: Reducing active logical volume to 256.00 MB
  THIS MAY DESTROY YOUR DATA (filesystem etc.)
Do you really want to reduce ca? [y/n]: y
  Reducing logical volume ca to 256.00 MB

Plus qu'une derniere étape, on indique au système de fichier qu'il peut s'étendre automatiquement pour prendre tout l'espace disponible. Il devrait donc pouvoir grandir de 2 Mo. Il trouvera tout seul la taille exacte en nombre de bloc etc... On n'a pas pris le risque de faire une erreur en le réduisant "pile poile" de la même taille que le volume logique, car la moindre erreur aurait pu corrompu le système de fichier à quelques blocs prés.

Command resize2fs
resize_reiserfs /dev/svg/ca

ou, si vous utilisez ext3 :

Command resize2fs
resize2fs /dev/svg/ca

Il ne reste plus qu'a remonter le système de fichier :

Command
$ mount /dev/svg/ca /home/ca
$ df -h | grep ca
/dev/mapper/svg-ca    256M  230M   27M  90% /home/ca

C'est gagné... Le système de fichier fait maintenant 256 Mo, et nous avons toujours nos 230 Mo de données à l'intérieur. Conclusion : Jouer avec la taille des volumes logiques fonctionne très bien, il faut juste prendre son temps et ne pas faire n'importe quoi :)

3.5 Récupération des volumes

Si je suis en mode restauration, et je souhaite monter mes filesystems, comment je fais ?

On s'assure que le modules est correctement chargé :

Command modprobe
modprobe dm-mod

On scan tous les LVM :

Command
vgscan
vgchange -ay

Et on monte le LV :

Command
mkdir -p /mnt/VolGroup00/LogVol00
mount /dev/VolGroup00/LogVol00 /mnt/VolGroup00/LogVol00

Une fois terminé, vous pouvez désactiver votre volume :

Command vgchange
vgchange -an VolGroup00

3.6 Exporter/Importer un VG

  • Vous pouvez démonter complètement un volume group comme ceci :
Command vgexport
vgexport <mon_vg>

Cela vous assurera que plus rien n'est monté et actif sur votre machine.

  • Pour le remonter, c'est assez simple :
Command vgimport
vgimport <mon_vg>

Puis activez le vg pour afficher les volumes :

Command vgchange
vgchange -ay <mon_vg>

3.7 Scanner les nouveaux volumes LVM

Vous pouvez vérifier qu'il y a un nouveau volume en scannant les PV :

Command pvscan
pvscan

Les nouveaux voluments s'afficheront alors.

3.8 Changement de disque

Si vous avez un VG avec plusieurs disques dedans. L'un d'entre eux est défectueux et vous avez ajouté son remplaçant dans le VG. Il existe une solution à chaud permettant retirer le disque défectueux du VG sans perte de données :

Command pvmove
pvmove /dev/<mon_disque_defectueux>

Il ne reste plus qu'à retirer le disque.

3.9 Controler la visibilité de ses volumes

Vous pouvez désactiver la visibilité d'un volume comme ceci :

Command lvchange
lvchange -an mon_lv

Vous pouvez activer la visibilité d'un volume de cette façon :

Command lvchange
lvchange -ay mon_lv

Vous pouvez forcer un lv à être accessible qu'en lecture :

Command lvchange
lvchange -pr mon_lv

Ou en écriture :

Command lvchange
lvchange -pw mon_lv

3.10 Snapshot

3.10.1 Création d'un Snapshot

Pour créer un snapshot d'un LV existant :

Command lvcreate
lvcreate -s -n datasnap -L +4G vgdata/lvdata

Ici je viens créer un Snapshot de 4G.

3.10.2 Supprimer le snapshot

Si je suis satisfait des mdoifications effectuées, je souhaites supprimer le snapshot:

Command lvremove
lvremove /dev/vgdata/datasnap

3.10.3 Rollback des modifications

Si je ne suis pas satisfait des modifications et souhaites faire un rollback depuis le snapshot, il va falloir démonter la partition et revert:

Command lvconvert
umount <mountpoint>
lvconvert --merge -v vgdata/datasnap
lvchange -an /dev/vgdata/data
lvchange -ay /dev/vgdata/data
mount /dev/vgdata/data <mountpoint>

L'ancienne partition sera remontée au bon endroit.

3.11 Dumper la configuration

Vous pouvez avoir besoin de dumper la configuration d'LVM. Pour ce faire, lancez ceci :

Command lvm
> lvm dumpconfig
  devices {
  	dir="/dev"
  	scan="/dev"
  	obtain_device_list_from_udev=1
  	preferred_names=["^/dev/mpath/", "^/dev/mapper/mpath", "^/dev/[hs]d"]
  	filter="a/.*/"
  	cache_dir="/etc/lvm/cache"
  	cache_file_prefix=""
  	write_cache_state=1
  	sysfs_scan=1
  	md_component_detection=1
  	md_chunk_alignment=1
  	data_alignment_detection=1
  	data_alignment=0
  	data_alignment_offset_detection=1
  	ignore_suspended_devices=0
  	disable_after_error_count=0
  	require_restorefile_with_uuid=1
  	pv_min_size=2048
  	issue_discards=0
  }
  dmeventd {
  	mirror_library="libdevmapper-event-lvm2mirror.so"
...

3.12 Visualiser les locks

Pour visualiser les locks actuels sur les LVM, utilisez cette commande :

Command lvmdiskscan
> lvmdiskscan
  /dev/ram0  [      16,00 MiB] 
  /dev/root  [       2,81 GiB] 
  /dev/ram1  [      16,00 MiB] 
  /dev/sda1  [     200,00 MiB] 
  /dev/ram2  [      16,00 MiB] 
  /dev/sda2  [    1000,00 MiB] 
  /dev/ram3  [      16,00 MiB] 
  /dev/sda3  [       2,83 GiB] LVM physical volume
  ...
  /dev/ram13 [      16,00 MiB] 
  /dev/ram14 [      16,00 MiB] 
  /dev/ram15 [      16,00 MiB] 
  /dev/sdb   [       4,00 GiB] 
  2 disks
  18 partitions
  0 LVM physical volume whole disks
  1 LVM physical volume

3.13 FSCK à chaud sous ext3/4

Vous en aviez rêver hein ? Il est effectivement possible de faire du fsck à chaud grâce aux snapshots LVM. Voici un petit script qui permet de scanner tous les LV de type ext3 et ext4 et les dégragmenter (Note : Il vous faut 10% d'espace libre par rapport au plus gros LV dans vos VG) :

Configuration File hot_fsck.sh
#!/bin/bash
# Made by deimosfr
# Inspired from https://www.redhat.com/archives/ext3-users/2008-January/msg00032.html
 
EMAIL=deimos@deimos.fr
 
# Get line by line
IFS=$'\n'
 
for line in `lvs --unbuffered -o lv_name,vg_name,lv_size,vg_free --units m --noheadings --nosuffix` ; do
	# Get informations on the device
	VOLUME=`echo $line | awk '{ print $1 }'`
	VG=`echo $line | awk '{ print $2 }'`
	LV_SIZE=`echo $line | awk '{ print $3 }' | sed 's/\..*//g'`
	VG_FREE_SIZE=`echo $line | awk '{ print $4 }' | sed 's/\..*//g'`
	SNAPSIZE=`echo $LV_SIZE | awk '{ printf("%s\n"), int($1*0.1) }'`
 
	# Check if 10% of the LV size is free on the VG
	if [ $SNAPSIZE -lt $VG_FREE_SIZE ] ; then
		# Check if it is ext3 or ext4
		LV_DEV=`echo ${VOLUME} | sed 's/\-/--/'`
		if [ `mount | grep /dev/mapper/${VG}-${LV_DEV} | grep -c "ext[3-4]"` -ge 1 ] ; then
		        echo "Analyzing ${VG}-${VOLUME}"
		        TMPFILE=`mktemp -t e2fsck_${VG}_${VOLUME}.log.XXXXXXXXXX`
		        START=$(date +'%Y%m%d%H%M%S')
 
		        # Create snapshot
		        lvcreate -s -L ${SNAPSIZE} -n "${VOLUME}-snap" "${VG}/${VOLUME}"
		        if nice logsave -as $TMPFILE e2fsck -p -C 0 "/dev/${VG}/${VOLUME}-snap" && nice logsave -as $TMPFILE e2fsck -fy -C 0 "/dev/${VG}/${VOLUME}-snap" ; then
		                # Set to 0 the fsck counter
		                tune2fs -C 0 -T "${START}" "/dev/${VG}/${VOLUME}"
		        else
		                # Set the fsck counter at max to fsck next time and send an email
		                tune2fs -C 16000 -T "19000101" "/dev/${VG}/${VOLUME}"
		                if test -n "EMAIL"; then
		                        mail -s "E2fsck of /dev/${VG}/${VOLUME} failed on host `hostname` !" $EMAIL < $TMPFILE
		                fi
		        fi
 
		        # Merge / Remove snapshot
		        lvremove -f "${VG}/${VOLUME}-snap"
		        rm $TMPFILE
		fi
	fi
done

4 Avoir un beau GUI

Bon, pour les connaisseurs de LVM et de Red Hat, vous connaissez certainement la commande system-config-lvm. Pour debian ça serait cool hein si on pouvaient l'avoir ! Et bah bibi got the solution :

Command
sudo apt-get install python-gtk2 python-gtk-1.2 python-glade-1.2 python-glade2 python-gnome2
wget http://download.fedora.redhat.com/pub/fedora/linux/core/updates/5/i386/system-config-lvm-1.0.18-1.2.FC5.noarch.rpm
sudo alien system-config-lvm-1.0.18-1.2.FC5.noarch.rpm 
sudo dpkg -i system-config-lvm_1.0.18-2.2_all.deb
sudo ln -s /usr/bin/python2.4 /usr/bin/python2 

Ya plus qu'a lancer et faire "ouaaaaaaa" :

Command system-config-lvm
system-config-lvm

5 FAQ

5.1 J'ai un conflit d'UUID

Si vous avez la malchance de tomber sur un conflit d'UUID, vous pouvez en régénérer via la commande suivante :

Command uuidgen
uuidgen

6 Ressources

Técharger la documentation LVM
Doccumentation for beginner
Documentation on LVM Snapshots