Logical Volume Manager (LVM)

5 minute read

LVM


In the traditional disk partitioning scheme, administrators plan ahead the use of each partition. For instance, a laptop with 120 GB hard drive, 1 GB  RAM can have the following partition scheme:

  • 1 GB for swap (/dev/sda1),
  • 12 GB for root (/dev/sda2),
  • 107 GB for /home (/dev/sda3), meaning, the remaining space.

So far so go, but what if the RAM is increased to 2 GB? In order to hibernate the system you must increase the swap, and because the whole hard drive was partitioned leaving no space there isn’t other way than repartitioning the hard drive using a utility, if the file system allows it  (for instance,  ext2/ext3/ext4 file systems let you resize them).

There isn’t anything more flexible? Yes, it’s called LVM (Logical Volume Manager), and basically it lets you hot resizing of partitions. For example, you can release 1GB from /home (/dev/sda3) and give it to the swap partition (/dev/sda1).

LVM (Logical Volume Manager)

In order to use LVM, first you must assign physical volumes, then volume groups and finally logical groups. All this might be confusing at first, but let’s try to explain each of these terms and how they are related:

  • Physical volumes: This is the support media where the data will be stored, and they can be made of several hard drives or partitions of a drive. They don’t have a direct relation with the mount points. Physical Volume examples: /dev/sda , /dev/sdb1, etc.

  • Volume groups: It’s the grouping of logical volumes in a volume to see them as one device. Physical volume example: /dev/vg00

  • Logical volumes: Here is were the file systems (for example, ext2, ext3,xfs,vfat) will reside and so the mount points (/, /home, swap, /usr, /var, etc). At this level the files systems are formated, and it’s where the data will be distributed logically, as you are costumed to with the traditional partitions. Logical volumes examples: /dev/vg00/lv_rootfs, /dev/vg00/lv_swap, /dev/vg00/lv_home.

Installing  LVM

On Debian you can install LVM with this package:

aptitude install lvm2

On other distributions like Fedora, Red Hat or Ubuntu you must search the name of the package for LVM.

LVM commands

In order to create a LVM using physical,  groups and logical volumes let’s see some commands available:

Physical volumes

Command Description
pvcreate Initialize physical volume(s) for use by LVM
pvs Display information about physical volumes
pvdisplayDisplay various attributes of physical volume(s)
pvresize Resize physical volume(s)
pvmove Move extents from one physical volume to another

Volume groups

Command Description
vgcreate Create a volume group
vgs Display information about volume groups
vgdisplay Display volume group information such as attributes
vgextend Add physical volumes to a volume group
vgreduce Remove physical volume(s) from a volume group
vgremove Remove volume group(s)

Logical volumes

Command Description
lvcreate Create a logical volume
lvs Display information about logical volumes
lvdisplay Display information about a logical volume
lvresize | lvreduce | lvextend Resize a logical volume
lvmove Remove logical volume(s) from the system

Example of how to create a LVM

Let’ s suppose you have free  8 GB hard drive in /dev/sdb , with two partitions of  4 GB each (/dev/sdb1 and /dev/sdb2), and you want to create a LVM on those two partitions to use these mount points:  1 GB for the system’s root (/), 1 GB for swap (swap) and the remaining 6 GB for users directory (/home). To create the LVM you can type the following commands:

root@buckbeak:~# pvcreate /dev/sdb1
Physical volume "/dev/sdb1" successfully created

root@buckbeak:~#pvcreate /dev/sdb2
Physical volume "/dev/sdb2" successfully created

root@buckbeak:~# pvs

PV         VG         Fmt  Attr PSize  PFree
/dev/sdb1                         lvm2 a-    4.00g 4.00g
/dev/sdb2                         lvm2 a-    3.99g 3.99g

root@buckbeak:~# vgcreate vg_group01 /dev/sdb1 /dev/sdb2

Volume group "vg_group01" successfully created

root@buckbeak:~# vgs

VG         #PV #LV #SN Attr   VSize  VFree
vg_group01   2   0   0 wz--n-  7.99g 7.99g

root@buckbeak:~# lvcreate -n lv_rootfs vg_group01 -L 1G
Logical volume "lv_rootfs" created

root@buckbeak:~# lvcreate -n lv_swap vg_group01 -L 1G
Logical volume "lv_swap" created

root@buckbeak:~# lvcreate -n lv_home vg_group01 -L 6G
Volume group "vg_group01" has insufficient free space (1534 extents): 1536 required

root@buckbeak:~# lvcreate -n lv_home vg_group01 -l 1534
Logical volume "lv_home" created

root@buckbeak:~# lvs
LV        VG         Attr   LSize  Origin Snap%  Move Log Copy%  Convert
lv_home   vg_group01 -wi-a-  5.99g
lv_rootfs vg_group01 -wi-a-  1.00g
lv_swap   vg_group01 -wi-a-  1.00g</pre>

Now you can make the file system for each logical volume:

root@buckbeak:~# mkfs.ext4 /dev/vg_group01/lv_rootfs
mke2fs 1.41.12 (17-May-2010)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
65536 inodes, 262144 blocks
13107 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=268435456
8 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376

Writing inode tables: done
Creating journal (8192 blocks): done
Writing superblocks and filesystem accounting information: done

This filesystem will be automatically checked every 34 mounts or
180 days, whichever comes first.  Use tune2fs -c or -i to override.

root@buckbeak:~# mkfs.ext4 /dev/vg_group01/lv_home
mke2fs 1.41.12 (17-May-2010)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
393216 inodes, 1570816 blocks
78540 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=1610612736
48 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736

Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done

This filesystem will be automatically checked every 20 mounts or
180 days, whichever comes first.  Use tune2fs -c or -i to override.

root@buckbeak:~# mkswap /dev/vg_group01/lv_swap
mkswap: /dev/vg_group01/lv_swap: warning: don't erase bootbits sectors
on whole disk. Use -f to force.
Setting up swapspace version 1, size = 1048572 KiB
no label, UUID=e743b4f3-1c80-4503-be88-6934d575cd55

root@buckbeak:~# swapon /dev/vg_group01/lv_swap

root@buckbeak:~# swapon -s
Filename                Type        Size    Used    Priority
/dev/dm-1                               partition    2064376    8    -1
/dev/dm-5                               partition    1048568    0    -2</pre>

If you want to use these logical volumes, you can mount them using the mount command or add them to the /etc/fstab file to be mount when the system boots.

References

Leave a Comment