๐ง Linux LVM Complete Guide: PV / VG / LV Expansion, Reduction & Online Filesystem Resize
Running out of space on /var, /data, or your virtual machine disk is one of the most common storage issues in Linux servers. Without LVM (Logical Volume Manager), resizing partitions can be extremely painful. This guide explains LVM clearly — concepts → creation → expansion → reduction → common errors — with full examples for EXT4 and XFS online resize.
1. Why LVM? Traditional Partitioning vs LVM
Traditional partitioning uses fixed sizes created by fdisk or parted:
/dev/sda1 → /boot
/dev/sda2 → /
/dev/sda3 → /var
/dev/sda4 → /home
Disadvantages:
- Resizing later is painful or impossible.
- Adding a new disk cannot extend an existing mount point like /var or /data.
LVM treats storage like modular blocks:
- PV (Physical Volume): physical disks or partitions (e.g.,
/dev/sda2,/dev/sdb) - VG (Volume Group): a capacity pool combining multiple PVs
- LV (Logical Volume): logical partitions carved from a VG
๐ฆ Architecture Overview
Traditional:
/dev/sda
├─ /dev/sda1 → /
├─ /dev/sda2 → /var
└─ /dev/sda3 → /home
LVM:
/dev/sda2 /dev/sdb
│ │
└── PVs → VG (vg_data)
├── LV: lv_var → /var
├── LV: lv_home → /home
└── LV: lv_data → /data
2. LVM Structure Overview: PV → VG → LV
Goal:
/dev/vg_main/lv_root → /
/dev/vg_main/lv_var → /var
/dev/vg_main/lv_data → /data
/dev/sda2 /dev/sdb
│ │
└── PV0 └── PV1
│
└───── VG: vg_main
├── LV: lv_root → /
├── LV: lv_var → /var
└── LV: lv_data → /data
3. Creating LVM from Scratch
1️⃣ Create partition (optional)
# Using whole disk:
sudo pvcreate /dev/sdb
# Using a partition:
sudo fdisk /dev/sdb # create /dev/sdb1 type 8e
sudo pvcreate /dev/sdb1
2️⃣ Create PV, VG, LV
sudo pvcreate /dev/sda2
sudo pvcreate /dev/sdb1
sudo vgcreate vg_main /dev/sda2
sudo vgextend vg_main /dev/sdb1
sudo lvcreate -L 20G -n lv_root vg_main
sudo lvcreate -L 50G -n lv_var vg_main
sudo lvcreate -L 100G -n lv_data vg_main
3️⃣ Format & mount
sudo mkfs.ext4 /dev/vg_main/lv_var
sudo mkfs.ext4 /dev/vg_main/lv_data
sudo mount /dev/vg_main/lv_var /var
sudo mount /dev/vg_main/lv_data /data
/dev/vg_main/lv_var /var ext4 defaults 0 2
/dev/vg_main/lv_data /data ext4 defaults 0 2
4. Online LVM Expansion (EXT4 & XFS)
Step 1: Check current state
df -h
lsblk
sudo vgs
sudo lvs
Step 2: Add disk and extend VG
sudo pvcreate /dev/sdc
sudo vgextend vg_main /dev/sdc
sudo vgs
Step 3: Extend LV (no downtime)
# Add 100G
sudo lvextend -L +100G /dev/vg_main/lv_data
# or consume all free space
sudo lvextend -l +100%FREE /dev/vg_main/lv_data
Step 4: Online filesystem expand
EXT4:
sudo resize2fs /dev/vg_main/lv_data
XFS:
sudo xfs_growfs /data
5. LVM Reduction (Dangerous!)
- XFS cannot shrink
- Safer: create a new LV and rsync to migrate
- EXT4 can shrink but only offline
EXT4 shrinking safe procedure
sudo systemctl stop nginx
sudo umount /data
sudo e2fsck -f /dev/vg_main/lv_data
sudo resize2fs /dev/vg_main/lv_data 200G
sudo lvreduce -L 200G /dev/vg_main/lv_data
sudo mount /data
df -h /data
6. Common Errors & Troubleshooting
❗ device is busy
umount: /data: target is busy.
sudo lsof +f -- /data
sudo fuser -vm /data
❗ VG has no free space
sudo vgs
sudo pvs
❗ lvextend done but df -h unchanged
# EXT4
sudo resize2fs /dev/vg_main/lv_data
# XFS
sudo xfs_growfs /data
Proxmox VM expansion scenario
sudo pvresize /dev/sda2
sudo lvextend -L +50G /dev/vg_main/lv_data
sudo xfs_growfs /data
7. LVM Quick Command Sheet
pvs / vgs / lvs → overview
pvcreate → create PV
vgcreate → create VG
vgextend → add PV to VG
lvcreate → create LV
lvextend → expand LV
resize2fs/xfs_growfs → grow filesystem
lvreduce + resize2fs → shrink EXT4 only
Conclusion
LVM gives Linux servers true flexibility. Once you practice the workflow — PV → VG → LV → filesystem resize — disk management becomes predictable and risk-free. This is especially essential for Proxmox, database servers, logging nodes, and any fast-growing storage environment.
๐ Related Articles
- ๐ง Linux Filesystem Comparison: EXT4, XFS, Btrfs, ZFS
- ๐ง Linux systemd Deep Dive
- ๐ง Linux Nginx Reverse Proxy & Load Balancing Guide
— WWFandy・Linux LVM Guide (English Edition)
ๆฒๆ็่จ:
ๅผต่ฒผ็่จ