qcow2 格式详解 QEMU 的原生磁盘镜像格式
为什么选 qcow2
QEMU 支持十几种磁盘镜像格式,但 qcow2 是绝大多数场景下的首选。原因:
- 写时复制(COW):磁盘文件初始几乎为空,随使用增长
- 内置压缩:节省空间
- 快照支持:可以在镜像里存多个快照
- 后端文件(backing file):基于已有镜像创建增量镜像
- 平台兼容:全平台可用(包括 Windows,即使宿主文件系统不支持 hole)
其他格式各有短板:raw 虽然简单但不支持 COW;qed 已停止开发;vdi/vmdk 是 VirtualBox/VMware 私有格式。
qcow2 文件结构
qcow2 文件由三部分组成:
┌────────────┬──────────┬────────────────────┐
│ Header │ L1/L2 │ Guest Data + │
│ (72 bytes)│ RefTable │ Snapshot Metadata │
└────────────┴──────────┴────────────────────┘
- Header:文件大小、版本、集群大小、加密信息、后端文件路径
- L1/L2 RefTable:两级映射表,把 Guest 扇区号映射到宿主文件偏移
- Guest Data:实际的磁盘内容,按集群(cluster)组织
qcow2 的集群大小默认 64KB,可在创建时调整(cluster_size=2M)。
创建 qcow2 镜像
基础创建
# 创建 10GB qcow2 镜像(初始占用几乎为 0)
qemu-img create -f qcow2 disk.qcow2 10G
# 指定集群大小和兼容版本
qemu-img create -f qcow2 -o cluster_size=2M,compat=1.1 disk.qcow2 20G
高级选项
qemu-img create -f qcow2 -o \
cluster_size=2M, \
compat=1.1, \
compression_type=zstd, \
extended_l2=on \
disk.qcow2 50G
| 选项 | 说明 |
|---|---|
cluster_size | 集群大小,影响性能和空间浪费。推荐 64K~2M |
compat | 0.10(传统格式)或 1.1(QEMU 1.1+,推荐) |
compression_type | zlib(默认)或 zstd(更快) |
extended_l2 | 大镜像用的 L2 扩展表 |
查看镜像信息
qemu-img info disk.qcow2
# image: disk.qcow2
# file format: qcow2
# virtual size: 50G (53687091200 bytes) ← 虚拟大小
# disk size: 2.1G ← 实际占用(COW 生效)
# cluster_size: 65536
# Format specific information:
# backing file: /path/to/base.qcow2 ← 如有后端文件
virtual size 和 disk size 的差值就是 COW 节省的空间。一个 50G 的虚拟机可能只写了 2G 数据,磁盘文件就只占 2G。
qcow2 的快照机制
qcow2 原生支持内置快照——快照存在 qcow2 文件内部,不需要额外文件。
# 在 QEMU Monitor 里创建快照
savevm clean-state
# 列出所有快照
info snapshots
# List of snapshots:
# ID TAG VM SIZE DATE VM CLOCK
# 1 clean-state 1.5G 2026-10-12 10:30:00 00:00:05.123
# 恢复快照
loadvm clean-state
qcow2 的快照和 QEMU VM 快照(savevm)不同:
- qcow2 快照:只存磁盘状态,不存 CPU/内存状态
- QEMU VM 快照:存完整虚拟机状态(CPU、内存、磁盘),体积更大
后端文件链(Backing File Chain)
qcow2 支持后端文件:一个 qcow2 镜像可以指向另一个镜像作为只读的基础层。新的修改只写在当前镜像里。
# 基于 base.qcow2 创建增量镜像
qemu-img create -f qcow2 -F qcow2 -b base.qcow2 derived.qcow2
# 现在 derived.qcow2 只记录和 base 的差异
这个机制非常有用:
- 多个虚拟机共享基础镜像:一个干净的 Ubuntu base 镜像,派生多个开发环境
- COW 快照:修改都写在增量层,基础层不动
- 节省空间:多个派生镜像可以只存差异部分
查看后端链:
qemu-img info derived.qcow2
# backing file: base.qcow2
# backing file format: qcow2
# 查看完整后端链
qemu-img info --backing-chain derived.qcow2
压缩与清理
镜像使用一段时间后会有空洞和未使用空间。手动压缩:
# 先在 Guest 里用 fstrim 释放
fstrim -a
# 然后在宿主机上压缩镜像
qemu-img convert -c -O qcow2 disk.qcow2 disk-compressed.qcow2
mv disk-compressed.qcow2 disk.qcow2
-c 启用压缩,-O qcow2 指定输出格式。
镜像在 QEMU 里的使用
# 作为主磁盘
qemu-system-x86_64 -drive file=disk.qcow2,format=qcow2,if=virtio
# 只读挂载基础镜像,用派生镜像写
qemu-system-x86_64 -drive file=derived.qcow2,format=qcow2,if=virtio
# 或用简化写法
qemu-system-x86_64 -hda disk.qcow2
建议总是显式指定 format=qcow2,避免 QEMU 自动探测格式出错。
下一步
想了解如何在不同格式之间转换?去 镜像创建与转换。