Board logo

标题: QEMU 使用的镜像文件:qcow2 与 raw-1 [打印本页]

作者: look_w    时间: 2017-12-19 20:48     标题: QEMU 使用的镜像文件:qcow2 与 raw-1

qcow2 的基本原理qcow2 镜像格式是 QEMU 模拟器支持的一种磁盘镜像。它也是可以用一个文件的形式来表示一块固定大小的块设备磁盘。与普通的 raw 格式的镜像相比,有以下特性:
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 镜像文件包含一下几部分:





欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0