Logical Volume Management
As seen in the previous chapter the size of filesystems are limited to the size of a single harddisk. By using Logical Volume Management we can work around this limitation as it an abstraction layer between one or more harddisks and filesystems.
The Basics
On our example system we can see that we already has been deployed with a volume group called systemvg on partition /dev/sda2, but both /dev/sdb and /dev/sdc are still unused when we check with lsblk.
# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 20G 0 disk
├─sda1 8:1 0 1G 0 part /boot
└─sda2 8:2 0 11G 0 part
├─systemvg-root 253:0 0 4G 0 lvm /
├─systemvg-var 253:1 0 4G 0 lvm /var
├─systemvg-home 253:2 0 1024M 0 lvm /home
└─systemvg-swap 253:3 0 2G 0 lvm [SWAP]
sdb 8:16 0 8G 0 disk
sdc 8:32 0 8G 0 disk
sr0 11:0 1 1024M 0 rom
A harddisk or partition can be prepared with the pvcreate command and verified with the command pvdisplay. In the example below harddisk /dev/sdb is prepared and verify the new physical volume. The pvdisplay command shows the maximum size that can be allocated and how much space has been allocated.
# pvcreate /dev/sdb
Physical volume "/dev/sdb" successfully created.
# pvdisplay /dev/sdb
"/dev/sdb" is a new physical volume of "8.00 GiB"
--- NEW Physical volume ---
PV Name /dev/sdb
VG Name
PV Size 8.00 GiB
Allocatable NO
PE Size 0
Total PE 0
Free PE 0
Allocated PE 0
PV UUID QFLoSk-uwBO-xSrP-nyLI-21wj-dCJ1-0pdLFy
One or more physical volumes can be combined into volume group with the command vgcreate. After creating a new volume group called datavg that contains the physical volume on /dev/sdb the specifications can be dispayed with command vgdisplay. Running vgdisplay and pvdisplay will the allocated space both within the volume group and physical volume.
# vgcreate datavg /dev/sdb
Volume group "datavg" successfully created
# vgdisplay datavg
--- Volume group ---
VG Name datavg
System ID
Format lvm2
Metadata Areas 1
Metadata Sequence No 1
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 1
Open LV 0
Max PV 0
Cur PV 1
Act PV 1
VG Size <8.00 GiB
PE Size 4.00 MiB
Total PE 2047
Alloc PE / Size 0 / 0
Free PE / Size 2047 / <8.00 GiB
VG UUID pfKpWs-Qb3Z-rQMw-1EqO-TYRw-ZhkF-FhiSwM
# pvdisplay /dev/sdb
--- Physical volume ---
PV Name /dev/sdb
VG Name datavg
PV Size 8.00 GiB / not usable 4.00 MiB
Allocatable yes
PE Size 4.00 MiB
Total PE 2047
Free PE 2047
Allocated PE 0
PV UUID QFLoSk-uwBO-xSrP-nyLI-21wj-dCJ1-0pdLFy
Creating a logical volume called fs01 with the lvcreate command and allocating space for it in volume group ** datavg**. Running the command vgdisplay and pvdisplay will show that the allocated and remaining space.
# lvcreate -L 100M datavg -n fs01
# vgdisplay datavg
--- Volume group ---
VG Name datavg
System ID
Format lvm2
Metadata Areas 1
Metadata Sequence No 2
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 1
Open LV 0
Max PV 0
Cur PV 1
Act PV 1
VG Size <8.00 GiB
PE Size 4.00 MiB
Total PE 2047
Alloc PE / Size 25 / 100.00 MiB
Free PE / Size 2022 / <7.90 GiB
VG UUID pfKpWs-Qb3Z-rQMw-1EqO-TYRw-ZhkF-FhiSwM
# pvdisplay /dev/sdb
--- Physical volume ---
PV Name /dev/sdb
VG Name datavg
PV Size 8.00 GiB / not usable 4.00 MiB
Allocatable yes
PE Size 4.00 MiB
Total PE 2047
Free PE 2022
Allocated PE 25
PV UUID QFLoSk-uwBO-xSrP-nyLI-21wj-dCJ1-0pdLFy
The device mapper in Linux now provides a block device that can be accessed like a partition to create a filesystem and mount it.
# ls -lL /dev/mapper/
total 0
crw-------. 1 root root 10, 236 Dec 16 21:24 control
brw-rw----. 1 root disk 253, 2 Dec 16 21:43 datavg-fs01
brw-rw----. 1 root disk 253, 0 Dec 16 21:24 systemvg-root
brw-rw----. 1 root disk 253, 1 Dec 16 21:24 systemvg-swap
# mkfs.xfs /dev/mapper/datavg-fs01
meta-data=/dev/mapper/datavg-fs01 isize=512 agcount=4, agsize=6400 blks
= sectsz=512 attr=2, projid32bit=1
= crc=1 finobt=1, sparse=1, rmapbt=0
= reflink=1 bigtime=0 inobtcount=0
data = bsize=4096 blocks=25600, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0, ftype=1
log =internal log bsize=4096 blocks=1368, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
Discarding blocks...Done.
# mount /dev/mapper/datavg-fs01 /mnt
# df -h /mnt
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/datavg-fs01 95M 6.0M 89M 7% /mnt
After unmounten the filesystem the logical volume can de removed from the volume group with the lvremove command. The vgdisplay command also shows that the allocated space has been freed and is available to be used for another logical volume.
# umount /mnt
# lvremove /dev/mapper/datavg-fs01
Do you really want to remove active logical volume datavg/fs01? [y/n]: y
Logical volume "fs01" successfully removed.
# vgdisplay datavg
--- Volume group ---
VG Name datavg
System ID
Format lvm2
Metadata Areas 1
Metadata Sequence No 3
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 0
Open LV 0
Max PV 0
Cur PV 1
Act PV 1
VG Size <8.00 GiB
PE Size 4.00 MiB
Total PE 2047
Alloc PE / Size 0 / 0
Free PE / Size 2047 / <8.00 GiB
VG UUID pfKpWs-Qb3Z-rQMw-1EqO-TYRw-ZhkF-FhiSwM
When volume group datavg is also removed with the vgremove command and /dev/sdb isn’t part of a volume group anymore as the line with VG Name is empty. After this the LVM-label on disk can be remove with pvremove and the physical volume is completely gone.
# vgremove datavg
Volume group "datavg" successfully removed
# pvdisplay /dev/sdb
"/dev/sdb" is a new physical volume of "8.00 GiB"
--- NEW Physical volume ---
PV Name /dev/sdb
VG Name
PV Size 8.00 GiB
Allocatable NO
PE Size 0
Total PE 0
Free PE 0
Allocated PE 0
PV UUID QFLoSk-uwBO-xSrP-nyLI-21wj-dCJ1-0pdLFy
# pvremove /dev/sdc1
Extending
# vgextend vg_name /dev/sdc2
# pvmove /dev/sdc1 /dev/sdc2
# vgreduce vg_name /dev/sdc2
# lvextend -L +512M /dev/vg_name/lv_name
# lvextend -L +128 /dev/vg_name/lv_name
# lvextend -l+100%FREE /dev/vg_name/lv_name
# xfs_growfs /dev/vg_name/lv_name
# resize2fs /dev/vg_name/lv_name