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

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

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

2 级查找在 qcow2 中,磁盘的内容是保存在 cluster 中(每个 cluster 包含一些大小为 512 字节的扇区)。为了找到给定地址所在的 cluster,我们需要查找两张表,L1->L2。L1 表保存一组到 L2 表的偏移量,L2 表保存一组到 cluster 的偏移量;
所以一个地址要根据 cluster_bits(64 位)的设置分成 3 部分,比如说 cluster_bits=12;
低 12 位是一个 4Kb cluster 的偏移(2 的 12 次方=4Kb);
接下来 9 位是包含 512 个表项目的 L2 表;
剩下 43 位的代表 L1 表偏移量。
为了获取一个给定地址(64 位)的偏移位置:
  • 从 Head 域中的 l1_table_offset 取得 L1 表的地址
  • 用前(64-l2_bits-cluster_bits)位地址去索引 L1 表
  • 在 L1 表中的偏移量获得 L2 表的地址
  • 用地址中的接下来的 l2_bits 去索引 L2 表,获得一个 64 位的表项
  • 用 L2 表中的偏移量获得 cluster 的地址
  • 用地址中剩下的 cluster_bits 位去索引该 cluster,获得该数据块
如果 L1 表和 L2 表中的偏移量都是空,这块区域就尚未被镜像文件分配。
注意 L1 表和 L2 表中的偏移量的前两位被保留,用做表示'copied' 或'compressed'。
Copy-on-Write 镜像文件qcow2 镜像可以用来保存另一个镜像文件的变化,它并不去修改原始镜像文件,只记录与原始镜像文件的不同即可,这种镜像文件就叫做 copy-on-write 镜像。虽然是一个单独的文件,但它的大部分的数据都来自原始镜像,只有跟原始镜像文件相比有变化的 cluster 才会被记录下来。
这很容易去实现,在头部信息中记录原始文件路径即可。当需要从一个 copy-on-write 镜像文件中读取一个 cluster 的时候,首先检查这块区域是否已经在该镜像文件中被分配,如果没有就从原始文件读取。
快照快照有些类似 Copy-On-Write 文件,但区别是快照是一个可写的。快照就是原始文件本身(内部快照)。它既包含做快照之前的原始文件部分,它本身也包含可写的部分。
每一个快照都包含如下的头部结构:
清单 3. qcow2 快照 Header
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
typedef struct QCowSnapshotHeader {
    /* header is 8 byte aligned */
    uint64_t l1_table_offset;

    uint32_t l1_size;
    uint16_t id_str_size;
    uint16_t name_size;

    uint32_t date_sec;
    uint32_t date_nsec;

    uint64_t vm_clock_nsec;

    uint32_t vm_state_size;
    uint32_t extra_data_size; /* for extension */
    /* extra data follows */
    /* id_str follows */
    /* name follows  */
} QcowSnapshotHeader;




qcow2 的其他特性qcow2 支持压缩,它允许每个簇(cluster)单独使用 zlib 压缩。它也支持使用 128 位的 AES 密钥进行加密。
创建 qcow2 和 raw 文件以及两种镜像的对比使用 QEMU 软件包自带的 qemu-img 软件创建 qcow2 文件。
清单 4. 创建 qcow2 和 raw 文件
1
2
3
4
5
$ qemu-img create -f qcow2 test.qcow2 10G
Formatting 'test.qcow2', fmt=qcow2 size=10737418240 encryption=off cluster_size=65536 lazy_refcounts=off

$ qemu-img create -f raw test.raw 10G
Formatting 'test.raw', fmt=raw size=10737418240




对比两种格式的文件的实际大小以及占用空间大小如下:
清单 5. qcow2 和 raw 文件占用空间情况对比
1
2
3
4
5
6
7
8
9
10
11
$ ll -sh test.*
200K -rw-r--r-- 1 qiaoliyong qiaoliyong 193K 5 月   6 10:29 test.qcow2
   0 -rw-r--r-- 1 qiaoliyong qiaoliyong  10G 5 月   6 10:28 test.raw

[qiaoliyong@localhost ]$ stat test.raw
  文件:"test.raw"
  大小:10737418240    块:0          IO 块:4096   普通文件

[qiaoliyong@localhost ]$ stat test.qcow2
  文件:"test.qcow2"
  大小:197120     块:400        IO 块:4096   普通文件




从对比中可以看出 qcow 格式的镜像文件大小位 197120 字节,占用空间为 200K,占用了 200 块磁盘空间。而 raw 格式的文件则没有占用磁盘空间,它是一个空洞文件。
Raw 格式与 qcow2 转化QEMU 软件包里面提供的 qemu-img 工具可用于 image 镜像一些常用操作。
将 raw 格式转化为 qcow2 格式的文件命令如下:
1
2
3
4
5
qemu-img convert -f raw -O qcow2 test.raw test.raw.qcow2
[qiaoliyong@localhost kimchi]$ ll -sh test.*
200K -rw-r--r-- 1 qiaoliyong qiaoliyong 193K 5 月   6 10:29 test.qcow2
   0 -rw-r--r-- 1 qiaoliyong qiaoliyong  10G 5 月   6 10:28 test.raw
200K -rw-r--r-- 1 qiaoliyong qiaoliyong 193K 5 月   6 10:44 test.raw.qcow2




两种格式文件的性能比较
表 1. 使用 ide 作为虚拟磁盘的驱动的三种镜像格式性能对比
cache =offwritethroughwritebackOld qcow2 (0.10.5)16:52 min28:58 min6:02 minNew qcow2 (0.11.0-rc1)5:44 min9:18 min6:11 minraw5:41 min7:24 min6:03 min
表 2. 使用 virtio 作为虚拟磁盘的驱动的三种镜像格式性能对比
cache =offwritebackOld qcow2 (0.10.5)31:09 min8:00 minNew qcow2 (0.11.0-rc1)18:35 min8:41 minraw8:48 min7:51 min
小结本文着重介绍了 QEMU 虚拟机使用的镜像文件 qcow2 的格式以及特性,并与 raw 格式镜像做了对比。qcow2 格式的文件虽然在性能上比rRaw    格式的有一些损失(主要体现在对于文件增量上,qcow2 格式的文件为了分配 cluster 多花费了一些时间),但是 qcow2 格式的镜像比 Raw 格式文件更小,只有在虚拟机实际占用了磁盘空间时,其文件才会增长,能方便的减少迁移花费的流量,更适用于云计算系统,同时,它还具有加密,压缩,以及快照等 raw 格式不具有的功能。
返回列表