็†ฑ้–€ๅˆ†้กž
 ่ผ‰ๅ…ฅไธญ…
็›ฎ้Œ„

๐Ÿง Linux LVM Complete Guide: PV / VG / LV Expansion, Reduction & Online Filesystem Resize

    ๐Ÿง 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

    — WWFandy・Linux LVM Guide (English Edition)

    ๐Ÿ”— ๅˆ†ไบซ้€™็ฏ‡ LINE Facebook X

    ๆฒ’ๆœ‰็•™่จ€:

    ๅผต่ฒผ็•™่จ€

    ๅญ—็ดš