qcow2 总结

qcow2 总结1 qcow2 文件分布对内存不了解的可跳过此部分 MMU 虚拟地址和物理地址 TLB TranslationL 4k 一个 page 需要一个地址存放 4K gt 4B 4G gt 4MB 100 万个页 100 个进程需要 400M 将页表 一级页表 分为 1024 个页表 二级页表 每个表 二级页表 中包含 1024 个 页表项 页表一定要覆盖全部虚拟地址空间 不分级的页表就需要有 100 多万个页表项来映射 而二级分页

与操作->右移->与操作。直到最后找到顶级表的索引,这里的地址指的是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

(0)
上一篇 2026年3月19日 上午11:35
下一篇 2026年3月19日 上午11:35


相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号