让KVM支持滚动热升级:Multi-KVM

Multi-KVM 允许多个独立的 KVM 模块在同一台 Linux 主机上同时加载、卸载和运行。主要包括:

  • 升级和回滚 KVM,而不会中断正在运行的虚拟机

  • 允许在同一主机上运行具有不同参数的 KVM 模块

  • 为 KVM 的 A/B 测试提供便利

1. 设计方案

隔离性

  • 从整个内核中隐藏 KVM 内部结构

  • 详细参见:  https://lore.kernel.org/lkml/20230916003118.2540661-1-seanjc@google.com[PATCH 00/26] KVM: vfio: Hide KVM internals from others - Sean Christopherson

Multi KVM

  • 将 kvm_intel.ko 和 kvm_amd.ko 合并为 kvm.ko 

  • 暴露多个 kvmN.ko 模块和 /dev/kvmN 设备 

  • "N" 通过 Kconfig 字符串定义(默认为 null/off)

VAC

  • 将 KVM 中的共享系统资源提取到新的 "基础模块"(VAC)中 

  • VAC = Virtualization Acceleration Code 虚拟化加速代码 (不可升级单元的模块)

用户空间

  • 无需更改用户空间 VMM

    • 符号链接(/dev/kvm -> /dev/kvmN)
    • kvm 绑定挂载等
  • 不需要用户空间更改部署、使用方式和VM生命周期管理等

2.主要工作

  • 将 KVM 内部结构与内核其他部分隔离

  • 修改基本模块名称/命名空间

  • 将 x86 厂商模块合并到 kvm.ko 中

  • 其他

3.LKML Review

From: Sean Christopherson <seanjc@google.com>
Subject: [PATCH 00/26] KVM: vfio: Hide KVM internals from others
Date: Fri, 15 Sep 2023 17:30:52 -0700  [thread overview]
Message-ID: <20230916003118.2540661-1-seanjc@google.com> (raw)Anish Ghulati (1):KVM: arm64: Move arm_{psci,hypercalls}.h to an internal KVM pathSean Christopherson (25):vfio: Wrap KVM helpers with CONFIG_KVM instead of CONFIG_HAVE_KVMvfio: Move KVM get/put helpers to colocate it with other KVM relatedcodevirt: Declare and define vfio_file_set_kvm() iff CONFIG_KVM is enabledvfio: Add struct to hold KVM assets and dedup group vs. iommufd codevfio: KVM: Pass get/put helpers from KVM to VFIO, don't do circularlookupKVM: Drop CONFIG_KVM_VFIO and just look at KVM+VFIOx86/idt: Wrap KVM logic with CONFIG_KVM instead of CONFIG_HAVE_KVMKVM: x86: Stop selecting and depending on HAVE_KVMKVM: arm64: Stop selecting and depending on HAVE_KVMKVM: s390: Stop selecting and depending on HAVE_KVMKVM: MIPS: Make HAVE_KVM a MIPS-only KconfigKVM: arm64: Include KVM headers to get forward declarationsKVM: arm64: Move ARM specific headers in include/kvm to arch directoryKVM: Move include/kvm/iodev.h to include/linux as kvm_iodev.hKVM: MIPS: Stop adding virt/kvm to the arch include pathKVM: PPC: Stop adding virt/kvm to the arch include pathKVM: s390: Stop adding virt/kvm to the arch include pathKVM: Standardize include paths across all architecturesperf/x86: KVM: Have perf define a dedicated struct for getting guestPEBS dataentry/kvm: Drop @vcpu param from arch_xfer_to_guest_mode_handle_work()entry/kvm: KVM: Move KVM details related to signal/-EINTR into KVMproperKVM: arm64: Move and consolidate "public" functions in asm/kvm_host.hpowerpc/xics: Move declaration of xics_wake_cpu() out of kvm_ppc.hKVM: PPC: Rearrange code in kvm_ppc.h to isolate "public" informationKVM: Hide KVM internal data structures and values from kernel at-largeMAINTAINERS                                   |   1 -arch/arm64/Kconfig                            |   1 -arch/arm64/include/asm/kvm_emulate.h          |   3 +arch/arm64/kvm/Kconfig                        |   2 -arch/arm64/kvm/Makefile                       |   2 -arch/arm64/kvm/arch_timer.c                   |   5 +-arch/x86/Kconfig                              |   1 -arch/x86/events/core.c                        |   5 +-arch/x86/events/intel/core.c                  |  18 +-arch/x86/events/perf_event.h                  |   3 +-arch/x86/include/asm/hardirq.h                |   2 +-...

这是一个没被标记为RFC的代码提交, 目的是将 KVM 的内部结构从内核中隐藏起来。这里的 "内部"指的是数据结构、枚举、#defines、API等。这些数据结构、枚举、#defines、API等本应仅限于KVM使用, 但却由于kvm_host.h的存在而暴露在其他地方。由于 kvm_host.h(以及其他头文件) 存在于全局 include 路径中,因此在任何地方都会暴露出来。

隐藏 KVM 内部结构的动机是为了在无需重启主机的情况下安全地加载新的KVM 模块。新KVM模块加载而无需重启主机, 其中的 "新 "并不一定是严格意义上的更新, 只是 KVM 的不同版本。隐藏KVM 的内部结构意味着这些资源可以在不同的 KVM 实例中进行更改。例如: 可以修改 kvm_vcpu 结构的布局, 以引入与新的 KVM 实例相关的新字段, 引入与新功能相关的新字段或解决硬件错误。

所有这一切的最终目标是允许在一台主机上同时加载和运行多个KVM模块。例如: 修复部署问题、解决错误或加入新功能,而无需关闭主机上不相干的虚拟机。

目前,我们的首要目标是让 KVM x86 达到这样一种状态, 即 KVM x86 不会将对外部无用的信息暴露给内核。例如: 页面写入跟踪将使用KVM-GT技术, 使用新的 API。

我不认为我在此之前 "正式"提出过隐藏 KVM 内部细节的想法, 因此我决定不标记此 RFC, 因为这些改动最终并非不具备侵入性, 而且在最后六个补丁之前的所有修改都不会标记为RFC, 即使隐藏KVM内部细节的实现最终被否决。

理想情况下, 将会有 5 个独立的提交, 如果我们想以这种方式合并这些内容,我觉得或许也可以实现。例如按照下列步骤提交:

 (1) VFIO 清理 

   (2) 删除 HAVE_KVM

   (3) 清理 Makefile

   (4) x86 perf 清理

   (5) 实现KVM隐藏细节

HAVE_KVM 和 virt/kvm 包括的东西, 并不是严格意义上的必需, 但我还是把它们包括进来了, 因为它们也是又必要处理的。

除了 #ifdef __KVM__ 方法, 我们还探索了其他几种方法, 但都非常糟糕。 我真正想做到的(现在也想做到)是把大部分的 kvm_host.h (以及其他 KVM 头文件) 藏在 virt/kvm 中, 但每次尝试都以失败告终。即使有 __KVM__ 宏保护也无济于事, 原因是每个架构的 kvm_host.h 与通用的 kvm_host.h 交织在一起。试图以迭代补丁提交看起来比较复杂(每个补丁不可避免地会滚成一头巨兽)。

我们考虑过的另一个想法(这是我想到的, 我甚至为在内部提出这个想法而感到羞愧)。那就是将所有头文件移到 virt/kvm 下, 在全局头文件路径中添加, virt/kvm/include 到全局头文件路径中, 然后让 KVM x86 在配置默认为隐藏 virt/kvm/include。

我讨厌这个想法因为它开创了一个不好的先例,需要大量的文件移动, 而不会给其他架构带来任何好处。我希望用 #ifdef __KVM__ 来保护 KVM 的内部结构,可以让我们慢慢地把代码整理干净, 以便有一天 KVM 只向内核的其他部分暴露少量的 API。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/180194.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言 移位操作符

<< 左移操作符>> 右移操作符 注&#xff1a;移位操作符的操作数只能是整数。 移位操作符移动的是二进制位。 整数的二进制表示有3种&#xff1a; 原码反码补码 正的整数的原码、反码、补码相同。 负的整数的原码、反码、补码是要计算的。 由负整数原码计算出反…

编写安全 JavaScript 代码的最佳实践

编写安全 JavaScript 代码的最佳实践 JavaScript 的动态特性使其成为事实上的浏览器语言和世界上最流行的编程语言。 JS 最受欢迎的有用功能之一是即时分析。这意味着浏览器在下载内容的同时执行代码&#xff0c;这显然有其优势。然而&#xff0c;这种程度的自由也伴随着问题…

广域网技术

广域网 wide area net(WAN) 电路交换网分组交换网&#xff08;数据报|虚电路&#xff09;专用线路网 静态路由算法: 手动填入路径至路由表中,且路径保持不变. 适用于拓扑结构比较稳定, 网络规模比较小的网络。 动态路由算法 通过与邻居通信 不断学习, 根据网络拓扑结构变化而…

【工业智能】Solutions

各类问题对应的解决方案 工艺参数推荐APC 排产调度智能算法强化学习 运筹优化空压机群控 预测 工艺参数推荐 APC 排产调度 智能算法 遗传算法 强化学习 DDQN 运筹优化 空压机群控 MIP混合整数规划 能耗优化 预测 电池容量预测 时序预测&#xff0c;回归预测 点击剩余…

【好用的个人工具】在Docker环境下部署Simple mind map思维导图工具

【好用的个人工具】在Docker环境下部署Simple mind map思维导图工具 一、Simple mind map介绍1.1 Simple mind map简介1.2 Simple mind map特点 二、本地环境介绍2.1 本地环境规划2.2 本次实践介绍 三、本地环境检查3.1 检查Docker服务状态3.2 检查Docker版本3.3 检查docker co…

Java后端使用XWPFDocument生成word文档,踩坑

以下都是借鉴网上内容: 环境 纯后端, java, spring项目 maven管理. maven内容: <dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>3.16</version></dependency><dependency>…

Centos查看运行内存大小

在CentOS上&#xff0c;你可以使用以下几种方法来查看内存占用情况&#xff1a; 使用 free 命令&#xff1a; free -h这个命令会显示系统的物理内存和交换空间使用情况&#xff0c;以人类可读的方式显示。 使用 top 命令&#xff1a; top在top命令的输出中&#xff0c;第一…

Django:通过user-agent判断请求是来自移动端还是PC端(电脑端)

第一种思路&#xff1a; 根据博文 Djano的request.META是什么&#xff1f;的研究成果&#xff0c;先判断有无键HTTP_SEC_CH_UA_MOBILE&#xff0c;如果没有&#xff0c;再去按博文 网站如何判断请求是来自手机-移动端还是PC-电脑端&#xff1f;如何让网站能适应不同的客户端&am…

Flink流批一体计算(21):Flink SQL之Flink DDL

目录 执行 CREATE 语句 Python脚本 Java代码 SQL语句 列定义 物理/常规列 元数据列 计算列 WATERMARK PRIMARY KEY PARTITIONED BY AS select_statement Flink SQL是为了简化计算模型、降低您使用Flink门槛而设计的一套符合标准SQL语义的开发语言。 执行 CREATE 语…

freerots启动过程分析(qemu仿真RISC-V架构为例)

1、前言 本文是基于qemu上virt板子适配的freertos系统源码进行讲解qemu安装可参考博客&#xff1a;《qemu源码下载和安装》&#xff1b;freertos移植到qemu上运行可参考博客&#xff1a;《移植freertos到qemu上运行》&#xff1b; 2、汇编代码部分 汇编文件&#xff1a;FreeR…

集成学习的两种常见策略:bagging VS. boosting

chatGPT回答&#xff0c;记在这里。 集成学习是一种通过组合多个弱学习器来构建一个更强大的学习器的方法。其中&#xff0c;bagging和boosting是两种常见的集成学习策略。 一、bagging & boosting 简介 Bagging&#xff08;自助聚集法&#xff09;&#xff1a; Bagging…

Web框架与Django路由层

Web框架 一 web框架 Web框架&#xff08;Web framework&#xff09;是一种开发框架&#xff0c;用来支持动态网站、网络应用和网络服务的开发。这大多数的web框架提供了一套开发和部署网站的方式&#xff0c;也为web行为提供了一套通用的方法。web框架已经实现了很多功能&…

golang面试题:reflect(反射包)如何获取字段tag​?为什么json包不能导出私有变量的tag?

问题 json包里使用的时候&#xff0c;会结构体里的字段边上加tag&#xff0c;有没有什么办法可以获取到这个tag的内容呢&#xff1f; 举例 tag信息可以通过反射&#xff08;reflect包&#xff09;内的方法获取&#xff0c;通过一个例子加深理解。 package mainimport ("…

基于单片机的智能饮水机控制系统(论文+源码)

1. 系统设计 本次智能饮水机控制系统的设计研究一款以STC89C52单片机为核心的智能饮水机控制系统&#xff0c;其主要功能设计如下&#xff1a; 1.该饮水机利用DS18B20数字温度传感器实时采集饮水机内水的温度&#xff0c;其检测温度范围为0-100℃&#xff0c;精度0.1℃&#…

拆解按摩器:有意思的按键与LED控制电路,学习借鉴一下!

拆解 外观和配色个人感觉还行,比较青春 拉开拉链&#xff0c;拆开外面的布面&#xff0c;里面还有一层纱面 按键部分使用魔术贴固定 拆开纱面后&#xff0c;看到里面的结构&#xff0c;整体是一个海绵 可以看到如下&#xff0c;电池&#xff0c;按键板&#xff0c;充电线的三条…

Java 设计模式——建造者模式

目录 1.概述2.结构3.实例3.1.产品类3.2.抽象建造者类3.3.具体建造者类3.4.指挥者类3.5.测试 4.优缺点5.使用场景6.模式扩展7.创建者模式对比 1.概述 建造者模式 (Builder Pattern) 是一种创建型设计模式&#xff0c;用于创建复杂对象。它将对象的构建过程分离成独立的部分&…

单片机开发常见问题集合

文章目录 发送串口数据偶尔丢失字节 发送串口数据偶尔丢失字节 场景&#xff1a; 在STM32单片机中进行串口数据发送&#xff0c;在Linux/Windows上进行串口数据接收&#xff0c;会偶发出现接收到的数据有某些字节丢失。 分析&#xff1a; 在STM32中可以使用printf用于发送串口…

前端 | iframe框架标签应用

文章目录 &#x1f4da;嵌入方式&#x1f4da;图表加载显示&#x1f4da;100%嵌入及滑动条问题&#x1f4da;加载动画保留 前情提要&#xff1a; 计划用iframe把画好的home1.html&#xff08;echarts各种图表组成的html数据大屏&#xff09;嵌入整合到index.html&#xff08;搭…

快速筛出EXCEL行中的重复项

比如A列是一些恶意IP需要导入防火墙&#xff0c;但包括一些重复项&#xff0c;为不产生错误&#xff0c;需要把重复项筛出来&#xff1a; 1、给A列排序&#xff0c;让重复项的内容排在相邻的行 2、在B列中写一个条件函数&#xff1a;IF(A1A2,1,0)&#xff0c;然后下拉至行尾完成…

java设计模式 开闭原则

开闭原则&#xff08;Open-Closed Principle&#xff0c;OCP&#xff09;是面向对象设计中的一个重要原则&#xff0c;它指导着我们如何设计和组织代码&#xff0c;以便使系统在扩展性和可维护性方面更加优秀。 开闭原则的定义是&#xff1a;软件实体&#xff08;类、模块、函数…