qcow2是qemu虚拟机中特别常用的镜像文件格式,QCOW即Qemu Copy-On-Write写时拷贝,后面的2即为版本,因为在qcow2出现之前还有qcow格式的镜像文件。从字面上理解,qcow/qcow2的文件组织形式应该是建立在Copy-On-Write这个基本的机制上,即当某个数据块被引用多次(两次或两次以上)时,若某个实例尝试写该数据块,为了不让其他实例看到该数据块的变化,就会将该数据块拷贝一份,然后将修改生效到拷贝的数据块上。这个机制和内存的Copy-On-Write的机制是基本一致的。
qcow2镜像文件组织结构
qcow2镜像文件以固定大小的单元组成,每个单元称作cluster,每个cluster在物理磁盘中都是连续分布的,便于数据的读取和写入。cluster的大小即为虚拟机看到的虚拟磁盘基本单元大小,类似于机械硬盘的sector大小,一个cluster可能对应一个sector或者连续多个sector,取决与cluster size和sector size的比例。
虚拟磁盘的数据被拆分为一个个cluster,然后这些cluster用一个二级索引表组织起来,第一级称作L1 Table,第二级称作L2 Table,其组织形式如下所示:
其中L1 Table的大小可变,可能只占用一个cluster,也可能占用多个连续的cluster,L1 Table的大小在虚拟磁盘创建的那一刻就已经决定,并且在cluster大小相同的情况下,虚拟磁盘的大小越大,L1 Table的size也越大。每个L2 Table则固定占用一个cluster,不同的L2 Table不需要放在相邻的cluster上。L1 Table和L2 Table中每个entry的大小为64bit,因为以目前的磁盘容量来看,64bit的地址已经能够完全满足寻址需求了。
另外,由于qcow2文件支持在文件内部建立snapshot(在文件外建立snapshot即为差分文件),故需要对每个cluster的使用进行记录,即需要记录下每个cluster被引用的次数,这样当某个snapshot被删除的时候,才能够知道哪些cluster可以释放出来继续使用,哪些cluster还在被使用,主机不能主动修改。为了维持对cluster引用次数的记录