与操作->右移->与操作。直到最后找到顶级表的索引,这里的地址指的是qcow2文件内的偏移
3、预分配(preallocation)策略
For this test each virtual disk is mounted and written to using dd
4、计算
镜像的大小计算 https://my.oschina.net/LastRitter/blog/
refcount table:引用计数表;refcount blocks:引用计数块。
引用计数块的每个条目存放了cluster的引用计数,引用计数表存放的是引用计数块的起始地址。
qcow2为啥要记录cluster的引用计数?
所以简单实用标记来记录只读属性没有用,因此qcow2引入了引用计数表和引用计数块,这两张表用来记录cluster的引用计数。
cluster引用计数为0:这个cluster没有被使用。
cluster引用计数为1:这个cluster正在被使用。
cluster引用计数为2或者以上:这个cluster正在被使用,并且有快照包含了这个cluster,写这个cluster之前需要执行cow。
有了引用计数这个基础功能,快照这个高级特性才得以实现。
因此可以说,引用计数表和引用计数块是为了实现qcow2快照而设计的。
复制一份L1表,将所有已被分配的L1和L2表项的最高位置位0,以及对应的refcount计数加1;
在快照表中新分配个表项,把L1属性指向新创建的L1表,Header中的nb_snapshots加1;
簇分配(不预先分配时的算法,写入时进行分配,读取时不分配,直接填充0)
当要向偏移地址offset处写入数据时,从Header的l1_table_offset中获得L1表的起始偏移地址;
如果L2表的表述符的最高位为0(未被分配或者是COW),则需要新分配L2表;
从refcount表和refcount块中查找2块未被使用的簇,标记为1;
初始化第一个簇为L2表,并使用它的起始地址初始化对应的L1表项;
初始化第二个簇,并使用它的地址初始化对应的L2表项;
使用第二个簇的首地址加上偏移地址的簇内偏移得出其真实地址;
在此地址进行数据写入。
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/208440.html原文链接:https://javaforall.net
