能,但必须加 -o lazy_refcounts=on,cluster_size=65536,compression_type=zlib 参数,否则默认生成的 qcow2 不满足精简置备语义;转换前需在虚拟机内归零空扇区并执行 fstrim,转换后须验证 lazy refcounts: true 及文件大小是否显著缩小。

qemu-img convert -f raw -O qcow2 能直接生成精简置备磁盘吗
能,但必须加 -o lazy_refcounts=on 和 -o cluster_size=65536(或更大),否则默认创建的 qcow2 虽然文件稀疏,但不满足“精简置备”语义——它仍会预分配元数据结构,且快照链管理效率低。真正的精简行为依赖于写时分配(copy-on-write)和延迟引用计数,这两个选项缺一不可。
常见错误是只执行:qemu-img convert -f raw -O qcow2 old.img new.qcow2,结果新镜像在 qemu-img info 中显示 lazy refcounts: false,后续做快照或反复克隆时 I/O 开销明显上升。
转换前必须关机并清理未使用空间
RAW 磁盘里大量“空扇区”(全零)不会自动压缩进 qcow2,除非你在转换前主动归零。否则 qcow2 会把那些零块也当成有效数据存进去,失去空间节省意义。
- 在虚拟机内执行:
dd if=/dev/zero of=/zerofill bs=1M; sync; rm -f /zerofill - 再运行
fstrim -v /(需启用discard挂载选项) - 最后关机,再执行
qemu-img convert
若跳过这步,new.qcow2 的 disk size 可能接近原 RAW 大小,而非实际已用空间。
转换命令要带关键参数并验证输出
正确命令示例:
qemu-img convert -f raw -O qcow2 \ -o lazy_refcounts=on,cluster_size=65536,compression_type=zlib \ centos7.raw centos7-thin.qcow2
执行后务必验证:
-
qemu-img info centos7-thin.qcow2→ 检查lazy refcounts: true、compression type: zlib -
du -h centos7-thin.qcow2→ 对比disk size和实际文件大小,应基本一致 - 启动虚拟机前,先用
qemu-img check -r all centos7-thin.qcow2排查元数据损坏
替换磁盘后别忘了更新虚拟机配置
PVE 或 libvirt 不会自动识别你换掉的磁盘文件。手动操作时容易漏掉这步:
- 编辑
/etc/pve/qemu-server/<vmid>.conf</vmid>(PVE)或virsh edit <vm-name></vm-name>(libvirt) - 找到类似
scsi0: local:100/vm-100-disk-0.raw的行,替换成新路径,如scsi0: local:100/vm-100-disk-0.qcow2 - 确保
cache=writeback或cache=none保持不变,避免因缓存策略突变引发 I/O 错误
最易忽略的是:即使文件名没变(比如你覆盖重写了原 .raw),只要格式变了,就必须显式指定 type=qcow2,否则 QEMU 仍按 RAW 解析,直接报错 Invalid argument。











