A lvm Post
01 June 2012
Intro
lvm allow storage virtualization. Its lack of a big limitation : most bootloaders are unable to boot on the kernet stored on a LVM volume for now lvm allow to dynamically update a logical volume fastly and hot I therefore choose to let LVM to take care of my disk (except for /boot partition) TODO : mdadm
Go
# fdisk -l /dev/sda
Disk /dev/sda:500.1 GB, 500107862016 bytes
255 heads, 63 sectors ...
- We do not use the whole disk space but only 98%
- Get the /boot bootable
Lvm uses 3 kind of logical volumes toreach its flexibility:
- PVs (physical volumes) are the objects closest to the hardware. A PV can be one or more entire disk, one (or more) partitions or every bloc device. #Caution: Take care to not use directly the PVs once they are used by LVM, risk of cause troubles
- PVs are aggregated in VGs (volume groups) which can be considerated as virtual disks (extensible!!).VGs are abstracts objects and doesn’t have any special file in /dev, so no risk of mistakes
- Finally, LVs (logical volumes) are division of VG we can compare to physical partitions on virtual disk that VG represent. Those LVs become devices in /dev we can use as any standard partition
VG example
# vgdisplay
aa ldslfdspfld
# vgcreate vg00 /dev/sdb2 /dev/sdf1
Volume group "vg00" successfully created
# vgdisplay
--- Volume group ---
VG Name vg00
System ID
Format lvm2
Metadata Areas 1
Metadata Sequence No 4
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 2
Open LV 2
Max PV 0
Cur PV 1
Act PV 1
VG Size 9,56 GiB
PE Size 4,00 MiB
Total PE 2447
Alloc PE / Size 2304 / 9,00 GiB
Free PE / Size 143 / 572,00 MiB
VG UUID 7Xq06g-JEhP-upus-mIeL-3d4w-lIbY-fG8zzZ
# vgcreate vg01 /dev/sdc3 /dev/sdd /dev/sdf2
Volume group "vg01" successfully created
# vgdisplay -C
VG xPV xLV xSN Attr VSize VFree
vg00 2 0 0 wz--n- 7,76g 7,76g
vg01 3 0 0 wz--n- 9,56g 572,00m
syntaxe is simple and you can do what you want You can for example create 2 partitions of a same disk on 2 different VGs. We now have 2 virtual disk of 7G and 9G
# lvdisplay
# lvcreate -n rootfs -L 5G vg00
Logical volume "tootfs" created
# lvdisplay
--- Logical volume ---
LV Name /dev/vg00/rootfs
VG Name vg00
LV UUID YD7EXJ-4i2u-OIaz-FREJ-5es3-0UEQ-PLYIRh
LV Write Access read/write
LV Status available
x open 1
LV Size 5,00 GiB
Current LE 2048
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 256
Block device 254:0
# lvcreate -n lv_base -L 1G vg00
Logical volume "lv_base" created
# lvcreate -n lv_sauvegardes -L 12G vg01
Logical volume "lv_sauvegardes" created
# lvdisplay -C
LV VG Attr LSize Origin Snap% Move Log Copy% Convert
lv_base vg00 -wi-a- 5,00g
rootfs vg00 -wi-ao 8,00g
lv_sauvegardes vg01 -wi-ao 12,00g
Deux informations sont indispensables lors de la création des volumes logiques : le nom du lv à créer et sa taille. La commande lvdisplay dispose, comme pvdisplay et vgdisplay, de 2 affichages en utilisant l’option ‘-C’.
Il est également possible d’influencer la manière dont LVM stockera les donnés au sein des VG. Ex : lvcreate -n lv_base -L 1G vg_critique /dev/sdb2. Cette commande échouera si le périphérique ne dispose pas de suffisamment de place. De plus, loption ‘-l’ permet de dpécifier la taille d’un lv en nombre de blocs (PE pour physical extents) ce qui nous permettra d’être précis.
Une fois crées, les volumes logiques sont représentés par des fichiers dans /dev/mapper/
# ls -l /dev/mapper/
total 0
crw------- 1 root root 10, 59 27 juil. 16:03 control
lrwxrwxrwx 1 root root 7 27 juil. 16:03 debianLVM-home -> ../dm-6
lrwxrwxrwx 1 root root 7 27 juil. 16:03 debianLVM-root -> ../dm-1
lrwxrwxrwx 1 root root 7 27 juil. 16:03 debianLVM-swap_1 -> ../dm-4
lrwxrwxrwx 1 root root 7 27 juil. 16:03 debianLVM-tmp -> ../dm-5
lrwxrwxrwx 1 root root 7 27 juil. 16:03 debianLVM-usr -> ../dm-2
lrwxrwxrwx 1 root root 7 27 juil. 16:03 debianLVM-var -> ../dm-3
lrwxrwxrwx 1 root root 7 27 juil. 16:03 vg00-rootfs -> ../dm-0
lrwxrwxrwx 1 root root 7 27 juil. 16:03 vg00-swap -> ../dm-7
Pour faciliter les choses, des liens symboliques sont égaement crées dans des repertoires correspondants aux VG
# ls -l /dev/vg00/
total 0
lrwxrwxrwx 1 root root 7 27 juil. 16:03 rootfs -> ../dm-0
lrwxrwxrwx 1 root root 7 27 juil. 16:03 swap -> ../dm-7
Utilisation
On peut dés lors utiliser les LV comme on utiliserait une partition normale:
# mkfs.ext4 /dev/vg00/rootfs
...
# mkdir ...
...
# mount /dev/vg_normal/lv_sauvegardes /srv/sauvegardes
# df -h /srv/sauvegardes
root@debian-cli:~# mount /dev/debianLVM/home /mnt/
root@debian-cli:~# df -h /mnt/
Sys. de fichiers Taille Uti. Disp. Utip Monté sur
/dev/mapper/debianLVM-home 2,7G 69M 2,5G 3p /mnt
# cat /etc/fstab
[...]
/dev/vg_critique/lv_base /srv/base ext4
/dev/vg_critique/lv_fichiers /srv/fichiers ext4
/dev/vg_critique/lv_sauvegardes /srv/sauvegardes ext4
Note: Lors du démarrage de l’ordinateur, le script /etc/init.d/lvm (debian) effectue un balayage des périphériques disponibles ; ceux qui ont été préparés comme des volumes physiques pour LVM sont alors répertoriés auprés du sous-système LVM, ceux qui font partis de VG sont assemblés, et les lv sont mis en fonctionnement.On notera que la disposition des divers éléments impliqués dans LVM est stocké dans /etc/lvm/backup, ce qui peut servir en cas de problème …
LVM au fil du temps
Mais le principal attrait de LVM est avant tout sa souplesse.
# df -h /srv/fichiers
... 5,00G Uti% : 98%
# lvdisplay -C vg_critique/lv_fichiers
... 5,00G
# vgdisplay -C vg_critique
... Size : 8,14G Free:2,14G
# lvresize -L 7G vg_critique/lv_fichiers
Extending logical volume lv_fichiers to 7,00GB
Logical volume lv_fichiers successfully resized
# lvdisplay -C vg_critique/lv_fichiers
... 7,00 GB
# rsize2fs /dev/vg_critique/lv_fixhiers
...
# df -h /srv/fichiers/
Tous les systèmes de fichiers ne peuvent pas être retaillés !!! ( ext4 et ext3 et xfs qui sont des fs récents, peuvent être étendus (à chaud) mais pas réduits ; reiserfs supporte l’extension et la réduction, ext2 doit être démonté) .
Pour aller plus loin Il existe des utilisation plus avancés de LVM. Par exemple on peut influer la taille des blocs composants des lv sur les pv et leur disposition. Il est également possiblede déplacer ces blocs entre les pv. Cela peut être pour des raisons de vitesse (plusieurs disques différents dans le vg) ou bien pour sortir simplement un disque de LVM… cf. lvm(8)
Lorsque la capacité de notre VG commence à atteindre sa limite, LVM permet de lui ajouter un pv à des vgs existants
# pvcreate /dev/sdb1
Physical volume "/dev/sdb1" successfully created
# vgextend vg_critique /dev/sdb1
Volume group "vg_critique" successfully extended
# vgdisplay -C vg_critique
[...]
Conclusion
Le but principal étant non pas de gagner en fiabilité des données mais en souplesse d’utilisation. lvm peut cependant se superposer à du raid logiciel. L’outil s’appelle mdadm.