Logical Volume Management (LVM)
Logical volume management is essentially a supercharged and abstracted version of disk partitioning.
- It groups individual storage devices into volume groups.
- The blocks in a volume group can then be allocated to logical volumes which are represented by block device files and act like disk partitions.
Logicial volumes has more megical operations that the volume manager lets you carry out:
- Move logical volumes among different physical devices
- Grow and shrink logical volumes on the fly
- Take copy-on-write “snapshots” of logical volumes
- Replace on-line drives without interrupting service
- Incorporate mirroring or striping in your logical volumes
Management
LVM Commands Reference
| Entity | Operation | Command |
|---|---|---|
| Physical volume | Create | pvcreate |
| Inspect | pvdisplay | |
| Modify | pvchange | |
| Check | pvck | |
| Volume group | Create | vgcreate |
| Modify | vgchange | |
| Extend | vgextend | |
| Inspect | vgdisplay | |
| Check | vgck | |
| Enable | vgscan | |
| Logical volume | Create | lvcreate |
| Modify | lvchange | |
| Resize | lvresize | |
| Inspect | lvdisplay |
You can use these commands or use lvm and it’s subcommands, they’re identical and just call the same logic.
Note
Physical volumes in LVM are misleading because physical volumes dont need direct correspondence to physical devices. They can be disks, but they can also be disk partitions or RAID arrays. LVM doesn’t care.
Configuration
Core phases:
- define (label) and initilize
physical volumes - add
physical volumesto avolume group - create
logical volumeson thevolume group
LVM commands start with letters that make it clear at which level of abstraction they operate:
pv- physical volumesvg- volume groupslv- logical volumeslvm- the system as a whole
Configuration Example
- We set up a 1TB hard disk (
/dev/sdb) for use with LVM and create a logical volume. - We assume that the disk has been partitioned with all space being assigned to a single partition,
/dev/sdb1.
We could omit the partitioning step entirely and just use the raw disk as our physical device, but there is no performance benefit to doing so. Partitioning makes the disk comprehensible to the broadest variety of software and operating systems.
label
sdb1parition as a LVM physical volume so it can be used in a volume groupBashsudo pvcreate /dev/sdb1 # Physical volume "/dev/sdb1" successfully created.Add the new physical volume to a volume group
Bashsudo vgcreate vg0 /dev/sdb1 # Volume group "vg0" successfully createdvg0is just a convention for volume group 0 it can be named anything.We could add more phyiscal devices to our volume group now if we wanted more storage, we can do that later as well.
Bashsudo vgdisplay vg0 --- Volume group --- VG Name vg0 # volume group name System ID Format lvm2 # Metadata format (always lvm2) Metadata Areas 1 Metadata Sequence No 1 VG Access read/write # accessible for r/w VG Status resizable # can be resized MAX LV 0 # max logical volumes (0 = unlimtied) Cur LV 0 # current logical volumes created Open LV 0 # logical volumes mounted Max PV 0 # max physical volumes (0 = unlimited) Cur PV 1 # current physical volunes in group Act PV 1 # active physical volumes VG Size 1020.00 MiB # Total capacity PE Size 4.00 MiB # allocation unit size (smallest logical volume we can make 4MiB) Total PE 255 Alloc PE / Size 0 / 0 Free PE / Size 255 / 1020.00 MiB VG UUID YlCGhF-5Red-2yvm-qk64-rgsr-qrjm-Xuj95QCreate the logical volume with
vg0sudo lvcreate -L 100M -n website1 vg0 # Logical volume "website1" created.Fixed Size (-L) - K (Kilobytes), M (Megabytes), G (Gigabytes), T (Terabytes)
Now we’re at the same view as paritions, the lv is a block device we map a file system to.
Create filesystem on the logical volume
sudo mkfs.ext4 /dev/vg0/website1 # ... sudo mkdir /opt/website1 sudo mount /dev/vg0/website1 /opt/website1 # fstab if we want to persistanceDone!
Filesystem Resizing
The logical volume manager doesn’t know anything about the contents of its volumes, so you must do your resizing at both the volume and filesystem levels.
The order depends on the specific operation.
- Reductions must be filesystem-first
- enlargements must be volume-first.
Important
Don’t memorize these rules: just think about what’s actually happening and use common sense.
Resizing example
I’m going to add 100MB to my previous example lv/fs
sudo umount /opt/website1
sudo lvdisplay
➜ sand /opt sudo lvdisplay
--- Logical volume ---
LV Path /dev/vg0/website1
LV Name website1
VG Name vg0
LV Size 100.00 MiB
sudo lvresize -L +100M /dev/vg0/website1
sudo lvdisplay
--- Logical volume ---
LV Path /dev/vg0/website1
LV Name website1
VG Name vg0
LV Size 200.00 MiBThe original filesystem is still 100MiB, we need to resize it using resize2fs, which is meant for ext2+ filesystems’ (other filesystems have different utilities).resize2fs determines the size of the new fs from the volume so we only need to specify the new size when shrinking.
sudo resize2fs /dev/vg0/website1
resize2fs 1.47.0 (5-Feb-2023)
Resizing the filesystem on /dev/vg0/website1 to 51200 (4k) blocks.
The filesystem on /dev/vg0/website1 is now 51200 (4k) blocks long.We can confirm with df
sudo mount /dev/vg0/website1 /opt/website1
df /opt/website1 -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/vg0-website1 184M 24K 170M 1% /opt/website1Cloud Disks / Hypervisor Disks
“Disks” you allocate and attach to virtual machines in the cloud are essentially logical volumes, although the volume manager itself lives elsewhere in the cloud. These volumes are usually resizable through the cloud provider’s management console or command-line utility.
The procedure for resizing cloud filesystems is much the same as the one outlined above, but keep in mind that in the background the cloudprovider is just using lvm to give you new logical disks which you’re segmenting.
Proof in Proxmox
I can this on my proxmox host, as we see the drive we’ve been working with is just a logical volume itself.
$ lvdisplay
--- Logical volume ---
LV Path /dev/pve/vm-108-disk-1
LV Name vm-108-disk-1
VG Name pve
LV Size 1.00 GiBThe hypervisor presents it to the VM as a virtual block device, all the vm sees is /dev/sdb. Awesome right?