จัดการ Disk ด้วย LVM บน VPS Linux
LVM (Logical Volume Manager) คือ layer การจัดการ disk บน Linux ที่ทำให้คุณสามารถขยาย ลดขนาด หรือย้าย partition ได้แบบ on-the-fly โดยไม่ต้อง reformat หรือ downtime แทนที่จะแบ่ง disk เป็น partition แบบตายตัว LVM สร้าง abstraction layer ขึ้นมาระหว่าง physical disk กับ filesystem ทำให้ยืดหยุ่นกว่ามาก เหมาะมากสำหรับ VPS ที่ต้องการขยาย storage ภายหลัง
ทำความเข้าใจ LVM Architecture
LVM มี 3 ชั้น:
- PV (Physical Volume) — disk หรือ partition จริง เช่น
/dev/sdb,/dev/sdc - VG (Volume Group) — กลุ่มของ PV หลายตัวรวมเป็น storage pool เดียว เช่น
vg_data - LV (Logical Volume) — partition เสมือนที่ตัดออกมาจาก VG ใช้ mount เป็น filesystem เช่น
/dev/vg_data/lv_home
| คำสั่ง | ความหมาย | ตัวอย่าง |
|---|---|---|
pvcreate | สร้าง Physical Volume | pvcreate /dev/sdb |
vgcreate | สร้าง Volume Group | vgcreate vg_data /dev/sdb |
lvcreate | สร้าง Logical Volume | lvcreate -L 20G -n lv_data vg_data |
lvextend | ขยาย Logical Volume | lvextend -L +10G /dev/vg_data/lv_data |
lvs / vgs / pvs | แสดงสถานะ | lvs |
1. ติดตั้ง LVM Tools
# Debian / Ubuntu
apt update && apt install lvm2 -y
# CentOS / AlmaLinux / Rocky
dnf install lvm2 -y
# ตรวจสอบว่าติดตั้งแล้ว
lvm version
pvs เพื่อเช็คว่ามี PV อยู่แล้วหรือเปล่า ถ้าไม่มี output แสดงว่ายังไม่ได้ใช้ LVM2. เพิ่ม Disk ใหม่เป็น Physical Volume
ใน VPS ปกติจะ attach disk เพิ่มผ่าน control panel แล้ว disk ใหม่จะปรากฏเป็น /dev/sdb หรือ /dev/vdb:
# ดู disk ที่มีอยู่ทั้งหมด
lsblk
fdisk -l
# สร้าง Physical Volume บน disk ใหม่
pvcreate /dev/sdb
# ตรวจสอบ
pvs
# ผลลัพธ์ตัวอย่าง:
# PV VG Fmt Attr PSize PFree
# /dev/sdb lvm2 --- 50.00g 50.00g
3. สร้าง Volume Group
# สร้าง VG ชื่อ vg_data จาก /dev/sdb
vgcreate vg_data /dev/sdb
# ถ้ามีหลาย disk รวมเข้าด้วยกัน
vgcreate vg_data /dev/sdb /dev/sdc
# ตรวจสอบ VG
vgs
# ผลลัพธ์:
# VG #PV #LV #SN Attr VSize VFree
# vg_data 1 0 0 wz--n- 50.00g 50.00g
vgdisplay vg_data
4. สร้าง Logical Volume และ Filesystem
# สร้าง LV ขนาด 20 GB ชื่อ lv_data
lvcreate -L 20G -n lv_data vg_data
# หรือใช้ % ของ VG ทั้งหมด (100% = ใช้หมด)
lvcreate -l 100%FREE -n lv_data vg_data
# Format เป็น ext4
mkfs.ext4 /dev/vg_data/lv_data
# หรือ xfs (แนะนำสำหรับ large file)
mkfs.xfs /dev/vg_data/lv_data
# Mount
mkdir -p /mnt/data
mount /dev/vg_data/lv_data /mnt/data
# ตั้งให้ mount ตอน boot ใน /etc/fstab
echo '/dev/vg_data/lv_data /mnt/data ext4 defaults 0 2' >> /etc/fstab
# ทดสอบ fstab
mount -a && df -h /mnt/data
5. ขยาย Logical Volume แบบ Online (ไม่ต้อง Unmount)
นี่คือจุดเด่นที่สุดของ LVM — ขยาย storage ขณะ server ยังทำงานอยู่:
# ขยาย LV เพิ่มอีก 10 GB
lvextend -L +10G /dev/vg_data/lv_data
# ขยาย LV ให้ใช้ free space ที่เหลือทั้งหมด
lvextend -l +100%FREE /dev/vg_data/lv_data
# ขยาย filesystem ให้ตาม LV (ext4)
resize2fs /dev/vg_data/lv_data
# สำหรับ xfs (ต้อง mount อยู่ก่อน)
xfs_growfs /mnt/data
# ตรวจสอบผลลัพธ์
df -h /mnt/data
lvextend -r (resize พร้อมกัน) ใช้กับ ext4 ได้ในทีเดียว: lvextend -L +10G -r /dev/vg_data/lv_data — ไม่ต้องรัน resize2fs แยก6. เพิ่ม Disk เข้า Volume Group ที่มีอยู่แล้ว
# Attach disk ใหม่ /dev/sdc แล้วสร้าง PV
pvcreate /dev/sdc
# เพิ่มเข้า VG ที่มีอยู่แล้ว
vgextend vg_data /dev/sdc
# ตรวจสอบ free space ใน VG ที่เพิ่มขึ้น
vgs vg_data
# ขยาย LV ให้ใช้ space ที่เพิ่มมา
lvextend -l +100%FREE /dev/vg_data/lv_data
resize2fs /dev/vg_data/lv_data
7. LVM Snapshot — Backup ก่อน Upgrade
Snapshot คือฟีเจอร์ที่ทำให้คุณ "แช่แข็ง" สถานะ LV ณ เวลาใดเวลาหนึ่ง เหมาะสำหรับทำ backup ก่อนอัปเกรด database หรือ update system:
# สร้าง snapshot ขนาด 5 GB (พื้นที่เก็บ diff)
lvcreate -L 5G -s -n lv_data_snap /dev/vg_data/lv_data
# ตรวจสอบ snapshot
lvs
# จะเห็น lv_data_snap มี Attr: swi-a-s---
# Mount snapshot เพื่ออ่านข้อมูล (read-only)
mkdir -p /mnt/snap
mount -o ro /dev/vg_data/lv_data_snap /mnt/snap
# ลบ snapshot เมื่อไม่ต้องการ
umount /mnt/snap
lvremove /dev/vg_data/lv_data_snap
8. Restore จาก Snapshot
# ต้อง unmount LV หลักก่อน (ถ้า LV ไม่ใช่ root)
umount /mnt/data
# Merge snapshot กลับ (revert ไปสถานะตอน snapshot)
lvconvert --merge /dev/vg_data/lv_data_snap
# Reboot เพื่อให้ merge มีผล (สำหรับ root filesystem ต้องเปิด reboot)
reboot
9. ย้าย Data ระหว่าง Physical Volume (pvmove)
# ดูว่า data อยู่ที่ PV ไหน
pvs -o+pv_used
# ย้าย data ออกจาก /dev/sdb ไป /dev/sdc
pvmove /dev/sdb /dev/sdc
# หรือย้ายเฉพาะ LV ที่ต้องการ
pvmove -n /dev/vg_data/lv_data /dev/sdb /dev/sdc
# เมื่อย้ายเสร็จ ลบ PV เก่าออกจาก VG
vgreduce vg_data /dev/sdb
# ลบ PV label
pvremove /dev/sdb
ตรวจสอบว่า LVM ทำงานถูกต้อง
# ดูสถานะ PV, VG, LV ทั้งหมด
pvs
vgs
lvs
# ดูรายละเอียดเต็ม
pvdisplay
vgdisplay
lvdisplay
# ตรวจสอบ filesystem บน LV
df -h /mnt/data
mount | grep lv_data
# ตรวจสอบ device mapper
ls -la /dev/mapper/
ls -la /dev/vg_data/
# ตรวจสอบว่า fstab ถูกต้อง
findmnt --verify --fstab
vgscan && lvscan เพื่อให้ LVM สแกน PV/VG/LV ใหม่ ใช้หลัง attach disk หรือหลัง restore จาก backupแก้ปัญหาที่พบบ่อย
Error: "Can't open /dev/sdb exclusively"
Disk กำลังถูกใช้งานอยู่หรือ partition table ยังค้างอยู่ ต้องตรวจสอบและ unmount ก่อน
# ตรวจสอบว่า disk ถูก mount อยู่หรือเปล่า
lsof /dev/sdb
umount /dev/sdb
# ถ้ายังไม่ได้ ลอง partprobe เพื่อ reload partition table
partprobe /dev/sdb
# จากนั้นลอง pvcreate ใหม่
pvcreate /dev/sdb
Error: "Insufficient free space" ตอน lvcreate
VG ไม่มีพื้นที่เพียงพอ ตรวจสอบ free space ด้วย vgs
# ดู free space ใน VG
vgs
# คอลัมน์ VFree แสดงพื้นที่ว่างที่ใช้ได้
# ถ้าต้องการพื้นที่เพิ่ม ต้องเพิ่ม PV ใหม่เข้า VG
pvcreate /dev/sdc
vgextend vg_data /dev/sdc
Error: "resize2fs: Device or resource busy"
filesystem กำลัง mount อยู่แบบ read-write ไม่สามารถ shrink ได้ขณะ mount สำหรับการขยายใหญ่ขึ้นทำได้โดยไม่ต้อง unmount
# สำหรับการขยาย (ทำได้ขณะ mount)
lvextend -L +10G /dev/vg_data/lv_data
resize2fs /dev/vg_data/lv_data
# สำหรับการย่อขนาด ต้อง unmount ก่อน
umount /mnt/data
e2fsck -f /dev/vg_data/lv_data
resize2fs /dev/vg_data/lv_data 15G
lvreduce -L 15G /dev/vg_data/lv_data
mount /dev/vg_data/lv_data /mnt/data
Error: "Volume group not found" หลัง reboot
LVM daemon ไม่ได้ scan VG ตอน boot ต้องตรวจสอบ service และ initramfs
# เปิดใช้ lvm2 service
systemctl enable lvm2-lvmetad.service
systemctl enable lvm2-monitor.service
# อัปเดต initramfs ให้รู้จัก LVM
update-initramfs -u
# สำหรับ RHEL/CentOS
dracut --force
# Reboot แล้วตรวจสอบ
reboot
vgs
Error: "Snapshot LV is full"
Snapshot เต็มเพราะมีการเขียนข้อมูลมากหลัง snapshot Snapshot ที่เต็มจะ invalid
# ตรวจสอบ snapshot usage
lvs -o lv_name,snap_percent /dev/vg_data/lv_data_snap
# ขยาย snapshot ก่อนเต็ม
lvextend -L +2G /dev/vg_data/lv_data_snap
# ถ้า snapshot เต็มแล้ว ต้องลบและสร้างใหม่
lvremove /dev/vg_data/lv_data_snap
lvcreate -L 10G -s -n lv_data_snap /dev/vg_data/lv_data
คำถามที่พบบ่อย
LVM กับการแบ่ง partition แบบปกติต่างกันอย่างไร?
Partition แบบปกติ (MBR/GPT) มีขนาดตายตัว เปลี่ยนขนาดยากและต้องหยุดระบบ LVM เพิ่มชั้น abstraction ทำให้ขยายหรือย่อ volume ได้แบบ online, รวม disk หลายก้อนเข้าด้วยกัน, ทำ snapshot, และย้าย data ระหว่าง disk ได้โดยไม่ downtime เหมาะมากกับ server ที่ storage ต้องโต
ใช้ LVM กับ SSD NVMe บน VPS ได้หรือเปล่า?
ได้ครับ LVM ทำงานกับ disk ทุกประเภท ไม่ว่าจะเป็น HDD, SSD, NVMe, หรือ virtual disk (vda, vdb) บน VPS ประสิทธิภาพไม่ต่างกับการ mount ตรงๆ เพราะ LVM layer มี overhead น้อยมาก (< 1%)
ถ้า VPS ใช้ root filesystem อยู่บน LVM แล้ว ขยายได้ไหม?
ได้ครับ แต่ต้องขยาย disk จาก control panel ของ VPS ก่อน จากนั้นใช้ growpart ขยาย PV partition แล้ว pvresize และ lvextend + resize2fs ตามลำดับ บาง VPS provider มี tool อัตโนมัติให้แล้ว