LVM components
- PV (Physical Volume) - Actual disk/partition
- VG (Volume Group) - Pool of PVs
- LV (Logical Volume) - Virtual partition
Create physical volume
sudo pvcreate /dev/sdb
Display physical volumes
sudo pvdisplay
sudo pvs
Create volume group
sudo vgcreate vg_data /dev/sdb
Add PV to VG
sudo vgextend vg_data /dev/sdc
Display volume groups
sudo vgdisplay
sudo vgs
Create logical volume
# 10 GB LV
sudo lvcreate -L 10G -n lv_data vg_data
# Use all available space
sudo lvcreate -l 100%FREE -n lv_data vg_data
Display logical volumes
sudo lvdisplay
sudo lvs
Format LV
sudo mkfs.ext4 /dev/vg_data/lv_data
Mount LV
sudo mkdir /mnt/data
sudo mount /dev/vg_data/lv_data /mnt/data
Permanent mount (fstab)
Add to /etc/fstab:
/dev/vg_data/lv_data /mnt/data ext4 defaults 0 2
Extend logical volume
# Add 5GB
sudo lvextend -L +5G /dev/vg_data/lv_data
# Use all free space
sudo lvextend -l +100%FREE /dev/vg_data/lv_data
Resize filesystem
# For ext4
sudo resize2fs /dev/vg_data/lv_data
# For XFS
sudo xfs_growfs /mnt/data
Extend LV and filesystem (one command)
sudo lvextend -L +5G -r /dev/vg_data/lv_data
Reduce logical volume
# DANGEROUS! Backup first!
# Unmount first
sudo umount /mnt/data
# Check filesystem
sudo e2fsck -f /dev/vg_data/lv_data
# Resize filesystem
sudo resize2fs /dev/vg_data/lv_data 5G
# Reduce LV
sudo lvreduce -L 5G /dev/vg_data/lv_data
Remove logical volume
sudo umount /mnt/data
sudo lvremove /dev/vg_data/lv_data
Remove volume group
sudo vgremove vg_data
Remove physical volume
sudo pvremove /dev/sdb
Move data between PVs
sudo pvmove /dev/sdb /dev/sdc
Remove PV from VG
# Move data first
sudo pvmove /dev/sdc
# Remove from VG
sudo vgreduce vg_data /dev/sdc
Create snapshot
sudo lvcreate -L 1G -s -n lv_data_snapshot /dev/vg_data/lv_data
Mount snapshot
sudo mkdir /mnt/snapshot
sudo mount /dev/vg_data/lv_data_snapshot /mnt/snapshot
Merge snapshot
sudo umount /mnt/data
sudo lvconvert --merge /dev/vg_data/lv_data_snapshot
Remove snapshot
sudo lvremove /dev/vg_data/lv_data_snapshot
Rename LV
sudo lvrename vg_data old_name new_name
Rename VG
sudo vgrename old_vg new_vg
Scan for new volumes
sudo pvscan
sudo vgscan
sudo lvscan
Activate volume group
sudo vgchange -ay vg_data
Deactivate volume group
sudo vgchange -an vg_data
Check VG for errors
sudo vgck vg_data
Backup LVM metadata
sudo vgcfgbackup vg_data
Restore LVM metadata
sudo vgcfgrestore vg_data
Display VG usage
sudo vgdisplay -v vg_data
Thin provisioning
# Create thin pool
sudo lvcreate -L 100G --thinpool thin_pool vg_data
# Create thin volume
sudo lvcreate -V 50G --thin vg_data/thin_pool -n thin_lv
Striped LV (RAID 0)
sudo lvcreate -L 10G -i 2 -n lv_striped vg_data
Mirrored LV (RAID 1)
sudo lvcreate -L 10G -m 1 -n lv_mirror vg_data
Monitor LVM events
sudo lvmdump
Complete workflow example
# 1. Prepare disks
sudo pvcreate /dev/sdb /dev/sdc
# 2. Create volume group
sudo vgcreate vg_data /dev/sdb /dev/sdc
# 3. Create logical volume
sudo lvcreate -L 20G -n lv_data vg_data
# 4. Format with ext4
sudo mkfs.ext4 /dev/vg_data/lv_data
# 5. Mount
sudo mkdir /mnt/data
sudo mount /dev/vg_data/lv_data /mnt/data
# 6. Add to fstab
echo "/dev/vg_data/lv_data /mnt/data ext4 defaults 0 2" | sudo tee -a /etc/fstab
Troubleshooting
# Volume group not found
sudo vgscan
sudo vgchange -ay
# Can't extend (no space)
sudo vgs # Check free space
sudo pvs # Check PV space
# LV inactive
sudo lvchange -ay /dev/vg_data/lv_data
# Check filesystem
sudo e2fsck -f /dev/vg_data/lv_data