qemu-img resize 是什么
qemu-img resize 调整虚拟磁盘镜像的逻辑容量,它只改容器大小,不碰 guest 内的分区表与文件系统。扩容必须分两步:先在宿主侧扩镜像,再进 guest 扩分区和文件系统。缩容风险高,而且操作顺序与扩容相反,很多文件系统不支持在线缩小。
基本信息
| 扩容 | qemu-img resize disk.qcow2 +10G |
|---|---|
| 指定容量 | qemu-img resize disk.qcow2 60G |
| 缩容 | qemu-img resize --shrink disk.qcow2 30G(高风险) |
| guest 内 | growpart + resize2fs(ext4)/ xfs_growfs(XFS) |
| 支持格式 | qcow2、raw 等,操作前先用 qemu-img info 确认 |
典型使用场景
- 数据盘写满,需要在业务低峰扩容
- 初始置备容量过小导致根分区紧张
- 迁移前统一磁盘规格,避免目标端容量不足
- 测试环境回收空间,缩减演示用磁盘
扩容的完整两步
扩容的完整两步
qemu-img info /var/lib/libvirt/images/vm1.qcow2 # 确认格式、虚拟大小与实际占用
qemu-img resize /var/lib/libvirt/images/vm1.qcow2 +20G
# 以下在 guest 内执行(以 /dev/vda 第 3 个分区为例):
sudo growpart /dev/vda 3
sudo resize2fs /dev/vda3 # ext4;XFS 用 xfs_growfs /
df -h # 校验文件系统容量已变化扩容步骤对照
| 步骤 | 位置 | 说明 |
|---|---|---|
| 1 确认现状 | 宿主 | qemu-img info 看格式与当前容量 |
| 2 扩镜像 | 宿主 | qemu-img resize +20G,改的是虚拟大小 |
| 3 扩分区 | guest | growpart 调整分区表,需要工具支持 |
| 4 扩文件系统 | guest | ext4 用 resize2fs,XFS 用 xfs_growfs |
| 5 校验 | guest | df -h 与 lsblk 对比容量是否符合预期 |
缩容前必须备份;ext4 无法在线缩小,需要卸载后执行 resize2fs,XFS 不支持缩小,只能新建文件系统后恢复数据。
磁盘存在快照链时,qcow2 扩容可能失败或造成上游与增量盘大小不一致,稳妥做法是先合并或删除快照再扩容。
扩完容量没变的常见原因
- 只执行了 qemu-img resize,没有进 guest 扩分区与文件系统
- 分区表已扩但文件系统未扩:ext4 需执行 resize2fs,XFS 需执行 xfs_growfs
- 分区后面还有其他分区或已被占用的扇区,growpart 无法直接扩
- 操作对象是快照之上的增量盘,实际挂载的是上游盘,改错了文件
扩容前先确认虚机内是否有 LVM:若磁盘由卷组管理,需要依次扩展物理卷(pvresize)、逻辑卷(lvextend)与文件系统,只扩分区不会让逻辑卷变大。
xfs_growfs 与 resize2fs 作用对象不同:前者对挂载点执行、后者对设备执行,命令用错时提示信息容易让人误判为不支持扩容,动手前先确认文件系统类型。