qemu-img convert 是唯一可靠转换方式,需显式指定 -f vmdk,先用 qemu-img info 确认格式与 data type,避开快照、运行态及 streamoptimized 等陷阱,再校验 virtual size 和 disk size。

qemu-img convert 是唯一可靠的方式,其他方法(比如重命名、直接挂载)都会失败。转换不是文件改名,而是重新组织扇区数据和元数据结构——qemu-img 会读取源 vmdk 的每个有效块,再按 qcow2 的写时复制格式打包,过程中还可能重建引导头和磁盘几何信息。
先确认vmdk是不是单个可读文件
很多问题其实出在第一步:你手里的 vmdk 根本不是 qemu-img 能直接处理的“完整镜像”。常见陷阱包括:
- 看到
vm-disk.vmdk就直接传给qemu-img convert,但实际它是描述符文件,真正数据在vm-disk-flat.vmdk里 —— 此时必须指定-f vmdk并指向-flat.vmdk文件,或确保描述符和-flat在同一目录 - 遇到一串
vm-disk-s001.vmdk、vm-disk-s002.vmdk……这种分片盘,qemu-img只认主描述文件(通常是不带编号的那个.vmdk),不能用通配符或只选其中一个分片 -
file vm-disk.vmdk输出含streamOptimized—— 这是 VMware 导出的压缩流式镜像,qemu-img旧版本(如 5.2 之前)会报Unsupported VMDK version;得先用vmkfstools -i source.vmdk -d thin target.vmdk转成标准 thin 格式
最稳妥的判断方式是运行:
qemu-img info vm-disk.vmdk如果报错或输出里
format: 显示为空/unknown,说明文件形态不兼容,别急着转。
转换命令必须显式指定 -f vmdk
自动识别(省略 -f)在 vmdk 场景下极不可靠。VMware 不同版本生成的 vmdk 头部特征差异大,qemu-img 容易误判为 raw 或跳过元数据解析,导致目标 qcow2 缺少关键引导信息,启动时报 no bootable device。
正确写法只有这一种:
qemu-img convert -f vmdk -O qcow2 vm-disk.vmdk vm-disk.qcow2其中:
-
-f vmdk强制使用 vmdk 后端驱动,确保正确解析描述符、分片链和稀疏映射表 - 不要加
-c(压缩)参数:Windows 系统盘启用压缩后常导致 KVM 启动卡死;Linux 系统盘压缩收益小,反而增加 IO 开销 - 加
-p参数实时显示进度,避免误以为卡死而中断(尤其大镜像)
转换后必须校验虚拟容量和实际占用
转换完成不代表能用。常见现象是 qcow2 文件体积异常:比原 vmdk 小(说明漏读分片),或大出 2–3 倍(多因 streamOptimized 解压 + 稀疏块被展开)。关键看这两项:
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
- 运行
qemu-img info vm-disk.qcow2,对比virtual size是否与原始vmdk一致 —— 不一致说明源文件没读全 - 检查
disk size(实际占用)是否合理:若原vmdkdisk size是 8GB,转完qcow2却占 25GB,大概率是源盘启用了 thick provisioning 且qemu-img把所有未用块也写进去了 - 用
virt-df -a vm-disk.qcow2查看内部文件系统已用空间,确认是否与预期匹配
若发现异常,别删重试,先回溯 qemu-img info 输出,重点核对源 vmdk 的 format 和 data type 字段。
快照链和运行中虚拟机是硬性禁区
转换前必须确保:
• 虚拟机已完全关机(非挂起、非休眠)
• 所有快照已合并或删除
• 没有正在运行的 vmware-vmx 进程锁住该磁盘文件
原因很直接:
- 快照链中的
vmdk实际是增量差分文件,单独转换只会得到一个空壳或损坏的根盘 - 运行中虚拟机的文件系统处于脏状态,
qemu-img读到的是不一致的内存缓存副本,转换后启动必报filesystem corruption或直接 kernel panic - ESXi 环境下,未卸载的 datastore 可能导致
vmdk被锁定,qemu-img会静默失败(无错误提示,但输出文件大小为 0)
最保险的做法:在 VMware 中右键虚拟机 → “快照” → “全部删除”,再执行“关机”,最后从存储浏览器中下载磁盘文件。
真正容易被忽略的,是qemu-img info 输出里那行不起眼的 data type:。它告诉你这个 vmdk 是 sparse、streamOptimized 还是 flat,而这个字段决定了你该不该转、怎么转、甚至要不要先用 vmkfstools 预处理——跳过这行,等于蒙眼开车。










