Trong bài viết này, chúng ta sẽ thảo luận về cách thay đổi kích thước ổ đĩa ảo máy ảo KVM cho các loại ổ đĩa phổ biến. Chúng tôi sẽ chỉ cách tăng dung lượng ổ đĩa ảo máy ảo trong hypervisor KVM trên Linux mà không làm mất dữ liệu và thảo luận các tùy chọn để giảm dung lượng ổ đĩa.
Cách Tăng/Kéo Dài Kích Thước Ổ Đĩa Ảo Máy Ảo KVM?
Tăng Kích Thước Ổ Đĩa Ảo Trên KVM
Hãy xem xét ví dụ tăng kích thước ổ đĩa ảo 20GB. Tắt máy ảo trước khi thay đổi cài đặt ổ đĩa ảo của nó.
Để xem cài đặt ổ đĩa ảo của máy ảo KVM, sử dụng lệnh:
qemu-img info /path_to_disk
Bạn sẽ thấy kết quả như sau:

Chúng ta thấy có hai trường hiển thị kích thước: virtual_size và disk_size:
- virtual_size – là kích thước ổ đĩa ảo được đặt khi tạo hoặc mở rộng ổ đĩa (trong ví dụ này, kích thước tối đa ổ đĩa là 20GB);
- disk_size — là kích thước hiện tại của tệp ổ đĩa, tức là dung lượng ổ đĩa chiếm dụng trên máy chủ vật lý (chỉ áp dụng cho định dạng qcow). Trong ví dụ của chúng ta, ổ đĩa ảo chỉ chiếm 1.6GB trên bộ nhớ.
Vài lời về các loại ổ đĩa KVM (định dạng). Tôi khuyên nên sử dụng qcow2 thay vì raw khi tạo máy ảo trong KVM. Sau này tôi sẽ giải thích lý do.
Ở bước tiếp theo, tôi sẽ tăng kích thước máy ảo thêm 5GB (để mở rộng ổ đĩa đúng cách, máy ảo không được có bất kỳ snapshot nào!).
# qemu-img resize /path to disk +5G
Image resized.
Nếu bạn kiểm tra cài đặt ổ đĩa ảo, bạn sẽ thấy nó đã được mở rộng:
# 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
Chúng ta đã hoàn thành một phần công việc, nhưng chúng ta cũng cần thực hiện một số hành động trong hệ điều hành khách của máy ảo. Bây giờ chúng ta sẽ chỉ cách mở rộng kích thước ổ đĩa trong CentOS 7 khách và Windows Server 2012 R2 khách.
Nếu bạn muốn thêm một ổ đĩa ảo khác cho máy ảo của mình trong hypervisor KVM, các công cụ qemu-img và virsh được sử dụng.
Cách Mở Rộng Phân Vùng Trong Máy Ảo Chạy CentOS Linux?
Sau khi tăng kích thước ổ đĩa ảo phía máy chủ KVM, hãy khởi động máy ảo của bạn và kết nối vào nó. Chúng ta sẽ sử dụng công cụ quản lý phân vùng ổ cứng fdisk để mở rộng kích thước phân vùng và hệ thống tệp.
Kết nối với Hệ Điều Hành Khách VM qua SSH và đảm bảo rằng 5 GB dung lượng ổ đĩa bổ sung xuất hiện.
df –h
fdisk -l

Ảnh chụp màn hình cho thấy /dev/vda2 có kích thước 20GB, và dung lượng ổ đĩa có sẵn là 25GB.
Hãy mở rộng /dev/vda2 lên đến kích thước tối đa có sẵn:
# 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. Sau đó khởi động lại máy ảo và chạy lệnh sẽ áp dụng kích thước ổ đĩa mới:
# 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
Kết quả là chúng ta đã có một phân vùng /dev/vda2 được mở rộng. Đây là chính xác những gì chúng ta đã làm:
- fdisk /dev/vda — chúng ta chạy fdisk và kết nối với /dev/vda;
- /d — chúng ta xóa phân vùng. Mặc định là phân vùng 2 mà chúng ta cần, vì vậy chúng ta chỉ nhấn Enter ở mục tiếp theo;
- /n – chúng ta tạo một phân vùng mới và nhấn Enter hoặc p, sau đó nhấn Enter lại, vì phân vùng chúng ta đang cố gắng tạo sẽ là 2 theo mặc định;
- Khi chỉ định sector đầu tiên và cuối cùng, chúng ta cũng chỉ nhấn Enter nếu muốn mở rộng phân vùng đến mức tối đa. Nếu bạn muốn đặt kích thước cụ thể, hãy nhập kích thước ổ đĩa trong sector cuối cùng như được hiển thị trong menu +size{K,M,G};
- /w — để áp dụng cài đặt mới.
Sau khi khởi động lại VM, hãy kiểm tra ổ đĩa bằng lệnh này:
xfs_growfs /dev/vda2
Một số nguồn khuyên nên sử dụng lệnh sau :
resize2fs /dev/vda2
Nhưng nó sẽ không hoạt động cho hệ thống tệp XFS!
Vậy là bạn đã mở rộng kích thước ổ đĩa trên máy ảo chạy CentOS 7.
Cách Tăng Kích Thước Ổ Đĩa Trong Khách Windows Server?
Kết nối với máy ảo Windows Server bằng RDP hoặc VNC và mở rộng ổ đĩa.
- Mở Server Manager -> Tools -> Computer Management;
- Chọn Storage -> Disk Management bên trái. Tất cả các phân vùng ổ đĩa và không gian chưa cấp phát đã thêm sẽ xuất hiện;

- Chọn phân vùng bạn muốn tăng và nhấp Extend Volume;

- Mặc định tất cả không gian có sẵn sẽ được đề xuất để tăng kích thước ổ đĩa;

- Nhấp Next để hoàn tất mở rộng. Sau đó, kích thước phân vùng của bạn sẽ tăng lên.

Tôi muốn lưu ý rằng trước khi mở rộng ổ đĩa máy ảo, tôi khuyên bạn nên sao lưu ổ đĩa ảo. Tắt máy ảo và sao chép hình ảnh ổ đĩa vào thư mục sao lưu có dung lượng trống. Nếu có sự cố xảy ra trong quá trình mở rộng, bạn luôn có thể khôi phục hình ảnh ổ đĩa ảo từ bản sao lưu.
Cách Giảm Dung Lượng Ổ Đĩa Của Máy Ảo KVM?
Trong công việc tôi thường gặp vấn đề này, nhưng đáng tiếc là bạn không thể an toàn giảm kích thước ổ đĩa của máy ảo trong KVM. Cách duy nhất chấp nhận được để giảm dung lượng ổ đĩa ảo trên bộ nhớ vật lý là chuyển đổi ổ đĩa.
Có nhiều hướng dẫn trên mạng nói về cách giảm dung lượng ổ đĩa trong máy ảo KVM, nhưng chúng không hoạt động.
Tôi sẽ đưa ra một số ví dụ tôi gặp và đã kiểm tra.
Giảm Kích Thước Ổ Đĩa KVM Sử Dụng Qemu
Một số tài nguyên mô tả các hành động bạn có thể thực hiện với công cụ qemu. Chúng đề xuất giảm dung lượng ổ đĩa máy ảo bằng lệnh này:
qemu-img resize /path_to_disk -5G — để thu nhỏ dung lượng ổ đĩa 5G
Hoặc tùy chọn sau nơi bạn đặt kích thước ổ đĩa ảo cụ thể:
qemu-img resize /path_to_disk 25G — để đặt kích thước ổ đĩa thành 25G
Điều gì xảy ra sau khi chạy lệnh này? Sau khi khởi động máy chủ, hệ thống sẽ không khởi động được:
Unable to verify superblock, continuing... Sorry, could not find valid secondary superblock. Exiting now.

Tôi đã thử giảm kích thước ổ đĩa trong hệ thống bằng fdisk trước, nhưng hệ thống vẫn không khởi động được ngay cả khi bạn bỏ qua việc thu nhỏ ổ đĩa trên máy chủ vật lý. Và điều đó khá hợp lý. Phân vùng chúng ta đang cố gắng giảm là phân vùng hệ thống, và hệ điều hành sẽ không khởi động vì thông tin trên đó rõ ràng bị xóa khi cố gắng giảm kích thước của nó.
Giảm Kích Thước Ổ Đĩa Ảo Sử Dụng Thay Thế Hình Ảnh
Phương pháp ít phổ biến hơn trong các hướng dẫn này là giảm dung lượng ổ đĩa bằng cách thay thế ổ đĩa. Điều đó có nghĩa là bạn tạo một máy ảo mới với kích thước ổ đĩa bạn cần. Sau đó bạn thay thế hình ảnh ổ đĩa mới bằng hình ảnh cũ, và nó hoạt động dựa trên các mô tả trong các nguồn khác nhau. Tôi đã kiểm tra phương pháp này, và hệ thống tệp trở nên không hoạt động giống như phương pháp trước. Dưới đây là ví dụ về lệnh:
virt-resize /old_disk_image /new_disk_image
Cũng có một số phương pháp sử dụng chuyển đổi ổ đĩa từ raw sang định dạng qcow2, nhưng tôi ban đầu tạo máy ảo ở định dạng này và đây là lý do tại sao tôi làm như vậy.
Định Dạng Ổ Đĩa KVM và Nén Ổ Đĩa QCOW2
Ở đầu bài viết tôi đã đề cập đến hai định dạng ổ đĩa này: raw và qcow.
Raw có ưu điểm là hiệu suất tối đa và tính phổ biến. Nhưng nó có nhiều nhược điểm, chính yếu là:
- Tệp ổ đĩa ảo chiếm dụng toàn bộ không gian được cấp phát cho nó trên máy chủ vật lý;
- Bạn không thể tạo snapshot.
Qcow2 là định dạng ổ đĩa gốc của QEMU và QEMU-KVM hypervisor. Đây là định dạng ổ đĩa ảo tiện lợi nhất trong tất cả các định dạng được hỗ trợ trong KVM. Hình ảnh ổ đĩa tăng dần khi dữ liệu tích lũy trong máy ảo, và hỗ trợ snapshot.
Ưu điểm của qcow2 là gì? Bạn không cần giảm kích thước ổ đĩa ảo vì nó chỉ chiếm dụng bao nhiêu không gian trên bộ nhớ máy chủ thì bấy nhiêu. Nếu dữ liệu liên tục bị ghi đè trên máy chủ của bạn, và ổ đĩa bị phình to, bạn có thể dễ dàng nén nó. Hãy xem xét tùy chọn này. Tôi sẽ lấp đầy một phần không gian ổ đĩa ảo bằng số không và sau đó xóa tệp:
dd if=/dev/zero of=/mytempfile
rm -rf /mytempfile

Khi bạn kiểm tra từ máy chủ của mình, trước đó kích thước hình ảnh ổ đĩa là 2.4G, sau đó nó trở thành 5.9G:
# du -sh /image_path
2.4G *****
# du -sh /image_path
5.9G *****
Điều đó có nghĩa là sau khi xóa thông tin khỏi máy ảo, kích thước ổ đĩa ảo không co lại. Để tệp ổ đĩa ảo có thể lấy lại kích thước thực tế của nó, tôi sử dụng phương pháp sau:
Sao lưu tệp ổ đĩa ảo, tắt máy ảo và sau đó thực hiện các bước sau:
qemu-img convert -O qcow2 /old_image /new_image
Sau đó bạn có thể so sánh kích thước của cả hai ổ đĩa:
# du -sh /new_disk
1.6G /****
# du -sh /old_disk
5.8G /****
Như bạn thấy, kích thước ổ đĩa đã nén là 1.6G. Đổi tên tệp hình ảnh ổ đĩa mới như bạn cần và khởi động máy ảo:
# 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
Phương pháp này hoạt động. Suốt thời gian tôi sử dụng nó, tôi chưa từng gặp tình huống nào mà hệ thống tệp trong máy ảo bị lỗi. Nhưng tôi khuyên mạnh mẽ bạn nên sao lưu ổ đĩa trước khi làm bất cứ điều gì để không mất dữ liệu.
Đây là tất cả những gì tôi muốn chia sẻ trong bài viết này. Nếu bất kỳ khách truy cập nào của trang web này biết bất kỳ phương pháp thực sự khả thi nào khác để giảm kích thước ổ đĩa trên KVM (không phải nén), hãy mô tả chúng ở đây và tôi sẽ kiểm tra chúng.