qemu 中文文档 下载 App

qemu-img 创建、转换、压缩、检查镜像的完整命令

qemu-img 总览

qemu-img 是 QEMU 自带的磁盘镜像工具,所有镜像操作都靠它。五大子命令:

子命令作用最常用场景
create创建新镜像初始化虚拟机磁盘
convert格式转换 + 压缩 + 合并后端链VirtualBox/VMware 镜像转 qcow2
info查看镜像详情检查后端文件链、快照列表
check一致性检查镜像损坏排查
resize调整镜像大小给虚拟机扩容

create:创建镜像

# 基础创建
qemu-img create -f qcow2 disk.qcow2 10G

# 指定集群大小和兼容版本
qemu-img create -f qcow2 -o cluster_size=2M,compat=1.1 disk.qcow2 20G

# raw 格式(不推荐,但简单)
qemu-img create -f raw disk.raw 10G

# 创建基于后端文件的增量镜像
qemu-img create -f qcow2 -F qcow2 -b base.qcow2 derived.qcow2

# 创建 vmdk(VMware)格式
qemu-img create -f vmdk disk.vmdk 20G

支持的格式:qcow2、qcow、raw、vmdk、vdi、vpc、vhdx、qed、nbd 等。

convert:格式转换

VirtualBox vdi → qcow2

qemu-img convert -f vdi -O qcow2 virtualbox.vdi qemu.qcow2

VMware vmdk → qcow2

qemu-img convert -f vmdk -O qcow2 vmware.vmdk qemu.qcow2

qcow2 → raw(需要全空间,不推荐)

qemu-img convert -f qcow2 -O qcow2 disk.qcow2 disk.raw

压缩 qcow2

qemu-img convert -c -O qcow2 disk.qcow2 disk-compressed.qcow2
# -c 参数启用 zlib 压缩

合并后端链(commit)

把增量镜像的修改合并到基础镜像:

# 查看后端链
qemu-img info --backing-chain derived.qcow2

# 方法一:convert 合并(推荐,更安全)
qemu-img convert -O qcow2 derived.qcow2 merged.qcow2

# 方法二:commit 到后端文件
qemu-img commit derived.qcow2

commit 会直接修改后端文件,操作前请确认基础镜像有备份。

其他高级选项

# 指定输出集群大小
qemu-img convert -O qcow2 -o cluster_size=2M input.qcow2 output.qcow2

# 指定 zstd 压缩(更快)
qemu-img convert -O qcow2 -o compression_type=zstd input.qcow2 output.qcow2

# 加密输出(qemu 10.x+)
qemu-img convert -O qcow2 -o encrypt.format=luks ...

info:查看镜像

# 查看基本信息
qemu-img info disk.qcow2

# 查看完整后端链
qemu-img info --backing-chain derived.qcow2

# JSON 格式输出(脚本友好)
qemu-img info --output=json disk.qcow2

check:一致性检查

# 基础检查
qemu-img check disk.qcow2

# 带修复(qcow2 支持)
qemu-img check -r all disk.qcow2

# 只检查不修改(只读模式)
qemu-img check --output=json disk.qcow2

检查前请先关机虚拟机。对正在被 QEMU 写入的镜像做 check 可能产生不一致。

resize:调整大小

扩容

# 增加 10GB
qemu-img resize disk.qcow2 +10G

# 调整到精确大小
qemu-img resize disk.qcow2 50G

缩容

# 缩容前必须先在 Guest 里缩分区!
# 然后宿主机上:
qemu-img resize disk.qcow2 -2G

缩容是危险操作,顺序很重要:

  1. Guest 里缩文件系统(resize2fs / ntfsresize / btrfs)
  2. Guest 里缩分区表(parted / gparted)
  3. 宿主机上 qcow2 resize

三步必须严格按顺序来,任何一步跳过都可能导致数据丢失。

rebase:修改后端文件

# 改变 derived.qcow2 的后端文件从 base-old.qcow2 到 base-new.qcow2
qemu-img rebase -F qcow2 -b base-new.qcow2 derived.qcow2

# 脱钩(去掉后端文件,变成独立镜像)
qemu-img rebase -b "" derived.qcow2

批量脚本示例

清理压缩多个镜像

#!/bin/bash
for img in *.qcow2; do
  echo "Processing $img..."
  qemu-img convert -c -O qcow2 "$img" "${img}.tmp"
  mv "${img}.tmp" "$img"
done

VirtualBox 镜像迁移到 QEMU

#!/bin/bash
for vdi in VMs/*.vdi; do
  name=$(basename "$vdi" .vdi)
  qemu-img convert -f vdi -O qcow2 "$vdi" "qemu-${name}.qcow2"
done

常见坑

convert 后镜像变大了

qemu-img convert 默认会把 raw 格式的空洞也写满。如果源镜像有大量未使用空间,转换后会变成完整大小。解决方法:

  1. Guest 里先 fstrim -a
  2. 然后再 qemu-img convert

Windows 镜像跨平台

Windows 的磁盘分区需要注意对齐。用 qemu-img convert -O qcow2 -o cluster_size=64K 可以更好兼容。

LVM / RAW 不要用 qcow2 包装

如果你已经用 LVM 或 iSCSI 等块设备了,直接用 -drive file=/dev/mapper/vg-lv,format=raw,不要再套一层 qcow2——双重 COW 只会降低性能。

下一步

想在 QEMU 命令行里用这些镜像?去 qcow2 详解 回顾基础。