当前位置: 首页 > news >正文

qemu的外部快照原理

一 基础概念

1 外部快照
当一个快照被创建时,创建时当前的状态保存在当前使用的磁盘文件中,即成为一个backing file。此时一个新的overlay被创建出来保存往后的数据。
2 backing file和overlay
对基础镜像做外部快照,生成的快照文件被称为overlay,基础镜像成为backing file。backing file是只读的。示例链路如下:
base-img <-- overlay-1 <-- overlay-2 <-- overlay-3
仅支持base-img为raw file,其他节点为qcow2 file的链路,或者所有节点为qcow2 file的链路。
3 更多名词解释

  • cluster: qcow2镜像存储数据的最小单位,默认64K。
  • l2 entry: 描述cluster offset及其相关标志位的入口,长度为64位,与特定的掩码进行与操作后,可以得到cluster offset。
  • cluster offset: normal cluster位于镜像中的起始地址。
  • normal cluster: 存储未压缩的数据。
  • compressed cluster: 存储压缩数据。
  • unallocated cluster: L2 entry等于0,表明需要分配new cluster。

二 COW

COW是外部快照的读写流程中最重要的部分。
1 什么是COW
COW(Copy-On-Write),也被称之为「即写即拷」快照技术或「写时复制」快照技术,这种方式通常也被称为“元数据(源数据指针表)”拷贝。顾名思义,如果有人试图改写源数据块上的原始数据,首先将原始数据拷贝到新数据块中,然后再进行改写。
2 为何需要COW
当写请求发生在backing file上,要先分配new cluster。如果只是把要写的数据写到new cluster上,那数据是不完整的,因为每次写入的数据并非刚刚是cluster的整数倍,可能是几个或几个sector,所以需要我们把剩下的部分从old cluster上复制到new cluster,最后把这个cluster标记为allocated cluster。
当我们下次读该cluster,在overlay上就可以读到,且数据是完整的,不是残缺不全的。
3 如何COW
qcow2的COW并非先复制再写入,而是先写入再复制。步骤如下:

  • 分配new cluster。
  • 标记写时复制的范围cow_startcow_end,保存在结构体QCowL2Meta
  • 写入要写的数据到new cluster。
  • 把剩下的部分从old cluster复制到new cluster。
  • 用新的cluster offset更新l2 table,加上QCOW_OFLAG_COPIED标记。

三 cluster类型

1 cluster类型

typedef enum QCow2ClusterType {QCOW2_CLUSTER_UNALLOCATED, //未分配QCOW2_CLUSTER_ZERO_PLAIN,QCOW2_CLUSTER_ZERO_ALLOC,QCOW2_CLUSTER_NORMAL, //normalQCOW2_CLUSTER_COMPRESSED, //压缩
} QCow2ClusterType;

分为以下几种,当QCOW2_CLUSTER_NORMAL类型,且标记QCOW_OFLAG_COPIED,才无需分配cluster。其他情况均需要分配cluster。
2 如何获取cluster类型
qcow2_get_cluster_type获取cluster类型。

四 分配cluster

谁来决定分配cluster呢,是由l2 entry决定的,这里要搞清楚它的含义。
1 l2 entry各位含义,以standard clusters为例。
image
2 根据l2 entry决定是否分配cluster

  • l2 entry满足以下条件,为normal cluster,不分配新cluster。
    image
  • l2 entry的每一位都为0,为unallocated cluster,需分配新cluster。
    image
  • 满足63bit=0,且l2 entry & L2E_OFFSET_MASK != 0。该cluster被内部快照过,需分配cluster.
    image

五 读写流程

1 读流程
发生在qcow2_co_preadv中,分为两种情况:

  • 要读的数据在overlay上。
  • 要读的数据在backing file上。
qcow2_co_preadvret = qcow2_get_cluster_offset //计算cluster offset,并返回cluster type。switch (ret)case QCOW2_CLUSTER_UNALLOCATED:if (bs->backing) //读取backing file上的数据。bdrv_co_preadvcase QCOW2_CLUSTER_NORMAL:bdrv_co_preadv //读取overlay上的数据。

2 写流程
发生在qcow2_co_pwritev中,流程如下:

  • 如果不需要分配new cluster,将数据写入overlay。
  • 如果需要分配new cluster,但是没有backing file,或者backing file上找不到cluster offset,将数据写入new cluster。
  • 如果需要分配new cluster,且在backing file能找到cluster offset,执行COW。
qcow2_co_pwritevqcow2_alloc_cluster_offset //获取cluster offset,如果获取失败,分配new cluster。handle_alloc_space //new cluster填充零。bdrv_co_pwritev //将数据写入cluster。qcow2_handle_l2meta //当需要COW时,该函数执行COW。
http://www.gsyq.cn/news/889.html

相关文章:

  • 4. pod使用进阶
  • 构造记一下
  • 【IEEE出版】第四届电力系统与电力工程国际学术会议(PSPE 2025)
  • 最近顾问问了两次有没有批量更新XXX的程序,突然来了灵感
  • 2025.9.9 树套树 + 分治 刷题日记
  • Rocky9和Ubuntu使用pip安装python的库mysqlclient失败解决方式
  • MySQL SQL优化
  • JMESPath由浅入深完全入门教程(自用)
  • 我的2025新版泛目录站群探索之旅:智能化SEO的新世界 - 蚂蚁站群
  • 高效管理多站点的秘密武器:站群管理软件实战分享 - 蚂蚁站群
  • 基于 Dify on DMS 快速构建客服对话数据质检服务,完成任务可领取积分、定制手办等好礼!
  • PCTA/PCTP学习笔记-TiDB 数据库核心原理与架构
  • 镜像站群CMS使用手记 - 蚂蚁站群
  • 多站点管理:批量站群建站软 - 蚂蚁站群
  • Aivilization Ai小镇体验
  • JH-ViewInspector - Android 控件ID/控件详情获取工具
  • 2024-2025学年第二学期教务处助教工作总结
  • CSRF
  • 【日记】拜托,丝之歌不开挂真的能打得过吗(975 字)
  • 2025天津大学预推免机试题解
  • 数据挖掘与隐私:你真的匿名了吗?
  • 饮酒其五
  • 简单的sql注入方法
  • socket重定义错误
  • 实用的软件
  • 使用-Jest-测试-VueJS-组件-全-
  • 基于C#实现照片条形码识别
  • 虚拟内存不足怎么解决?虚拟内存不足的原因及解决方法
  • Tekla门钢边柱节点源码
  • 由于裁剪的图片较小