本文介绍了 qcow2 和 raw,它们都是 QEMU(KVM)虚拟机使用的磁盘文件格式,本文将从其实现原理,支持特性,以及读写效率等进行对比和分析,最后还要介绍这两种格式的磁盘文件如何转化。
qcow2 的基本原理
qcow2 镜像格式是 QEMU 模拟器支持的一种磁盘镜像。它也是可以用一个文件的形式来表示一块固定大小的块设备磁盘。与普通的 raw 格式的镜像相比,有以下特性:
更小的空间占用,即使文件系统不支持空洞(holes);
支持写时拷贝(COW, copy-on-write),镜像文件只反映底层磁盘的变化;
支持快照(snapshot),镜像文件能够包含多个快照的历史;
可选择基于 zlib 的压缩方式
可以选择 AES 加密
qcow2 镜像文件格式
头部信息
每一个 qcow2 文件都以一个大端(big-endian)格式的头开始,结构如下:
清单 1. qcow2 Header
typedef struct QCowHeader {
uint32_t magic;
uint32_t version;
uint64_t backing_file_offset;
uint32_t backing_file_size;
uint32_t cluster_bits;
uint64_t size; /* in bytes */
uint32_t crypt_method;
uint32_t l1_size;
uint64_t l1_table_offset;
uint64_t refcount_table_offset;
uint32_t refcount_table_clusters;
uint32_t nb_snapshots;
uint64_t snapshots_offset;
} QcowHeader;
下面以一个 10G 的 qcow2 文件为例来分析各字段的含义。
清单 2. qcow2 文件的 16 进制表示
# file 1.cow2
1.cow2: QEMU QCOW Image (v2), 10737418240 bytes
0000000: 5146 49fb 0000 0002 0000 0000 0000 0000 QFI.............
0000010: 0000 0000 0000 0010 0000 0002 8000 0000 ................
0000020: 0000 0000 0000 0014 0000 0000 0003 0000 ................
0000030: 0000 0000 0001 0000 0000 0001 0000 0000 .........