首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

QEMU 使用的镜像文件:qcow2 与 raw-1

QEMU 使用的镜像文件:qcow2 与 raw-1

qcow2 的基本原理qcow2 镜像格式是 QEMU 模拟器支持的一种磁盘镜像。它也是可以用一个文件的形式来表示一块固定大小的块设备磁盘。与普通的 raw 格式的镜像相比,有以下特性:
  • 更小的空间占用,即使文件系统不支持空洞(holes);
  • 支持写时拷贝(COW, copy-on-write),镜像文件只反映底层磁盘的变化;
  • 支持快照(snapshot),镜像文件能够包含多个快照的历史;
  • 可选择基于 zlib 的压缩方式
  • 可以选择 AES 加密
qcow2 镜像文件格式头部信息每一个 qcow2 文件都以一个大端(big-endian)格式的头开始,结构如下:
清单 1. qcow2 Header
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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 进制表示
1
2
3
4
5
6
7
8
9
10
11
12
# 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  ................
0000040: 0000 0000 0000 0000 0000 0000 0000 0000  ................
0000050: 0000 0000 0000 0000 0000 0000 0000 0000  ................
0000060: 0000 0004 0000 0068 0000 0000 0000 0000  .......h........
0000070: 0000 0000 0000 0000 0000 0000 0000 0000  ................
......




前 4 个比特包含了字符 Q,F,I,然后是 0xfb,实例中的 5146 49fb 是 magic 字段。
接下来的 4 个比特包含了该镜像文件的版本号,实例中的 0000 0002 是 version 字段,代表使用的是 qcow2 版本。
backing_file_offset 占用 8 个字节,实例中 0000 0000 0000 0000,给出一个从某个文件开始偏移量。
backing_file_size 给出了一个不以 null 结尾的字符串的长度,实例中为 0000 0000。如果这个镜像文件是一个写时拷贝的,那么它是原始文件的路径。
cluster_bits,32 位(0000 0010),描述了如何映射一个镜像的地址到一个本地文件,它决定了在一个 cluster 中,偏移地址的低位是如何作为索引的。因为 L2 表占用了一个单独的 cluster 并且包含 8 字节的表项(entry),所以 cluster_bits 只有不足 3 个位,作为 L2 表的索引。
接下来的 size ,8 字节代表了该镜像文件所表示的块设备的大小,实例中为 0000 0002 8000 0000 字节,也就是 10G 的空间。
crypt_method 如果为 1 代表使用 AES 加密。
l1_size(0000 0014)和 l1_table_offset(0000 0000 0003 0000::)分别给出了 L1 表大小和偏移量。
refcount_table_offset 给出 refcount 表的偏移量(0000 0000 0001 0000)而 refcount_table_clusters 描述了以 cluster 为单位的 refcount 表的大小(0000 0001)。
nb_snapshots 给出了该镜像包含的快照数量(0000 0000), snapshots_offset 给出每个快照到 QCowSnapshotHeader 的偏移量(0000 0000 0000 0000)。
一个典型的 qcow2 镜像文件包含一下几部分:
  • 上文中提到的头部信息
  • L1 表
  • refcount 表
  • 一个或者多个 refcount 块
  • 快照头
  • L2 表
  • 数据 cluster
返回列表