LVM (Logical Volume Manager) คือเลเยอร์การจัดการ Storage บน Linux ที่อยู่ระหว่าง Physical Disk และ Filesystem ช่วยให้สามารถขยาย ย้าย หรือปรับขนาด Volume ได้อย่างยืดหยุ่นโดยไม่ต้องยุ่งกับ Physical Partition โดยตรง ซึ่งเป็นข้อจำกัดสำคัญของการแบ่ง Partition แบบดั้งเดิม
บทความนี้อธิบาย Architecture ของ LVM ตั้งแต่ Physical Volume (PV), Volume Group (VG) และ Logical Volume (LV) รวมถึงคำสั่งที่ใช้งานบ่อยในการสร้าง ขยาย ลด และ Snapshot Volume บน Production Server
LVM Architecture
LVM แบ่งการทำงานออกเป็น 3 ชั้น ทำให้สามารถรวม Physical Disk หลายลูกเข้าเป็น Pool และแจกจ่ายพื้นที่ให้ Logical Volume ได้อย่างยืดหยุ่น
# โครงสร้าง LVM
#
# Physical Disk/Partition
# /dev/sdb1 /dev/sdc1 /dev/sdd1
# ↓ ↓ ↓
# ┌─────────────────────────────────┐
# │ Physical Volume (PV) │
# │ pvcreate /dev/sdb1 /dev/sdc1 │
# └─────────────────────────────────┘
# ↓
# ┌─────────────────────────────────┐
# │ Volume Group (VG) │
# │ vgcreate data_vg /dev/sdb1 ... │
# │ (Pool of Physical Extents) │
# └─────────────────────────────────┘
# ↓ ↓
# ┌──────────────┐ ┌──────────────┐
# │ Logical Vol │ │ Logical Vol │
# │ lv_data 50G │ │ lv_logs 10G │
# └──────────────┘ └──────────────┘
# ↓ ↓
# /dev/data_vg/lv_data /dev/data_vg/lv_logs
# (Formatted with ext4/xfs)
# Physical Extent (PE) — หน่วยย่อยที่สุดใน VG (ค่าเริ่มต้น 4MB)
ติดตั้งและตรวจสอบ LVM
# ติดตั้ง LVM tools
sudo apt install lvm2 # Ubuntu/Debian
sudo dnf install lvm2 # RHEL/Rocky
# ตรวจสอบ LVM ที่มีอยู่
sudo pvs # แสดง Physical Volumes
sudo vgs # แสดง Volume Groups
sudo lvs # แสดง Logical Volumes
# แสดงข้อมูลละเอียด
sudo pvdisplay
sudo vgdisplay
sudo lvdisplay
# แสดงโครงสร้าง LVM ทั้งหมด
sudo lsblk
sudo lvmdiskscan # สแกนหา Device ที่ใช้กับ LVM
สร้าง LVM ใหม่
ขั้นตอนที่ 1: สร้าง Physical Volume (PV)
# สร้าง Physical Volume จาก Disk หรือ Partition
sudo pvcreate /dev/sdb
sudo pvcreate /dev/sdb1 /dev/sdc1 # หลาย PV พร้อมกัน
# ตรวจสอบ PV ที่สร้างแล้ว
sudo pvs
sudo pvdisplay /dev/sdb
# ตัวอย่าง Output ของ pvs
# PV VG Fmt Attr PSize PFree
# /dev/sdb lvm2 --- 100.00g 100.00g ← ยังไม่ได้เพิ่มใน VG
# /dev/sdb1 data_vg lvm2 a-- 50.00g 0 ← อยู่ใน VG แล้ว
ขั้นตอนที่ 2: สร้าง Volume Group (VG)
# สร้าง VG จาก PV เดียว
sudo vgcreate data_vg /dev/sdb
# สร้าง VG จากหลาย PV (รวม Disk เป็น Pool เดียว)
sudo vgcreate data_vg /dev/sdb /dev/sdc
# ระบุขนาด Physical Extent (PE) ที่ต้องการ
sudo vgcreate -s 8m data_vg /dev/sdb # PE ขนาด 8MB (ค่าเริ่มต้น 4MB)
# ตรวจสอบ VG
sudo vgs
sudo vgdisplay data_vg
# ตัวอย่าง Output ของ vgs
# VG #PV #LV #SN Attr VSize VFree
# data_vg 2 3 1 wz--n- 199.99g 89.99g
ขั้นตอนที่ 3: สร้าง Logical Volume (LV)
# สร้าง LV ขนาด 50GB จาก data_vg
sudo lvcreate -L 50G -n lv_data data_vg
# สร้าง LV โดยระบุขนาดเป็นเปอร์เซ็นต์ของ VG
sudo lvcreate -l 100%FREE -n lv_data data_vg # ใช้พื้นที่ที่เหลือทั้งหมด
sudo lvcreate -l 50%VG -n lv_data data_vg # ใช้ 50% ของ VG
# สร้าง LV พร้อม Striping (กระจายข้อมูลบน 2 PV เพื่อประสิทธิภาพ)
sudo lvcreate -L 50G -n lv_stripe -i 2 data_vg
# ตรวจสอบ LV
sudo lvs
sudo lvdisplay data_vg/lv_data
# Device Path ของ LV คือ:
# /dev/data_vg/lv_data
# หรือ /dev/mapper/data_vg-lv_data
ขั้นตอนที่ 4: Format และ Mount LV
# Format ด้วย ext4
sudo mkfs.ext4 /dev/data_vg/lv_data
# Format ด้วย xfs
sudo mkfs.xfs /dev/data_vg/lv_data
# สร้าง Mount Point และ Mount
sudo mkdir -p /data
sudo mount /dev/data_vg/lv_data /data
# เพิ่มใน /etc/fstab ให้ Mount อัตโนมัติ
echo "/dev/data_vg/lv_data /data ext4 defaults 0 2" | sudo tee -a /etc/fstab
# ตรวจสอบ
df -h /data
ขยาย LV และ Filesystem
การขยาย LV เป็นหนึ่งในความสามารถหลักของ LVM ที่ทำได้แม้ Filesystem กำลัง Mount อยู่ (สำหรับ ext4 และ xfs)
# ขยาย LV เพิ่มอีก 20GB
sudo lvextend -L +20G /dev/data_vg/lv_data
# ขยาย LV ให้ครอบคลุมพื้นที่ว่างทั้งหมดใน VG
sudo lvextend -l +100%FREE /dev/data_vg/lv_data
# ขยาย LV พร้อมขยาย Filesystem ทันที (ext4)
sudo lvextend -L +20G -r /dev/data_vg/lv_data
# -r = --resizefs : รัน resize2fs หรือ xfs_growfs อัตโนมัติ
# ขยาย Filesystem แยก (ถ้าไม่ใช้ -r)
# ext4 (ขยายได้ขณะ Mount)
sudo resize2fs /dev/data_vg/lv_data
# xfs (ขณะ Mount อยู่เท่านั้น — xfs ขยาย offline ไม่ได้)
sudo xfs_growfs /data
# ตรวจสอบผล
df -h /data
sudo lvs
ลด LV (Shrink) — ext4 เท่านั้น
# ⚠️ xfs ไม่รองรับการลดขนาด — ใช้ได้เฉพาะ ext4
# ⚠️ ต้อง Unmount ก่อนลด Filesystem และ LV เสมอ
# 1. Unmount
sudo umount /data
# 2. ตรวจสอบ Filesystem
sudo e2fsck -f /dev/data_vg/lv_data
# 3. ลด Filesystem ก่อน (ต้องเล็กกว่า LV ที่จะลด)
sudo resize2fs /dev/data_vg/lv_data 40G # ลด Filesystem เป็น 40GB
# 4. ลด LV
sudo lvreduce -L 40G /dev/data_vg/lv_data
# 5. Mount กลับ
sudo mount /data
# ตรวจสอบ
df -h /data
เพิ่ม PV เข้า VG (ขยาย Storage Pool)
# เพิ่ม Disk ใหม่ /dev/sdd เข้า VG
sudo pvcreate /dev/sdd
sudo vgextend data_vg /dev/sdd
# ตรวจสอบ VG ที่ขยายแล้ว
sudo vgs
sudo vgdisplay data_vg
# หลังจากนี้สามารถขยาย LV ได้โดยใช้พื้นที่ใหม่จาก /dev/sdd
sudo lvextend -L +100G /dev/data_vg/lv_data
sudo resize2fs /dev/data_vg/lv_data
LVM Snapshot
LVM Snapshot ช่วยให้สร้างภาพนิ่งของ LV ในเวลานั้น ๆ โดยไม่ต้อง Downtime เหมาะสำหรับทำ Backup ก่อน Upgrade หรือ Database Migration
# สร้าง Snapshot ของ lv_data ขนาด 5GB (เก็บ changes หลัง snapshot)
sudo lvcreate -s -L 5G -n lv_data_snap /dev/data_vg/lv_data
# ตรวจสอบ Snapshot
sudo lvs
# Output
# LV VG Attr LSize Origin Snap%
# lv_data data_vg owi-aos--- 50.00g
# lv_data_snap data_vg swi-a-s--- 5.00g lv_data 2.45
# Mount Snapshot เพื่ออ่านข้อมูล ณ เวลาที่สร้าง
sudo mkdir -p /mnt/snap
sudo mount -o ro /dev/data_vg/lv_data_snap /mnt/snap
# Restore จาก Snapshot (Merge กลับ — ต้อง Unmount lv_data ก่อน)
sudo umount /data
sudo lvconvert --merge /dev/data_vg/lv_data_snap
# หลัง Merge: Snapshot จะหายไปอัตโนมัติ
# ลบ Snapshot ที่ไม่ต้องการ
sudo umount /mnt/snap
sudo lvremove /dev/data_vg/lv_data_snap
ย้าย PV (Migration)
# ย้ายข้อมูลจาก PV เก่า /dev/sdb ไปยัง /dev/sde (ไม่ต้อง Downtime)
sudo pvmove /dev/sdb /dev/sde
# ย้ายเฉพาะ LV ที่ต้องการ
sudo pvmove -n lv_data /dev/sdb /dev/sde
# ดูความคืบหน้า (รันอีก Terminal)
sudo pvs
# หลัง pvmove เสร็จ ลบ PV เก่าออกจาก VG
sudo vgreduce data_vg /dev/sdb
sudo pvremove /dev/sdb
ลบ LV, VG, PV
# ลบตามลำดับ: LV → VG → PV
# 1. Unmount และลบ LV
sudo umount /data
sudo sed -i '/lv_data/d' /etc/fstab # ลบออกจาก fstab
sudo lvremove /dev/data_vg/lv_data
# 2. ลบ VG
sudo vgremove data_vg
# 3. ลบ PV
sudo pvremove /dev/sdb /dev/sdc
Script ตั้งค่า LVM แบบสมบูรณ์
#!/bin/bash
# ตั้งค่า LVM บน /dev/sdb และ /dev/sdc รวม 200GB
# สร้าง lv_data 150GB และ lv_logs 40GB
set -e
DISKS="/dev/sdb /dev/sdc"
VG="data_vg"
LV_DATA="lv_data"
LV_LOGS="lv_logs"
echo "=== 1. Create Physical Volumes ==="
sudo pvcreate $DISKS
sudo pvs
echo "=== 2. Create Volume Group ==="
sudo vgcreate $VG $DISKS
sudo vgs
echo "=== 3. Create Logical Volumes ==="
sudo lvcreate -L 150G -n $LV_DATA $VG
sudo lvcreate -L 40G -n $LV_LOGS $VG
sudo lvs
echo "=== 4. Format ==="
sudo mkfs.ext4 /dev/$VG/$LV_DATA
sudo mkfs.ext4 /dev/$VG/$LV_LOGS
echo "=== 5. Mount ==="
sudo mkdir -p /data /var/log/apps
sudo mount /dev/$VG/$LV_DATA /data
sudo mount /dev/$VG/$LV_LOGS /var/log/apps
echo "=== 6. Add to fstab ==="
echo "/dev/$VG/$LV_DATA /data ext4 defaults 0 2" | sudo tee -a /etc/fstab
echo "/dev/$VG/$LV_LOGS /var/log/apps ext4 defaults 0 2" | sudo tee -a /etc/fstab
echo "=== Done ==="
df -h /data /var/log/apps
สรุป
LVM แก้ปัญหาหลักของ Partition แบบดั้งเดิม ด้วยความยืดหยุ่นในการขยาย ย้าย และ Snapshot Volume โดยไม่ต้อง Downtime ลำดับการสร้างคือ Physical Volume (PV) → Volume Group (VG) → Logical Volume (LV) คำสั่งสำคัญคือ pvcreate, vgcreate, lvcreate สำหรับสร้าง, lvextend -r สำหรับขยายพร้อม Filesystem และ lvcreate -s สำหรับ Snapshot ข้อควรระวังคือ xfs ไม่รองรับการลดขนาด และการ Shrink ext4 ต้องทำขณะ Unmount เท่านั้น
แนะนำบริการ DE
การใช้งาน LVM บน Production Server ต้องการสิทธิ์ Root และ Disk ที่สามารถเพิ่มได้ Cloud VPS ของ DE รองรับการ Attach Volume Storage เพิ่มเติมและให้ Root Access เต็มรูปแบบ ทำให้สามารถตั้งค่า LVM สำหรับ Production Database หรือ Application ที่ต้องการ Storage ยืดหยุ่นได้อย่างอิสระ
หากต้องการโฮสต์เว็บไซต์โดยไม่ต้องจัดการ Storage Layer เอง Cloud Hosting ของ DE มีระบบจัดการ Storage อัตโนมัติพร้อม Upgrade Quota ได้ผ่าน Control Panel

