ในบทความนี้เราจะพูดถึงวิธีปรับขนาดดิสก์เครื่องเสมือน KVM สำหรับรูปแบบดิสกยอดนิยม เราจะแสดงวิธีเพิ่มขนาดดิสก์ VM ใน Hypervisor KVM บน Linux อย่างถูกต้องโดยไม่สูญเสียข้อมูล และอภิปรายตัวเลือกในการลดขนาดดิสก์
วิธีเพิ่มขนาดดิสก์เครื่องเสมือน KVM (Increase/Extend)
การขยายดิสก์เสมือนบน KVM
ลองดูตัวอย่างการเพิ่มขนาดดิสก์เสมือน 20GB ให้ปิด VM ก่อนเปลี่ยนแปลงการตั้งค่าดิสก์เสมือน
เพื่อดูการตั้งค่าดิสก์เสมือนของ VM KVM ใช้คำสั่ง:
qemu-img info /path_to_disk
ผลลัพธ์จะคล้ายนี้:

เราจะเห็นสองฟิลด์ที่แสดงขนาด: virtual_size และ disk_size:
- virtual_size – ขนาดดิสก์เสมือนที่ตั้งไว้ตอนสร้างหรือขยาย (ในตัวอย่าง ขนาดสูงสุด 20GB);
- disk_size — ขนาดจริงของไฟล์ดิสก์ ปัจจุบันดิสก์ใช้พื้นที่บนเซิร์ฟเวอร์จริงเท่าไหร่ (ใช้ได้กับรูปแบบ qcow เท่านั้น) ในตัวอย่าง ดิสก์เสมือนใช้พื้นที่จริงเพียง 1.6GB
สั้นๆ เกี่ยวกับประเภทดิสก์ KVM (formats) แนะนำให้ใช้ qcow2 แทน raw เมื่อสร้าง VM ใน KVM จะอธิบายเหตุผลต่อไป
ขั้นตอนต่อไป ขยายขนาด VM เพิ่ม 5GB (เพื่อขยายดิสก์อย่างถูกต้อง VM ต้องไม่มี Snapshot!)
# qemu-img resize /path to disk +5G
Image resized.
ตรวจสอบการตั้งค่าดิสก์เสมือนอีกครั้ง จะเห็นว่าขยายแล้ว:
# qemu-img info /path_to_disk
image: /path_to_disk file format: qcow2 virtual size: 25G (26843535600 bytes) disk size: 1.6G cluster_size: 65536 Format specific information: compat: 0.10 refcount bits: 16
เราทำเสร็จครึ่งหนึ่ง แต่ยังต้องดำเนินการใน Guest OS ของ VM ด้วย ต่อไปจะแสดงวิธีขยายขนาดดิสก์ใน Guest CentOS 7 และ Windows Server 2012 R2
หากจะเพิ่มดิสก์เสมือนอีกตัวให้ VM ใน KVM Hypervisor ให้ใช้เครื่องมือ qemu-img และ virsh
วิธีขยายพาร์ติชันใน VM ที่รัน CentOS Linux
หลังเพิ่มขนาดดิสก์เสมือนฝั่ง KVM Server ให้เริ่ม VM และเชื่อมต่อ เราจะใช้เครื่องมือจัดการพาร์ติชัน fdisk เพื่อขยายพาร์ติชันและระบบไฟล์
เชื่อมต่อ VM Guest OS ผ่าน SSH และตรวจสอบว่าพื้นที่ดิสก์เพิ่ม 5GB ปรากฏแล้ว:
df –h
fdisk -l

ภาพแสดง /dev/vda2 ขนาด 20GB และพื้นที่ว่าง 25GB
ลองขยาย /dev/vda2 ให้เต็มขนาดที่มี:
# fdisk /dev/vda
Welcome to fdisk (util-linux 2.23.2). Changes will remain in memory only, until you decide to write them. Be careful before using the write command. Command (m for help): d Partition number (1,2, default 2): Partition 2 is deleted Command (m for help): n Partition type: p primary (1 primary, 0 extended, 3 free) e extended Select (default p): p Partition number (2-4, default 2): First sector (1050624-52428799, default 1050624): Using default value 1050624 Last sector, +sectors or +size{K,M,G} (1050624-52428799, default 52428799): Using default value 52428799 Partition 2 of type Linux and of size 24.5 GiB is set Command (m for help): w The partition table has been altered! Calling ioctl() to re-read partition table. WARNING: Re-reading the partition table failed with error 16: Device or resource busy. The kernel still uses the old table. The new table will be used at the next reboot or after you run partprobe(8) or kpartx(8) Syncing disks.
รีสตาร์ท VM และรันคำสั่งเพื่อใช้ขนาดดิสก์ใหม่:
# xfs_growfs /dev/vda2
meta-data=/dev/vda2 isize=512 agcount=4, agsize=1277888 blks = sectsz=512 attr=2, projid32bit=1 = crc=1 finobt=0 spinodes=0 data = bsize=4096 blocks=5111552, imaxpct=25 = sunit=0 swidth=0 blks naming =version 2 bsize=4096 ascii-ci=0 ftype=1 log =internal bsize=4096 blocks=2560, version=2 = sectsz=512 sunit=0 blks, lazy-count=1 realtime =none extsz=4096 blocks=0, rtextents=0 data blocks changed from 5111552 to 6422272
# df -h
Filesystem Size Used Avail Use% Mounted on devtmpfs 485M 0 485M 0% /dev tmpfs 496M 0 496M 0% /dev/shm tmpfs 496M 6.6M 489M 2% /run tmpfs 496M 0 496M 0% /sys/fs/cgroup /dev/vda2 25G 1.3G 24G 6% / /dev/vda1 488M 100M 353M 23% /boot tmpfs 100M 0 100M 0% /run/user/0
ผลลัพธ์: พาร์ติชัน /dev/vda2 ขยายแล้ว สรุปขั้นตอนที่ทำ:
- fdisk /dev/vda — รัน fdisk เชื่อมต่อ /dev/vda;
- d — ลบพาร์ติชัน (ค่าเริ่มต้นคือพาร์ติชัน 2 ที่ต้องการ กด Enter);
- n — สร้างพาร์ติชันใหม่ กด Enter หรือ p แล้ว Enter อีกครั้ง (พาร์ติชันใหม่จะเป็นพาร์ติชัน 2 ตามค่าเริ่มต้น);
- ระบุ sector แรกและสุดท้าย กด Enter หากต้องการขยายเต็มที่ หากต้องการขนาดเฉพาะ ใส่ขนาดใน last sector ตามเมนู +size{K,M,G};
- w — บันทึกการตั้งค่าใหม่
หลังรีสตาร์ท VM ตรวจสอบดิสก์ด้วยคำสั่ง:
xfs_growfs /dev/vda2
บางแหล่งแนะนำคำสั่ง:
resize2fs /dev/vda2
แต่คำสั่งนี้ ไม่ทำงานกับระบบไฟล์ XFS!
ดังนั้น คุณขยายขนาดดิสก์บน VM CentOS 7 เรียบร้อยแล้ว
วิธีเพิ่มขนาดดิสก์ใน Guest Windows Server
เชื่อมต่อ Windows Server VM ผ่าน RDP หรือ VNC และขยายดิสก์:
- เปิด Server Manager -> Tools -> Computer Management;
- เลือก Storage -> Disk Management ด้านซ้าย จะเห็นพาร์ติชันทั้งหมดและพื้นที่ว่างที่เพิ่มเข้ามา;

- เลือกพาร์ติชันที่ต้องการขยาย คลิก Extend Volume;

- ค่าเริ่มต้นจะเสนอพื้นที่ว่างทั้งหมดเพื่อขยาย;

- คลิก Next เพื่อเสร็จสิ้น หลังจากนั้นขนาดพาร์ติชันจะเพิ่มขึ้น

ขอแนะนำ: ก่อนขยายดิสก์ VM ควรสำรองไฟล์ดิสก์เสมือน ปิด VM และคัดลอกไฟล์ดิสก์ไปไดเรกทอรีสำรองที่มีพื้นที่ว่าง หากเกิดปัญหาขณะขยาย จะสามารถกู้คืนได้
วิธีลดขนาดดิสก์เครื่องเสมือน KVM
ในงานของผม 자주 พบปัญหานี้ แต่ก็ไม่สามารถลดขนาดดิสก์ VM ใน KVM ได้อย่างปลอดภัย วิธีเดียวที่ยอมรับได้คือการแปลงดิสก์ (convert)
มีคำแนะนำมากมายในเว็บบอกวิธีลดพื้นที่ดิสก์ใน KVM VM แต่ไม่ได้ผล
ผมจะยกตัวอย่างที่เคยทดสอบ:
การลดขนาดดิสก์ KVM ด้วย Qemu
บางแหล่งอธิบายการใช้ qemu tool ลดพื้นที่ดิสก์ VM ด้วยคำสั่ง:
qemu-img resize /path_to_disk -5G — ลดขนาด 5G
หรือกำหนดขนาดเฉพาะ:
qemu-img resize /path_to_disk 25G — กำหนดขนาด 25G
เกิดอะไรขึ้นหลังรันคำสั่ง? หลังเริ่มเซิร์ฟเวอร์ ระบบจะบูทไม่ได้:
Unable to verify superblock, continuing... Sorry, could not find valid secondary superblock. Exiting now.

ผมลองลดขนาดดิสก์ในระบบด้วย fdisk ก่อน แต่ระบบก็ยังบูทไม่ได้ แม้จะข้ามการลดขนาดบนเซิร์ฟเวอร์จริง เพราะพาร์ติชันที่ลองลดเป็นพาร์ติชันระบบ ข้อมูลถูกล้างไประหว่างการลดขนาด
การลดขนาดดิสก์เสมือนด้วยการเปลี่ยน Image
วิธีที่นิยมน้อยกว่าคือการลดพื้นที่ด้วยการเปลี่ยนดิสก์ สร้าง VM ใหม่ด้วยขนาดดิสก์ที่ต้องการ แล้วแทนที่ไฟล์ image ใหม่ด้วยของเก่า วิธีนี้ก็ทำให้ระบบไฟล์เสียหายเหมือนเดิม ตัวอย่างคำสั่ง:
virt-resize /old_disk_image /new_disk_image
ยังมีวิธีแปลงจาก raw เป็น qcow2 แต่ผมสร้างเป็น qcow2 ตั้งแต่แรก และนี่คือเหตุผล
รูปแบบดิสก์ KVM และการบีบอัดดิสก์ QCOW2
ต้นบทกล่าวถึงสองรูปแบบ: raw และ qcow
Raw ข้อดี: ประสิทธิภาพสูงสุดและความครอบคลุม แต่ข้อเสียหลัก:
- ไฟล์ดิสก์เสมือนใช้พื้นที่ทั้งหมดที่จัดสรรบนเซิร์ฟเวอร์จริง;
- ไม่สามารถสร้าง Snapshot ได้
Qcow2 เป็นรูปแบบพื้นฐานของ QEMU และ QEMU-KVM รูปแบบที่สะดวกที่สุดใน KVM ไฟล์ image ขยายตามข้อมูลที่สะสม และรองรับ Snapshot
ข้อดีของ qcow2? ไม่ต้องลดขนาดดิสก์เสมือน เพราะใช้พื้นที่จริงเท่าที่จำเป็น หากข้อมูลถูกเขียนทับซ้ำบ่อย และดิสก์พองตัว ขยายได้ง่ายด้วยการบีบอัด ลองดูตัวอย่าง: เติมพื้นที่ดิสก์ด้วยศูนย์ แล้วลบไฟล์:
dd if=/dev/zero of=/mytempfile
rm -rf /mytempfile

ตรวจสอบจากเซิร์ฟเวอร์ ก่อนหน้าขนาด image 2.4G แล้วกลายเป็น 5.9G:
# du -sh /image_path
2.4G *****
# du -sh /image_path
5.9G *****
หมายความว่าหลังลบข้อมูลใน VM ขนาดไฟล์ดิสก์เสมือนไม่หดเล็ง เพื่อให้ไฟล์ดิสก์กลับมาขนาดจริง ใช้วิธี:
สำรองไฟล์ดิสก์ ปิด VM แล้วทำ:
qemu-img convert -O qcow2 /old_image /new_image
เปรียบเทียบขนาดทั้งสอง:
# du -sh /new_disk
1.6G /****
# du -sh /old_disk
5.8G /****
เห็นว่าไฟล์ดิสก์ที่บีบอัดเหลือ 1.6G เปลี่ยนชื่อไฟล์ image ใหม่ตามต้องการ และเริ่ม VM:
# df -h
Filesystem Size Used Avail Use% Mounted on devtmpfs 485M 0 485M 0% /dev tmpfs 496M 0 496M 0% /dev/shm tmpfs 496M 6.6M 489M 2% /run tmpfs 496M 0 496M 0% /sys/fs/cgroup /dev/vda2 25G 1.3G 24G 6% / /dev/vda1 488M 100M 353M 23% /boot tmpfs 100M 0 100M 0% /run/user/0
วิธีนี้ใช้ได้ ผมใช้มานานไม่เคยเจอระบบไฟล์ใน VM เสียหาย แต่ขอแนะนำให้สำรองดิสก์ก่อนทำทุกครั้ง
บทความนี้จบที่นี่ หากผู้อ่านทราบวิธีลดขนาดดิสก์ KVM จริงๆ (ไม่ใช่การบีบอัด) ช่วยแบ่งปันได้ที่นี่ ผมจะทดสอบ