ลดความยุ่งยากในการใช้คลาวด์ พูดคุยกับเจ้าหน้าที่

Home ขยาย Logical Volume (LVM) บน Linux

ขยาย Logical Volume (LVM) บน Linux

LVM (Logical Volume Manager) เป็นชั้นจัดการดิสก์ที่ทำให้ขยายพื้นที่ได้โดยไม่ต้องย้ายข้อมูลหรือปิดเครื่อง Ubuntu Server และ AlmaLinux/Rocky Linux ที่ติดตั้งแบบมาตรฐานมักใช้ LVM สำหรับ / อยู่แล้ว เมื่อพื้นที่ใกล้เต็มและคุณได้เพิ่มขนาดดิสก์หรือเพิ่มดิสก์ใหม่ให้เซิร์ฟเวอร์แล้ว บทความนี้จะพาขยาย Logical Volume และ Filesystem ให้ใช้พื้นที่ใหม่นั้น

LVM มี 3 ชั้น คือ Physical Volume (PV) ซึ่งเป็นดิสก์หรือพาร์ติชัน, Volume Group (VG) ซึ่งเป็นกองพื้นที่รวมจาก PV หลายตัว และ Logical Volume (LV) ซึ่งเป็นส่วนที่แบ่งจาก VG ไปสร้าง Filesystem การขยายจึงต้องทำจากล่างขึ้นบน: ขยาย PV หรือเพิ่ม PV ใหม่เข้า VG แล้วจึงขยาย LV และ Filesystem

สิ่งที่ต้องเตรียม

  • เซิร์ฟเวอร์ Ubuntu 22.04/24.04 หรือ AlmaLinux/Rocky Linux 8-9 ที่ใช้ LVM และสิทธิ์ sudo
  • พื้นที่ดิสก์ที่เพิ่มแล้วจากฝั่งผู้ให้บริการ (ขยายดิสก์เดิม หรือเพิ่มดิสก์ใหม่) ดู Volume Disk บน Cloud ของ TDC
  • ข้อมูลสำรองหรือ Snapshot ล่าสุด แม้การขยายจะปลอดภัยโดยทั่วไป แต่การพิมพ์ชื่อดิสก์ผิดอาจทำลายข้อมูลได้ ดู การ Backup Server บน Cloud ของ TDC

หมายเหตุ: ถ้าเครื่องของคุณไม่ได้ใช้ LVM (ผลของ lsblk ไม่มีบรรทัดชนิด lvm) ให้ทำตามบทความ การขยายพื้นที่ Partition หลังเพิ่มพื้นที่ Disk Space (Linux) แทน

ขั้นตอนที่ 1: สำรวจโครงสร้างดิสก์ปัจจุบัน

lsblk
sudo pvs
sudo vgs
sudo lvs
df -hT

ตัวอย่างผลของ lsblk บน Ubuntu

NAME                      MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
vda                       252:0    0  100G  0 disk
├─vda1                    252:1    0    1M  0 part
├─vda2                    252:2    0    2G  0 part /boot
└─vda3                    252:3    0   48G  0 part
  └─ubuntu--vg-ubuntu--lv 253:0    0   48G  0 lvm  /

จากตัวอย่างนี้ ดิสก์ vda ถูกขยายเป็น 100G แล้ว แต่พาร์ติชัน vda3 ที่เป็น PV ยังมีขนาด 48G ชื่อดิสก์ในเครื่องของคุณอาจเป็น sda หรือ vda ให้ใช้ชื่อตามผลจริงเสมอ ส่วนชื่อ VG และ LV ดูได้จาก vgs และ lvs เช่น Ubuntu ใช้ ubuntu-vg/ubuntu-lv ส่วน AlmaLinux/Rocky มักเป็น almalinux/root หรือ rl/root

ให้ดูคอลัมน์ VFree ของ vgs ด้วย ถ้ามีพื้นที่ว่างเหลืออยู่แล้ว สามารถข้ามไปขั้นตอนที่ 4 ได้เลย กรณีนี้พบบ่อยบน Ubuntu เพราะตัวติดตั้งมักสร้าง LV ไม่เต็ม VG

ขั้นตอนที่ 2 (กรณี A): ขยาย PV หลังขยายดิสก์เดิม

ถ้า lsblk ยังแสดงขนาดดิสก์เดิม ให้สั่งให้ Kernel อ่านขนาดดิสก์ใหม่ (เปลี่ยน vda ตามเครื่องของคุณ)

echo 1 | sudo tee /sys/class/block/vda/device/rescan

ถ้าไม่มีไฟล์ rescan สำหรับดิสก์ชนิดนั้น ให้รีบูตเครื่องหนึ่งครั้ง จากนั้นติดตั้งเครื่องมือ growpart

# Ubuntu
sudo apt install cloud-guest-utils
# AlmaLinux / Rocky
sudo dnf install cloud-utils-growpart

ขยายพาร์ติชันที่ 3 ของดิสก์ vda ให้เต็มพื้นที่ แล้วขยาย PV ตาม (สังเกตว่า growpart ใส่ชื่อดิสก์กับเลขพาร์ติชันแยกกันด้วยช่องว่าง)

sudo growpart /dev/vda 3
sudo pvresize /dev/vda3

ผลที่คาดหวังคือ CHANGED: partition=3 ... และ 1 physical volume(s) resized จากนั้น sudo vgs ต้องแสดง VFree เพิ่มขึ้น growpart ทำงานได้ขณะระบบกำลังใช้งาน และจะขยายได้เฉพาะพาร์ติชันสุดท้ายที่มีพื้นที่ว่างต่อท้ายเท่านั้น

ขั้นตอนที่ 3 (กรณี B): เพิ่มดิสก์ใหม่เข้า Volume Group

ถ้าคุณเพิ่มดิสก์ลูกใหม่ เช่น vdb ให้ยืนยันก่อนว่าดิสก์นั้นว่างจริงและไม่มีการ Mount

lsblk -f /dev/vdb

ถ้าคอลัมน์ FSTYPE ว่างและไม่มีพาร์ติชัน จึงสร้าง PV และเพิ่มเข้า VG

sudo pvcreate /dev/vdb
sudo vgextend ubuntu-vg /dev/vdb

หมายเหตุ: pvcreate เขียนทับส่วนหัวของดิสก์ ถ้าเลือกดิสก์ผิดลูก ข้อมูลในดิสก์นั้นจะเข้าถึงไม่ได้ ตรวจชื่อดิสก์และขนาดให้ตรงกับที่เพิ่มไปก่อนกด Enter ทุกครั้ง อีกข้อที่ควรรู้คือ LV ที่กระจายอยู่บนหลายดิสก์จะเสียหายทั้งก้อนถ้าดิสก์ลูกใดลูกหนึ่งหาย ถ้าต้องการแยกข้อมูลไว้ในดิสก์ของตัวเอง การ Mount ดิสก์ใหม่เป็นโฟลเดอร์แยกอาจเหมาะกว่า ดู Mount ดิสก์แบบถาวรด้วย /etc/fstab และ UUID

ขั้นตอนที่ 4: ขยาย Logical Volume และ Filesystem

เมื่อ VG มีพื้นที่ว่างแล้ว ขยาย LV ด้วยคำสั่งเดียวที่ขยาย Filesystem ไปพร้อมกัน

sudo lvextend -r -l +100%FREE /dev/ubuntu-vg/ubuntu-lv

-l +100%FREE ใช้พื้นที่ว่างทั้งหมดของ VG ถ้าต้องการเพิ่มเป็นจำนวนแน่นอนให้ใช้ -L +20G แทน ส่วน -r สั่งให้ขยาย Filesystem ต่อทันที โดยเลือกเครื่องมือให้เองตามชนิด ผลที่คาดหวังคือ Logical volume ubuntu-vg/ubuntu-lv successfully resized ตามด้วยข้อความจาก resize2fs หรือ xfs_growfs

ถ้าขยาย LV ไปแล้วแต่ลืมใส่ -r ให้ขยาย Filesystem แยกตามชนิดที่เห็นในคอลัมน์ Type ของ df -hT

Filesystemคำสั่งสิ่งที่ระบุ
ext4 (ค่าเริ่มต้นของ Ubuntu)sudo resize2fs /dev/ubuntu-vg/ubuntu-lvอุปกรณ์ของ LV
XFS (ค่าเริ่มต้นของ AlmaLinux/Rocky)sudo xfs_growfs /Mount Point

ทั้งสองแบบขยายได้ขณะ Mount และใช้งานอยู่ ไม่ต้องหยุด Service

ตัวอย่างบน AlmaLinux / Rocky

เครื่อง AlmaLinux 9 ที่ดิสก์ sda ถูกขยาย และ PV อยู่ที่ sda3 ใน VG ชื่อ almalinux

sudo growpart /dev/sda 3
sudo pvresize /dev/sda3
sudo lvextend -r -l +100%FREE /dev/almalinux/root
df -hT /

ตรวจสอบผลลัพธ์

sudo pvs
sudo vgs
sudo lvs
df -hT /

คอลัมน์ VFree ควรเหลือ 0 (ถ้าใช้ 100%FREE) ขนาด LV ใน lvs และคอลัมน์ Size ใน df -hT ต้องเพิ่มขึ้นตามพื้นที่ที่เพิ่ม ถ้า lvs เพิ่มแต่ df ไม่เพิ่ม แปลว่ายังไม่ได้ขยาย Filesystem

ปัญหาที่พบบ่อย

growpart: NOCHANGE: partition 3 is size ... it cannot be grown

Kernel ยังไม่เห็นขนาดดิสก์ใหม่ หรือพาร์ติชันนั้นไม่ใช่พาร์ติชันสุดท้าย ตรวจ lsblk อีกครั้ง ทำ rescan หรือรีบูต ถ้ามีพาร์ติชันอื่นต่อท้าย (เช่น Swap) จะขยายด้วย growpart ไม่ได้ ให้ใช้วิธีเพิ่มดิสก์ใหม่ตามกรณี B

Insufficient free space

VG ไม่มีพื้นที่ว่างตามที่ขอ ตรวจ VFree ด้วย vgs และตรวจว่าทำ pvresize หรือ vgextend แล้ว หรือใช้ -l +100%FREE แทนการระบุขนาดตายตัว

Can't open /dev/vdb exclusively. Mounted filesystem?

ดิสก์กำลังถูกใช้งานหรือถูก Mount อยู่ แปลว่าอาจไม่ใช่ดิสก์ว่างที่เพิ่งเพิ่ม ให้หยุดและตรวจสอบด้วย lsblk -f ก่อนดำเนินการต่อ

ต้องการลดขนาด LV

XFS ลดขนาดไม่ได้เลย ส่วน ext4 ลดได้แต่ต้อง Unmount และมีความเสี่ยงสูง ในทางปฏิบัติควรสร้าง LV ใหม่ขนาดที่ต้องการแล้วย้ายข้อมูล หรือปรึกษาทีมงานก่อน ทางที่ดีคือขยายทีละน้อยตามความจำเป็น แทนการขยายเผื่อไว้มาก ๆ

หากทำตามขั้นตอนแล้วยังติดปัญหา สามารถติดต่อทีมงาน THAI DATA CLOUD ได้ที่ https://thaidata.cloud/contact/ โดยแจ้งชื่อเซิร์ฟเวอร์ ระบบปฏิบัติการ คำสั่งที่ใช้ และข้อความ Error ที่พบ เพื่อให้ตรวจสอบได้รวดเร็วขึ้น

ผู้ให้บริการคลาวด์ไทย
เพื่อธุรกิจของคนไทย

"มุ่งมั่น" และ "มั่นคง"
พร้อมรับมือทุกการเติบโต
Trust Cloud
คลาว์ที่ปลอดภัย
คือรากฐานที่มั่นคง
cloud security