Qemu 中 Bitmap 的应用

QEMU(2) QTAILQ队列 QTAILQ队列是QEMU重要的数据结构,例如用来保存QEMU参数等。 QTAILQ_ENTRY QTAILQ_ENTRY描述前一个和下一个元素的结构体 #define Q_TAILQ_ENTRY(type, qual) \ struct { ... 阅读详情

Bitmap(位图)是一种常用的结构,通过使用 bit 位来记录一些逻辑状态。在 Qemu 中,Bitmap 用来记录 block 块设备的 sectors 是否为脏块,并被应用于多种常用的 block 操作中。

一、Qemu 中 Bitmap 结构简介

通常,一个 unsigned long 类型变量或数组即可作为 Bitmap 来记录状态,但当 Bitmap 比较大的时候,它的操作效率很低。Qemu 使用的 blockdrive 要使用 Bitmap 记录块设备的状态,每个块都对应一个 bit 位,按位表示会生成一个很大的 Bitmap,这会严重降低需要频繁查询 Bitmap 状态的块操作的执行效率。因此,Qemu 专门设计了 HBitmap 数据结构,并实现了 Bitmap 的查找、置位、计算总数、合并等操作。

HBitmap 数据结构如下:

struct HBitmap {
 uint64_t size; 
 uint64_t count;
 int granularity;
 HBitmap meta;
 unsigned long levels[HBITMAP_LEVELS]; 
 uint64_t sizes[HBITMAP_LEVELS]; 
};

本文不过多涉及 Qemu HBitmap 内部的具体数据结构与寻址计算,细节可参考 Qemu 源码(util/hbitmap.c)中 HBitmap 相关操作接口的实现。


二、Qemu 中 Bitmap 的典型应用场景

Qemu 使用 Bitmap 记录磁盘状态,将 HBitmap 结构作为 Bitmap 的源数据封装在 BdrvDirtyBitmap 结构中,在 block 操作(e.g. drive-mirror,backup)中调用 bdrv 接口操作 Bitmap。

Drive-Mirror 过程中的 Bitmap 使用

Drive-mirror 操作可以动态的(vm 运行状态下)改变 block chain,主要应用于 live migrate 与 block-commit 。

Drive-mirror执行流程及主要调用函数如下图所示:

v2-65a1d473a07905fd584c391245e52432_b.png


Drive-mirror 开始时,会先根据 block chain 生成 Bitmap,该 Bitmap 将用于后续的数据迭代拷贝过程。在 full 模式下,Bitmap 会根据完整 block chain 的状态生成;在 top 模式下,Bitmap 根据 active 层 block 状态生成。

Drive-mirror 过程中创建的 Bitmap 为匿名 Bitmap,drive-mirror操作结束后,会自行销毁,外部用户无法使用 qmp 命令对该 bitmap 进行删除,清空操作。

在 drive-mirror 过程中,Qemu 通过 bdrv_get_dirty_count 在各个操作间获取 Bitmap 记录的脏块个数。当脏块个数为零,且没有未决(正在处理的 IO 请求)数据时,Qemu 判断 mirror 到达 ready 状态并发送 ready 信号。当收到用户发送的 complete & cancel 消息时,Qemu 再次获取脏块数量,并在确认没有新增 IO 操作产生的数据时,进入 complete 过程结束 drive-mirror 过程。

在 drive-mirror 传输数据的迭代过程中,每次根据 Bitmap 标记的脏块状态,迁移一段连续的块数据,并清除这些块的 Bitmap 标记。当 vm 内部有对这些块的写操作时,相应的 Bitmap 位会被再次置位,因此 drive-mirror 过程需要持续迭代,直到 Bitmap 为空,即此时所有脏块已完成拷贝,且没有新的脏块产生,才达到 ready 状态。drive-mirror 结束后,该 Bitmap 会被自动销毁。

Backup Incremental 过程中的 Bitmap 使用

Drive-backup 操作可以拷贝当前的块设备状态到指定的目标设备,与 drive-mirror 的 block chain 的动态切换不同,backup 操作只生成当前镜像的副本,vm 仍然使用原有的镜像链。因此 backup 操作可以用于块设备的备份。

Backup 操作支持三种操作模式,full 模式拷贝完整 block chain 的数据;top 模式拷贝 active 层的数据。第三种 incremental 增量模式,则可以根据指定的 Bitmap 进行数据拷贝,即仅拷贝指定 Bitmap 标记的脏块到目的镜像,这使得执行 backup 操作时,可以在首次备份时使用 full 模式 backup,后续备份采取增量模式,以 full 模式备份的数据作为基准,从而无需每次都备份全量数据,加快了备份操作的拷贝速度。

典型的使用增量操作方式过程如下:
1. 执行full模式backup
2. 对block设备创建bitmap
3. 指定上一步创建的bitmap,执行增量操作
4. 执行第二次增量操作,以此类推

与 mirror 操作不同,用户在执行增量 backup 前,需要先手动创建命名 Bitmap,然后在增量任务开始时指定 Bitmap 名称。每次执行增量模式 backup 后,Qemu 会自动清空 Bitmap,确保每次 Bitmap 记录的都是两次增量操作间的 block 状态,从而确保增量数据没有重叠。


三、Bitmap 热迁移

Bitmap 记录块设备状态,被 Qemu 进程管理,并被应用于 Qemu 的块设备操作,因此当 vm 迁移时,Bitmap 也需要迁移。

Qemu 的热迁移包含源端与目的端两部分逻辑,数据以固定格式字节流的形式发送。Qemu 在迁移时,根据发送数据对象长度,循环发送字节流至目的端,热迁移源端主要流程如下:

v2-3718011c4923c8ab801d83174c71d32d_b.png


RAM 的迁移是通过 iteration 分段传输的,但 Bitmap 迁移时,由于 vm 内部依然会有用户 IO 操作,而 Bitmap 需要记录写磁盘状态,因此如果分段迁移,就可能会破坏 Bitmap 在源端与目的端的一致性。

Qemu 进行 Bitmap 热迁移时,先判断如果 vCPU 处于 running 状态,则每次循环时不会分段传输 Bitmap 数据。Bitmap 会在 migration_completion 阶段,vCPU 被 stop,且 aio request 都被正确记录后,一次性传输至目的端。这使得当 vm 内部有 IO 操作时,Bitmap 仍然能正常记录 block 脏块,而不会出现部分 Bitmap 被迁走后,该段 Bitmap 对应的 block sector 又有数据写入,导致源端、目的端 Bitmap 数据不一致的情况。

四、Qemu Bitmap 相关 qmp 命令

Bitmap 与 block 设备相关联,可以通过 qmp 命令 { “execute”: “query-block”} 查看 block,同时获取所有与块设备相关联的命名与匿名 Bitmap 状态。此外,Qemu monitor 提供了 Bitmap 的基本操作命令,如下:

向指定块设备添加 Bitmap

{ "execute": "block-dirty-bitmap-add",
 "arguments": { "node": "drive0", "name": "bitmap0" } }

删除指定块设备上的 Bitmap

{ "execute": "block-dirty-bitmap-remove",
 "arguments": { "node": "drive0", "name": "bitmap0" } }

清空 Bitmap 状态

{ "execute": "block-dirty-bitmap-clear",
"arguments": { "node": "drive0", "name": "bitmap0" } }

注意 qmp 命令只能对命名 Bitmap 操作,无法对像 drive-mirror 过程中由任务创建的匿名 Bitmap 进行操作。

本文作者:马昊骢


滴滴云-为开发者而生

Go语言直连QEMU与libvirt:云原生虚拟化控制面新范式 虚拟化控制面正从Shell脚本和C绑定转向原生语言深度集成。QEMU和libvirt作为主流开源虚拟化引擎,其传统调用方式存在内存不安全、跨平台分发难、错误诊断弱等工程瓶颈。Go语言凭借内存安全、静态编译、goroutine并发等特性,成为重构虚拟化API的理想载体。go-qemu通过QMP协议实现毫秒级JSON-RPC直控,go-libvirt则以纯Go重写连接管理与域建模,规避cgo风险。二者共同支撑边缘轻量调度、Serverless沙箱、多架构CI等云原生场景,标志着基础设施编程进入类型安全、可观测、 阅读详情

相关推荐

KVM虚拟机实现在线热迁移的方法步骤(图文)

一、KVM虚拟机的迁移方式及需要注意的问题 KVM虚拟机的迁移有两种方法: 1、静态迁移(冷迁移):对于冷迁移,就是在虚拟机关闭状态下,将虚拟机的磁盘文件及.xml配置文件(这两个文件组成了一个虚拟机)复制到要迁移到的目标主机上,然后在目标主机上使用“virsh define *.xml”命令重新定义虚拟机即可。 2、动态迁移(热迁移):对于热迁移,比较常用,通常是这台服务器上正在跑着一些业务,而这些业务又不允许中断,那么就需要使用热迁移了,这篇博文将详细写出热迁移的步骤。 1、冷迁移 通常我们存放虚拟机磁盘的目录都是挂在的一个nfs文件系统的磁盘,而这个磁盘通常是LVM文件系统。所以需要

QEMU/KVM磁盘在线备份

QEMU/KVM磁盘的在线完整及增量备份,是“打包”方案的一种具体实现,可实现基于时间点的备份,同时支持本地与远程2种备份方式,并可指定备份文件进行恢复。 tag: qemu, kvm, disk, live, backup, incremental, bitmap 小慢哥的原创文章,欢迎转载 目录 ▪ 1. 本文缘由 ▪ 2. 最终能实现什么 ▪ 3. 环境说明 ▪ 4. 常用命...

weixin_37061303的博客 1044

PyTorch版Unet训练后别只看loss:手把手教你计算并可视化多类别语义分割的mIoU(附完整代码)

本文详细介绍了在PyTorch中使用Unet模型进行多类别语义分割后,如何计算和可视化mIoU(mean Intersection over Union)以全面评估模型性能。通过完整的代码示例和实用技巧,帮助开发者从loss优化转向更精准的区域分割评估,特别适用于医学图像分析等关键场景。

weixin_30906185的博客 435

QEMU脏页速率计算原理

dirty-ring和dirty-bitmap都可以实现脏页速率计算,本文介绍这两种机制的实现原理。两种方式正在合入开 qemu社区,预计在qemu-6.1之后支持

Take Easy,Work Hard! 2905

HarmonyOS ArkTS开发实战:用Axios封装一个通用的网络请求工具类(附完整代码)

本文详细介绍了如何在HarmonyOS ArkTS开发中利用Axios封装一个通用的网络请求工具类,涵盖架构设计、核心模块实现、UI状态联动及高级功能扩展。通过单例控制器、拦截器链配置和Token自动刷新机制,提升网络请求的稳定性和可维护性,适用于各类HarmonyOS应用开发场景。

weixin_30772105的博客 491

本地化搭建DeepSeek+RAGFlow,构建个人知识库

本地化搭建DeepSeek+RAGFlow,构建个人知识库。至少32G以上内存、500G以上空余磁盘空间。

gogospecter的专栏 7424

Qemu 增量备份功能当前的问题及解决方案

Qemu 中提供了一种增量的backup机制,其核心的思想是写时复制,这里的写表示的是guest的写操作,其主要的工作原理是backup的工作线程会根据qemu中维护的block dirty bitmap 将新写入的数据块写到备份的存储设备当中,如果在备份的工作中block dirty bitmap中对应的某个数据块被guest写入,qemu会优先将img 中的该数据块复制到备份存储设备中,然后在...

liliang365的专栏 1056

MySQL下载和安装教程

1.下载MySQL数据库可以访问官方网站:https://www.mysql.com/ 2.点击DOWNLOADS模块下的Community模块下的MySQL Community Server进行下载。 由于目前最新版本是:MySQL Community Server 5.7.21 建议博友下载历史版本,本博下载的是5.6.39 下载步骤: 进入,选择MySQL的版本及主机 根据自己的电脑选择相应的位数进行下载,本机是64位,点击download。 进入下.

残雪的剑的博客 4万+

QEMU-img工具

QEMU-img工具

一起coding,一起嗨。 2377

ROS2实战:打造智能巡检机器人的关键技术与实现

本文详细介绍了基于ROS2和Navigation2构建智能巡检机器人的完整实战流程。通过设计主从协作的事件驱动架构,实现了机器人在已知地图中的自动导航、定点语音播报和环境图像采集功能。文章涵盖了从环境搭建、仿真配置到核心控制节点、语音服务与图像记录模块的代码实现,为开发者打造实用的自动巡检机器人提供了清晰的技术指南。

weixin_29031057的博客 222

【RT-DETR涨点改进】独家小目标涨点改进篇 | TGRS 2025 | RT-DETR引入ABRNet小目标检测顶刊中的:ARF自适应性感受野和MCA双向交叉轴注意力,适合小目标检测有效涨点

本文提出了一种改进的RT-DETR小目标检测方法,通过集成自适应感受野模块(ARF)和多尺度交叉轴注意力模块(BC)来提升检测性能。ARF模块采用多种卷积核动态调整感受野,有效捕获多尺度目标特征并减少背景干扰;BC模块通过多尺度交叉轴注意力机制增强全局信息提取和特征融合能力。实验表明,该方法在复杂背景下显著提升了红外小目标检测的精度和效率,同时降低了计算开销。文章详细介绍了模块结构、原理及实现代码,并提供了多种改进配置方案,为小目标检测任务提供了有效的解决方案。

Ai缝合怪、助力小伙伴高效发论文 570

ilgenerator创建bitmap对象_Qemu 中 Bitmap 的应用

Bitmap(位图)是一种常用的结构,通过使用 bit 位来记录一些逻辑状态。在 Qemu 中,Bitmap 用来记录 block 块设备的 sectors 是否为脏块,并被应用于多种常用的 block 操作中。一、Qemu 中 Bitmap 结构简介通常,一个 unsigned long 类型变量或数组即可作为 Bitmap 来记录状态,但当 Bitmap 比较大的时候,它的操作效率很低。Qem...

weixin_29555609的博客 137

QGIS之七建筑面由DSM和DEM获取高度并可视化

QGIS建筑面由DSM和DEM获取高度并可视化

yilvyangguang520的博客 3511

【转】QEMU/KVM磁盘在线备份

QEMU/KVM磁盘的在线完整及增量备份,是“打包”方案的一种具体实现,可实现基于时间点的备份,同时支持本地与远程2种备份方式,并可指定备份文件进行恢复。 转载的文章,看了之后,对这个理解更深了,但是应用到生产还是需要有些改动的,比如迁移时迁移bitmap的优化,bitmap持久化,磁盘扩容清除bitmap这些,libvirt 和上层管理端还是需要好好配合下。 1. 本文缘由 在虚拟化底...

wllabs的专栏 976

YOLOv11改进策略【卷积层】| CVPR-2023 部分卷积 PConv 轻量化卷积,降低内存占用

本文记录的是利用优化的目标检测方法研究。深度可分离卷积可以减少FLOPs,但会导致更高的内存访问,引起延迟并减慢整体计算。部分卷积利用逐点卷积处理通道冗余,减少模型计算量和内存访问量。Run, Don’t Walk: Chasing Higher FLOPS for Faster Neural Networks的实现代码如下: 四、创新模块 4.1 改进点⭐ 模块改进方法: 1️⃣ 加入。添加后如下:2️⃣:加入基于的。利用改进模块,减少通道冗余。改进代码如下:首先添加如下代码让加入,并重命名为 再添加如

Limiiiing的博客 3873

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

LWN: QEMU中的数据变动跟踪与差分备份!

关注了就能看到更多这么棒的文章哦~Changed-block tracking and differential backups in QEMUNovember 17, 2020This...

Linux News搬运工 1532

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

QOM(QEMU)设备管理机制概述

QEMU的对象管理是很重要的一个部分,linux中一切皆文件,作为整个虚拟机的后端,qemu中虚拟的一切实体皆Object,不管是CPU、设备还是KVM的使用都离不开QOM框架(Qemu Object Module)。 本文对QOM设备管理机制做简单清晰的介绍,然后以VIRTIO设备举例说明,方便更好的理解。 一、关键数据结构 QOM采用了C++里面向对象的命令方式,每一类对象会实例化一个Class,类的成员是这类对象通用的内容,比如一些统一的操作接口(方法)、VIRTIO设备的PCI VENDOR/

leiyanjie8995的博客 3509

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

qemu cow镜像分析

最近研究了以下qemu最简单的read on direct 镜像格式cow,在稀疏文件的模式下,这种方式还是比较简单,而且有优势的。其优势主要体现在云计算环境中,不需要用到qcow2的那些诸如内部快照,加密,压缩的功能。同时,我觉得作为中间一层的磁盘镜像,要尽可能的利用文件系统的功能而不是像qcow2一样的另立门户,搞一套索引表和块映射表。因为在云计算环境下,一般都是使用主镜像+增量镜像的方式,这...

weixin_30905981的博客 481

QEMU设备模型揭秘:从QOM结构体到虚拟化架构的构建艺术

本文深入解析QEMU设备模型QOM的核心架构与实现机制,从DeviceClass和DeviceState结构体出发,详细阐述类型注册、继承机制及设备实例化流程。重点探讨CPU虚拟化与指令转换技术,并结合RISC-V SoC开发实践,揭示QEMU在构建高效虚拟化架构中的设计哲学与艺术。

pz89012345的博客 184

KVM内存迁移实战:从PML硬件加速到Dirty Bitmap,如何高效同步脏页?

本文深入探讨KVM虚拟化平台下的内存迁移优化实践,重点分析Intel PML硬件加速与Dirty Bitmap软件方案在脏页同步中的性能对比与实战应用。通过详细的技术解析和性能数据,帮助开发者高效实现虚拟机内存迁移,显著减少停机时间和CPU开销。

weixin_30363981的博客 239

PebbleOS完全指南:智能手表操作系统开发入门到精通

想要为智能手表开发应用却不知从何开始?PebbleOS智能手表操作系统为你提供了完美的起点!🎯 这个轻量级、高效能的智能手表操作系统最初为Pebble智能手表开发,现已开源,支持C和JavaScript语言开发,专为内存像素显示和长电池寿命优化。无论你是初学者还是有经验的开发者,这篇完整指南将带你从零开始掌握PebbleOS开发的全过程。 ## 📱 什么是PebbleOS? PebbleO

gitblog_00668的博客 524

深度解析WinApps跨平台应用图标提取的技术实现与优化方案

WinApps作为一个创新的开源项目,实现了在Linux系统上无缝运行Windows应用程序的技术突破。其核心技术之一是通过智能图标提取机制,让Windows应用在Linux桌面环境中呈现原生应用般的视觉效果。本文将深入探讨WinApps图标提取的技术架构、核心算法实现细节、性能优化策略以及实际应用场景。 ## 技术背景与架构设计 WinApps通过虚拟化技术(KVM/QEMU、Docker或

gitblog_00007的博客 518

从零构建操作系统:学生团队实战指南与核心技术解析

操作系统是计算机系统的核心软件,负责管理硬件资源并为应用程序提供运行环境。其基本原理在于通过内核实现进程管理、内存管理、文件系统和设备驱动等核心功能,为上层应用提供稳定、安全、高效的抽象服务。在技术价值上,深入理解操作系统原理是提升系统编程能力、进行性能优化和开发底层软件的关键。对于学生开发者和技术爱好者而言,从零开始实现一个操作系统是掌握计算机系统知识的绝佳实践路径。本文将聚焦于操作系统开发中的核心模块,如引导程序、内存管理和进程调度,并详细解析使用C语言、汇编以及QEMU模拟器等工具链构建最小可运行内核

weixin_34267123的博客 679

kAFL Hypercall API完全参考:从基础调用到高级应用

kAFL是一款针对全虚拟机内核/驱动目标的模糊测试工具,其Hypercall API为guest VM与fuzzer前端之间提供了关键的通信桥梁。本文将全面解析kAFL Hypercall API的核心功能、使用方法和最佳实践,帮助开发者快速掌握从基础调用到高级应用的完整流程。 ## 一、kAFL Hypercall API基础概念 kAFL/Nyx模糊测试中,guest VM通过特殊的hyp

gitblog_00784的博客 418

【指令集对比】——CLZ指令在RISC-V与ARM架构下的实现与应用

本文深入对比了CLZ指令在RISC-V与ARM架构下的实现与应用,重点分析了其在位操作优化、数据规范化和优先级编码等场景中的高效性能。通过实测数据和优化案例,展示了CLZ指令在提升算法效率方面的显著优势,特别是在图像处理和内存分配等关键领域。

weixin_30883311的博客 387

OpenClaw模糊测试工具:架构解析与核心模块实现

模糊测试(Fuzzing)是一种通过向程序输入非预期数据来发现软件漏洞的自动化测试技术。其核心原理在于通过变异算法生成大量测试用例,监控程序执行状态,从而触发异常行为。这项技术的价值在于能够高效发现内存安全、逻辑错误等传统测试难以覆盖的缺陷,广泛应用于安全审计、软件质量保障等领域。在具体实现中,模糊测试工具通常包含执行器、变异器和调度器等核心模块,其中执行器负责与目标程序交互,变异器生成测试数据,调度器优化测试策略。本文以OpenClaw项目为例,深入剖析其模块化架构设计,特别是ptrace系统调用在进程控

weixin_30631587的博客 389
上一篇: 滴滴开源小程序框架 Mpx
下一篇: 使用滴滴云进行Kubernetes1.13集群搭建
「已注销」
博客等级 码龄6年 395粉丝 158原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值