qemu 中文文档 下载 App

qcow2 格式详解 QEMU 的原生磁盘镜像格式

为什么选 qcow2

QEMU 支持十几种磁盘镜像格式,但 qcow2 是绝大多数场景下的首选。原因:

  1. 写时复制(COW):磁盘文件初始几乎为空,随使用增长
  2. 内置压缩:节省空间
  3. 快照支持:可以在镜像里存多个快照
  4. 后端文件(backing file):基于已有镜像创建增量镜像
  5. 平台兼容:全平台可用(包括 Windows,即使宿主文件系统不支持 hole)

其他格式各有短板:raw 虽然简单但不支持 COW;qed 已停止开发;vdi/vmdk 是 VirtualBox/VMware 私有格式。

qcow2 文件结构

qcow2 文件由三部分组成:

┌────────────┬──────────┬────────────────────┐
│   Header   │  L1/L2   │   Guest Data +     │
│  (72 bytes)│ RefTable │   Snapshot Metadata │
└────────────┴──────────┴────────────────────┘

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
compat0.10(传统格式)或 1.1(QEMU 1.1+,推荐)
compression_typezlib(默认)或 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)不同:

后端文件链(Backing File Chain)

qcow2 支持后端文件:一个 qcow2 镜像可以指向另一个镜像作为只读的基础层。新的修改只写在当前镜像里。

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

# 现在 derived.qcow2 只记录和 base 的差异

这个机制非常有用:

查看后端链:

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 自动探测格式出错。

下一步

想了解如何在不同格式之间转换?去 镜像创建与转换。