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.