The Logical Volume Management framework allows one to group different block devices (disks, partitions, RAID arrays...) together as a single larger device, the volume group (VG).
Individual devices used to form a volume group are referred to as physical volumes (PV). Physical volumes once regrouped into a volume group lose their individual character.
Instead the entire volume group is divided into physical extents (PE) of fixed size (4MB by default) from which logical volumes (LV) are created. A logical volume can be thought of as a partition.

The LVM kernel module is lvm-mod.o.
The software tools are installed by the lvm
package which provides in particular /sbin/vgscan.
This command will start the LVM environment by scanning all the
volume groups and build the /etc/lvmtab
as well as databases in /etc/lvmtab.d/
which are used by all the other LVM tools.
Table 4.1. Main LVM tools
| PV tools | pvcreate, pvmove, pvchange, pvdisplay, pvscan ... |
| VG tools | vgcreate, vgremove, vgchange, vgdisplay, vgscan ... |
| LV tools | lvcreate, lvextend, lvreduce, lvremove, lvchange, lvscan ... |
We won't need to use or know all the above tools. We will rather focus on the various LVM components (as depicted in the diagram) and the commands needed to create these components: pvcreate, vgcreate and lvcreate.
Create a volume group called volumeA
with three physical volumes (3 partitions in this case)
and create a logical volume called lv0
of size 150MB initially.
Run vgscan to create the
/etc/lvmtab file
Create three new partitions (say /dev/hda16,
/dev/hda17, /dev/hda18)
of 100MB each. Make sure you toggle the partition type to
8E (Linux LVM). Then reboot.
Prepare the physical volumes
pvcreate /dev/hda16 pvcreate /dev/hda17 pvcreate /dev/hda18
Create a volume group called volumeA
with the above physical volumes:
vgcreate volumeA /dev/hda16 /dev/hda17 /dev/hda18
This will create a directory called /dev/volumeA/.
The default PE size of 4MB will be used, one can change this with the
-s option.
Create a logical volume called lv0
of size 150MB on this volume group
lvcreate -L 150M -n lv0 volumeA
This will create the block device
/dev/volume1/lv0
Make a filesystem on lv0 and mount
it on /mnt/lvm
mkfs -t ext3 /dev/volumeA/lv0 mkdir /mnt/lvm mount /dev/volumeA/lv0 /mnt/lvm
This wouldn't be very different from other partition types if it weren't for the possibility to change the logical volume's size at any time.
Let's first show how to reduce the existing 150MB
logical volume lv0 with the
e2fsadm tool installed by the
lvm package.
umount /mnt/lvm e2fsadm -L 25 /dev/volumeA/lv0
![]() | Note |
|---|---|
The |
The next section will show how to add a new physical volume (a disk) to a volume group and demonstrates how an existing logical volume can be made larger by including physical extents available in the volume group to itself. Once this is done the e2fsadm tool will resize the filesystem across the logical volume.
So far we have
VG=/dev/hda16+/dev/hda17+/dev/hda18
and we would like to add a RAID0 device to this
Create three more partitions (eg /dev/hda19,
/dev/hda20 and /dev/hda21)
of size 50MB and of type "Linux raid autodetect"
(FD) - reboot!
Edit /etc/mtab to add the following RAID 0
device:
raiddev /dev/md1
raid-level 0
nr-raid-disks 3
nr-spare-disks 0
persistent-superblock 1
chunk-size 4
device /dev/hda19
raid-disk 0
device /dev/hda20
raid-disk 1
device /dev/hda21
raid-disk 2
Start the raid meta device:
mkraid /dev/md1 raidstart /dev/md1
Add this device to the Volume Group
volumeA
Before adding the device to the volume group run
pvscan to see which physical volumes are available.
Notice that /dev/md1 is not listed.
We now prepare /dev/md1 as a PV
(physical volume):
pvcreate /dev/md1
When running pvscan again the output should look
like the following. Notice that /dev/md1 is now
listed.
pvscan pvscan -- reading all physical volumes (this may take a while...) pvscan -- ACTIVE PV "/dev/md1" is in no VG [305.62 MB] pvscan -- ACTIVE PV "/dev/hda10" of VG "volumeA"[96 MB / 0 free] pvscan -- ACTIVE PV "/dev/hda11" of VG "volumeA"[96 MB / 0 free] pvscan -- ACTIVE PV "/dev/hda12" of VG "volumeA"[96 MB / 84 MB free] pvscan -- total:4[611.46 MB] /in use:3[305.83 MB] /in no VG:1 [305.62 MB]
We next add the device /dev/md1 to the
volume group volumeA:
vgextend volumeA /dev/md1
At this stage the volume group has four devices:
VolumeA=/dev/hda10+/dev/hda11+/dev/hda12+/dev/md1
We can take 50MB from /dev/md1 and add them to
lv0 (unmount the volume first)
lvextend -L +50 /dev/volumeA/lv0 /dev/md1
The original lv0
volume had 150 megabytes.
The + flag in front of the requested size has
added 50MB to the logical volume, making it about 200 megabytes.
But we haven't extended the filesystem across the entire logical
volume yet.
The output of lvscan will show 80MB available. This corresponds to the 25 megabytes resizing done with e2fsadm on p. XXXX plus the 50MB added by lvextend above.
lvscan lvscan -- ACTIVE "/dev/volumeA/lv0" [80 MB] lvscan -- 1 logical volumes with 80 MB total in 1 volume group lvscan -- 1 active logical volume
The next command will extend the filesystem to 80 megabytes:
e2fsadm -L 80 /dev/volume/lv0
If you remount this volume on /mnt/lvm
you can see the new available space with df.
![]() | Reboot Warning |
|---|---|
The LVM tools need the insmod /lib/lvm-mod.o raidautorun /dev/md1 The volume group is then activated with vgscan from the rc.sysinit script. |
As with software RAID we are going to investigate some issues we need to consider when using LVM on the root device.
First make sure the volume we have created previously is mounted. If it isn't then do
mount /dev/volumeA/lv0 /mnt/lvm
Next we archive the root device in the same way as we did for RAID:
tar clvf - / | (cd /mnt/lvm/; tar xvf -)
Edit /mnt/lvm/etc/fstab and enter
/dev/volumeA/lv0 / ext2 defaults 0 1
Edit /etc/lilo.conf or
/etc/grub.conf to add a new entry where the kernel
points to the new root logical volume.
For a 2.4.22 kernel an additional entry in /etc/grub.conf
looks like this:
title lvm-root
root (hd0,1)
kernel /vmlinuz-2.4.22 ro root=LABEL=/
initrd /initrd-2.4.22-lvm.img
All we need is the initrd
initrd-2.4.22-lvm.img.
Once again we will run mkinitrd with
--fstab=
which we will use to make the script read our new
fstabfstab file
/mnt/lvm/etc/fstab.
We test this:
mkinitrd --fstab=/mnt/lvm/etc/fstab /boot/initrd-lvm.img $(uname -r)
If we mount this initial ram disk we can see that this is going to work by looking at the linuxrc script.
# linuxrc echo "Loading lvm-mod.o module" insmod /lib/lvm-mod.o echo Creating block devices mkdevices /dev echo Scanning logical volumes vgscan echo Activating logical volumes vgchange -ay ----snip---