qemu-img可安全创建、检查、转换和扩容虚拟磁盘,但严禁操作正在运行的镜像;创建时需确认路径空间与无残留文件,推荐qcow2格式(支持快照、动态增长),创建后须用info核验format和virtualsize;convert命令目标格式必须用-O而非-o,resize仅调逻辑容量,需虚拟机内同步扩展分区与文件系统。

直接用 qemu-img 就能完成绝大多数虚拟磁盘格式的创建、检查、转换和扩容,但必须避开「正在运行的镜像」这个致命红线——哪怕只是 qemu-img info 读取,也可能因并发写入返回错乱元数据。
怎么安全创建和验证新镜像
创建镜像前先确认目标路径有足够空间且无同名文件残留;qemu-img create 默认不校验目标路径是否可写,失败时只报错退出,不会自动清理半成品。
-
qemu-img create -f qcow2 disk.qcow2 20G:推荐新手起步用,qcow2支持快照、压缩、动态增长,初始仅占几 KB -
qemu-img create -f raw disk.raw 20G:适合追求极致 I/O 性能或需与物理设备直通的场景,但文件大小固定、无法快照 - 创建后立即执行
qemu-img info disk.qcow2,重点核对fileformat和virtualsize是否符合预期;若disksize显示为 0(raw)或远小于virtualsize(qcow2),说明稀疏特性生效正常
转换格式时最常踩的三个坑
qemu-img convert 是跨平台迁移的核心命令,但参数顺序、格式兼容性和隐式行为极易出错。
- 目标格式必须用
-O(大写字母 O),不是-o;写成-o qcow2会被当成格式选项传给输出驱动,导致静默失败或生成损坏镜像 - VHD 格式上限是 2040 GB,用
-O vpc转换超过该大小的.vhdx会中途报错并留下截断文件,务必先用qemu-img info确认源镜像virtual size - 从
vmdk或vhd转qcow2时,若源镜像含多个 descriptor 文件(如 VMware 的.vmdk+.vmx),qemu-img只读取主.vmdk文件,可能漏掉 backing chain 信息,建议先用qemu-img info -U检查是否识别完整链
为什么 resize 后虚拟机里看不到新空间
qemu-img resize 只修改镜像文件的逻辑容量,不触碰内部文件系统或分区表。这步做完,虚拟机启动后仍显示旧容量。
- 扩容命令示例:
qemu-img resize disk.qcow2 +10G(加号表示增量,无加号则设为绝对值) - Linux 虚拟机内需依次执行:
parted /dev/vda resizepart 1 100%(调整分区)→resize2fs /dev/vda1(扩展 ext4 文件系统);若用 LVM,还需pvresize+lvextend - 缩容严禁直接
qemu-img resize disk.qcow2 -5G:工具不校验文件系统状态,极大概率导致数据丢失;正确做法是先在虚拟机内收缩文件系统和分区,再调用 resize
check 和 amend 哪个更适合修复镜像
qemu-img check 是只读诊断,qemu-img amend 才能修改格式选项,二者用途完全不同,混用会白忙活。
-
qemu-img check -r all disk.qcow2:扫描所有元数据,报告泄漏簇(leaks)或脏位(dirty bit),但不修复;加-r all会尝试修复可恢复错误,仍需人工确认 -
qemu-img amend -f qcow2 -o compat=1.1 disk.qcow2:升级qcow2镜像兼容性版本,避免在老版 QEMU 上启动失败;注意amend不改变数据,只重写头部元数据 - 若
check报出ERROR cluster X is referenced multiple times,说明镜像已损坏,amend无法挽救,只能从备份恢复或用qemu-img convert重新生成干净副本
真正麻烦的是 backing chain 场景:当镜像依赖外部 backing file 时,info --backing-chain 输出的层级关系必须手动理清,任何一步 rebase 或 commit 操作错位,都会让快照链断裂且不可逆。


















