Quick Start: Linux Logical Volume Manager

While installing the latest Ubuntu OS on your computer, you will see that you can install the OS using LVM (Logical Volume Manager) utility. Ever wonder what is it? LVM (Logical Volume Manager) is that fantastic utility for storage administration. It provide the users with abilities which were not possible with raw disks. The storage is now ‘virtualized’. You can now easily create, move and extend volumes (for now, think of it as disk partitions) without bothering about data corruption. You can carve partitions out of multiple disks, and can add and remove disks from a ‘volume group’ containing such volumes without the user noticing anything! List of all the features of LVM can be found at it’s wiki page.

This blog scratches the surface of LVM, and gives some basic insights into some storage concepts.

I’ll give you a simple example to better explain what a ‘physical volume’, a ‘volume group’ and a ‘logical volume’ is. Say I have two 1 TB hard disks - disk A and disk B. I have two equal-sized partitions on disk B, one of which I want to keep it to myself for my personal data. The ‘partition’ term used here is same as what you see in a file explorer. For the unpartitioned disk, the complete disk is one single partition.

The partitions I described above are ‘physical volumes’. That is, on the disk, these are physically separate bytes (think of that partitioned disk as a spiral on disk divided in its length at the midpoint). Out of the first disk and one partition of the second disk, we create a ‘volume group’ – a logical pool of storage, out of which we can create lots of ‘logical volumes’. Even after you’ve created logical volumes over this volume group, you can add and remove physical volumes (partitions) from the volume group. You can do many more operations such as resize, move and extend.

I hope the basic idea written above is sufficiently clear. Else, head over to this Ubuntu wiki for a slightly more detailed, but still an overview, of LVM. Anyway, I’m concentrating more on the demo, so lets move on.

Hands-on

I’m demo’ing everything on an Ubuntu machine, but it should work on any Linux distro (after you install the LVM2 package)

Install LVM2 package

sudo apt-get install lvm2

One nice thing is you don’t need to create actual partitions on disks. We’ll use files as loopback devices, which will appear to the operating system as partitions. Neat.

Create a file of size 1G to be later used as a physical volume.

rushi@jio:~$ truncate --size 1G backing_file_1

Create a loopback device over this file. Find the first free loopback device available and show its name.

rushi@jio:~$ sudo losetup --find --show backing_file_1 
/dev/loop0

List all the loopback devices.

rushi@jio:~$ sudo losetup --all
/dev/loop0: [fc00]:22811987 (/home/rushi/backing_file_1)

Create a physical volume over this loopback device. Note that

rushi@jio:~$ sudo pvcreate /dev/loop0 
  Physical volume "/dev/loop0" successfully created

List physical volumes. Apart from pvs (Physical Volume Scan), there are two more commands which do the same thing, but with different level of verbosity and formatting: pvscan and pvdisplay. (Try them out too!)

rushi@jio:~$ sudo pvs
  PV         VG        Fmt  Attr PSize   PFree 
  /dev/loop0           lvm2 a--    1.00g  1.00g
  /dev/sda5  ubuntu-vg lvm2 a--  931.27g 44.00m

Let us repeat the steps to create another physical volume:

rushi@jio:~$ truncate --size 1G backing_file_2
rushi@jio:~$ sudo losetup --find --show backing_file_2 
/dev/loop1
rushi@jio:~$ sudo losetup --all
/dev/loop0: [fc00]:22811987 (/home/rushi/backing_file_1)
/dev/loop1: [fc00]:22812001 (/home/rushi/backing_file_2)
rushi@jio:~$ sudo pvcreate /dev/loop1
  Physical volume "/dev/loop1" successfully created
rushi@jio:~$ sudo pvs
  PV         VG        Fmt  Attr PSize   PFree 
  /dev/loop0           lvm2 a--    1.00g  1.00g
  /dev/loop1           lvm2 a--    1.00g  1.00g
  /dev/sda5  ubuntu-vg lvm2 a--  931.27g 44.00m

Create a volume group test-volgroup over these two physical volumes. (Actually, even if you don’t create physical volumes over loopback devices, while creating volume groups it will automatically create physical volumes over them).

rushi@jio:~$ sudo vgcreate test-volgroup /dev/loop0 /dev/loop1
  Volume group "test-volgroup" successfully created

List the volume groups. (vgs, vgscan or vgdisplay can be used)

rushi@jio:~$ sudo vgs
  VG            #PV #LV #SN Attr   VSize   VFree 
  test-volgroup   2   0   0 wz--n-   1.99g  1.99g
  ubuntu-vg       1   2   0 wz--n- 931.27g 44.00m

Create a logical volume test-logicalvol over the test-volgroup volume group.

rushi@jio:~$ sudo lvcreate --size 400M --name test-logicalvol test-volgroup
  Logical volume "test-logicalvol" created

List logical volumes. (lvs, lvscan, lvdisplay can be used)

rushi@jio:~$ sudo lvs
  LV              VG            Attr      LSize   Pool Origin Data%  Move Log Copy%  Convert
  test-logicalvol test-volgroup -wi-a---- 400.00m                                           
  root            ubuntu-vg     -wi-ao--- 923.35g                                           
  swap_1          ubuntu-vg     -wi-ao---   7.88g                                           

Easy, isn’t it? Let’s tear down everything. Though a simpler way would be to just remove the loopback device, which will automatically remove all the physical, logical volumes/volume groups created over them, let’s do it step-by-step. Note that you need to specify volume group while deleting logical volumes.

rushi@jio:~$ sudo lvremove test-volgroup
Do you really want to remove active logical volume test-logicalvol? [y/n]: y
  Logical volume "test-logicalvol" successfully removed
rushi@jio:~$ sudo vgremove test-volgroup
  Volume group "test-volgroup" successfully removed
rushi@jio:~$ sudo pvremove /dev/loop0 /dev/loop1
  Labels on physical volume "/dev/loop0" successfully wiped
  Labels on physical volume "/dev/loop1" successfully wiped
rushi@jio:~$ sudo losetup --detach /dev/loop0 /dev/loop1
rushi@jio:~$ rm backing_file_1 backing_file_2

Cheers!

w