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
缩容是危险操作,顺序很重要:
- Guest 里缩文件系统(resize2fs / ntfsresize / btrfs)
- Guest 里缩分区表(parted / gparted)
- 宿主机上 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 格式的空洞也写满。如果源镜像有大量未使用空间,转换后会变成完整大小。解决方法:
- Guest 里先
fstrim -a - 然后再
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 详解 回顾基础。