StratoVirt:下一代轻量级虚拟化VMM
StratoVirt 是什么
Strato,取自 stratosphere,意指地球大气层中的平流层,大气层可以保护地球不受外界环境侵害,而平流层则是大气层中最稳定的一层;类似的,虚拟化技术是操作系统平台之上的隔离层,既能保护操作系统平台不受上层恶意应用的破坏,又能为正常应用提供稳定可靠的运行环境;以 Strato 入名,寓意为保护 openEuler 平台上业务平稳运行的轻薄保护层。同时,Strato 也承载了项目的愿景与未来:轻量、灵活、 安全和完整的保护能力。
StratoVirt 是计算产业中面向云数据中心的企业级虚拟化VMM,实现了一套架构统一支持虚拟机、容器、Serverless 三种场景,在轻量低噪、软硬协同、安全等方面具备关键技术竞争优势。StratoVirt 在架构设计和接口上预留了组件化拼装的能力和接口,StratoVirt 可以按需灵活组装高级特性直至演化到支持标准虚拟化,在特性需求、应用场景和轻快灵巧之间找到最佳的平衡点。
为什么选择 Rust
在项目成立初期,我们调研了业界成熟基于 C 语言开发的虚拟化软件-QEMU,统计了在过去十几年中 QEMU 的 CVE 问题,发现其中有将近一半是因为内存问题导致的,例如缓冲区溢出、内存非法访问等等。如何有效避免产生内存问题,成为我们在编程语言选型方面的重要考虑。因此,专注于安全的 Rust 语言进入我们视线。
-
Rust 语言拥有强大的类型系统、所有权系统、借用和生命周期等机制,不仅保证内存安全,还保证并发安全,极大的提升软件的质量。在支持安全性的同时,具有零成本抽象特点,既提升代码的可读性,又不影响代码的运行时性能。 -
Rust 语言拥有强大的软件包管理器和项目管理工具-Cargo -
Cargo 能够对项目的依赖包进行方便、统一和灵活的管理。项目所有的依赖包都定义在 Cargo.toml 文件中,开发者可以按需使用来自 Rust 官方仓库 crates.io 的各类功能包。
-
Cargo 集成了完整的代码管理工具,例如项目创建(cargo new)、构建(cargo build)、清理(cargo clean)、测试(cargo test)、运行(cargo Run)等等。 -
Cargo 在代码静态扫描方面提供相应的工具,能够进一步提升开发者编码风格和代码质量。 -
cargo fmt:使用符合 rust-lang 定义的 Rust 代码风格来规范 Rust 代码。 -
cargo check:可以对本地项目库和所有依赖进行编译检查,它会通过对项目进行编译来执行代码检查。 -
cargo clippy:一个 Rust 语言的 lint 工具集合包,包含了超过 350 种 lint 规则。
StratoVirt 的优势
StratoVirt 是 openEuler 最稳定、最坚固的保护层。它重构了 openEuler 虚拟化底座,具有以下六大技术特点。
-
强安全性与隔离性 -
采用内存安全语言 Rust 编写,保证语言级安全性; -
基于硬件辅助虚拟化实现安全多租户隔离,并通过 seccomp 进一步约束非必要的系统调用,减小系统攻击面; -
轻量低噪 -
轻量化场景下冷启动时间<50ms,内存底噪<4M; -
高速稳定的 IO 能力 -
具有精简的设备模型,并提供了稳定高速的 IO 能力; -
资源伸缩 -
具有 ms 级别的设备伸缩时延,为轻量化负载提供灵活的资源伸缩能力; -
全场景支持 -
完美支持 X86 和 Arm 平台:X86 支持 VT,鲲鹏支持 Kunpeng-V,实现多体系硬件加速; -
可完美集成于容器生态,与 Kubernetes 生态完美对接,在虚拟机、容器和 serverless 场景有广阔的应用空间; -
扩展性 -
架构设计完备,各个组件可灵活地配置和拆分; -
设备模型可扩展,可扩展 PCIe 等复杂设备规范,实现标准虚拟机演进;
StratoVirt 的架构
StratoVirt 核心架构自顶向下分为三层:
-
外部 API: StratoVirt 使用 QMP 协议与外部系统通信,兼容 OCI,同时支持对接 libvirt。 -
BootLoader: 轻量化场景下使用简单的 BootLoader 加载内核镜像,而不像传统的繁琐的 BIOS 和 Grub 引导方式,实现快速启动;标准虚拟化场景下,支持 UEFI 启动。 -
模拟主板: -
microvm:为了提高性能和减少攻击面,StratoVirt 最小化了用户态设备的模拟。模拟实现了 KVM 仿真设备和半虚拟化设备,如 GIC、串行、RTC 和 virtio-mmio 设备。 -
标准机型:提供 ACPI 表实现 UEFI 启动,支持添加 virtio-pci 以及 VFIO 直通设备等,极大提高虚拟机的 I/O 性能。
StratoVirt源码目录解析主要分为四部分:
-
acpi:提供构建 ACPI 表的接口。 -
address_space:地址空间模拟,实现地址堆叠等复杂地址分配模式。 -
boot_loader:内核引导程序,实现快速加载和启动功能。 -
cpu:模拟多架构下的 vcpu。 -
devices:模拟中断控制器、串口等一系列主板的基础设备。 -
hypervisor:提供与内核 hypervisor 如 KVM 交互的 API 接口。 -
machine:模拟 microvm 以及标准 VM 机型。 -
machine_manager:提供虚拟机管理接口,兼容 QMP 等常用协议,可扩展。 -
migration:提供用于热恢复的相关 API 接口。 -
migration_derive:提供用于热恢复特性的过程宏实现。 -
ozone:提供了轻量虚拟化场景下的安全管理框架。 -
pci:实现了遵循 PCIe/PCI 协议规范的设备访问和模拟。 -
sysbus:模拟系统总线,所有非 PCI 类设备都挂在系统总线上。 -
util:提供一些通用接口的实现。 -
vfio:提供 VFIO 设备直通功能。 -
virtio:遵循 virtio 协议,支持 virtio-mmio 以及 virtio-pci 设备。
当前 StratoVirt 实现了两种机型:microvm 和标准机型。其中,microvm 实现了运行业务负载的最小的设备集合。因此 LightMachine 是 StratoVirt 最重要的顶层数据结构,它的逻辑上分为 CPU 模拟管理,地址空间管理,IO 设备模拟管理(包括中断控制器和 bus 数据结构中管理各类仿真设备,例如 virtio 设备,serial 设备等),如下图右侧所示:
x86_64 和 aarch64 下的标准机型分别为 q35 和 virt,可以通过 libvirt 来进行生命周期等标准虚拟机管理。标准机型的系统总线下拥有 PCIe 主桥,下面可以挂接 virtio-pci 设备,支持 VFIO 设备直通。此外,标准机型支持构建 ACPI 表,不仅可以提供 UEFI 的标准启动能力,还可以在未来提供设备热插拔、虚拟机更完善的生命周期管理能力。
首先,我们先看一下 address_space 地址空间模拟实现功能:
-
内存地址空间通过 Region 组成树形层次关系,支持地址堆叠和优化级。 -
通过快速映射算法形成扁平地址空间(Flat View)。 -
通过设置 Listener 监听地址空间变化,执行相关回调函数。
其次,我们再看一下 CPU 模拟实现功能:
-
基于 KVM 暴露接口实现虚拟 CPU 的硬件加速。 -
通过 ArchCPU 结构隐藏体系架构(aarch64 和 x86_64)差异,具体实现位于体系架构相关目录中。 -
Arc 反向索引该 CPU 所属的 LightMachine 虚拟机对象,使得后续在虚拟机内扩展设备时,CPU 可访问该对象。
最后,我们再看一下 IO 设备模拟功能:
轻量化虚拟机的主要设备均通过 VirtioMMIO 协议实现,统一通过 VirtioMmioDevice 数据结构来模拟。
在 IO 设备初始化阶段,通过 VirtioMMIO 协议协商前后端都可以访问的 virtio queue、中断事件以及通知事件等等。当前端 VM 有 IO 请求时,将请求数据写入 virtio queue 中,通过通知事件告知后端 StratoVirt;后端监听通知事件发生时,读取 virtio queue 中的请求数据,根据请求数据进行 IO 处理,IO 请求处理完成后,并以中断事件方式通知前端 VM。
virtio 设备同样也支持挂到 PCI 总线上,因此在拥有 PCIe 主桥的标准机型下支持为虚拟机添加 virtio-pci 设备。virtio-pci 设备同样遵循上图的 I/O 下发流程,只是传输层协议从 mmio 变成了 PCI。
StratoVirt 未来
StratoVirt 的发展路标为,通过一套代码架构分别提供轻量以及标准机型,支持 serverless、安全容器、标准虚机等多种应用场景:
-
轻量虚拟机模式下,单虚机内存底噪小于 4MB,启动时间小于 50ms,且支持 ms 级时延的设备极速伸缩能力,当前已经开发完毕,2020 年 9 月已经在 openEuler 社区开源; -
标准虚拟机模式下,可支持完整的机器模型,启动标准内核镜像,可以达成 Qemu 的能力,同时在代码规模和安全性上有较大优势。
关注我们
StratoVirt 当前已经在 openEuler 社区(openEuler 是一个开源、免费的 Linux 发行版平台,将通过开放的社区形式与全球的开发者共同构建一个开放、多元和架构包容的软件生态体系)开源。在未来的一段时间我们将开展一系列主题的分享,让大家更加详细的了解 StratoVirt 的实现,非常期待您的围观和加入!
项目地址:https://gitee.com/openeuler/stratovirt
项目 wiki:https://gitee.com/openeuler/stratovirt/wikis
项目交流:virt 邮件列表 或提交一个 issue。
virt 邮件列表:https://mailweb.openeuler.org/postorius/lists/virt.openeuler.org/
提交 issue:https://gitee.com/openeuler/stratovirt/issues
入群
如果您对虚拟化技术感兴趣,点击阅读原文即可可以进入 openEuler StratoVirt 主页查找相关资源,包括安装指导、虚拟机配置、代码仓库、学习资料等。也欢迎加入Virt SIG 技术交流群,讨论 StratoVirt、KVM、QEMU 和 Libvirt 等相关虚拟化技术。感兴趣的同学可以添加如下微信小助手,回复 StratoVirt 入群。
本文分享自微信公众号 - openEuler(openEulercommunity)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
如何向欧拉操作系统社区提交一个好 PR?
什么是 PR?借用知乎上的一个回答:用类比的方法来解释一下 pull reqeust。想想我们中学考试,老师改卷的场景吧。你做的试卷就像仓库,你的试卷肯定会有很多错误,就相当于程序里的 bug。老师把你的试卷拿过来,相当于先 fork。在你的卷子上做一些修改批注,相当于 git commit。最后把改好的试卷给你,相当于发 pull request,你拿到试卷重新改正错误,相当于 merge。 pull request 简称为 PR,在不同的系统中 PR 有不同的名字,有些系统中使用 MR 即 merged request 来表示 PR。 以 Gitee 为例,一个 PR 由以下几部分:标题、内容以及其评论、提交的代码和文件组成。 为什么说 PR 很重要? 首先,PR 是质量保证体系的基石。因为 PR 是真正合入代码,合入更新的入口,直接影响到项目最终交付件的质量。 其次,PR 是大规模协作开发的基石。欧拉社区的协作是在一个互不相见的“虚拟世界”,PR 几乎是大家交流最重要的通道了。是一种“交流”的语言。 最后,由于社区不会删除任何的 PR,每一个 PR 都记录在历史中,是社区文化的传...
- 下一篇
倪光南院士:欧拉与鸿蒙协同发展构建未来操作系统新生态
近年来,产业界在国家政策方针的指导下,在相关部门的带领下,通过产业链协同共建,通过开源开放共享的方式,打通操作系统产业“政产研学用”各环节,形成了有效合力,极大地促进了我国操作系统产业的跨越式发展。 “欧拉和鸿蒙两大操作系统相继开源。日前,在操作系统产业峰会 2021 上,华为携手社区全体伙伴共同将欧拉开源操作系统(openEuler,简称‘欧拉’)正式捐赠给开放原子开源基金会。”中国工程院院士倪光南表示,这是我国国产操作系统发展的新的历史时刻,欧拉将进入快速发展和推广阶段,为我国各行各业大量关乎国计民生的数字基础设施提供强大的支撑。 欧拉是一个开源操作系统,支持服务器、云计算、边缘计算、嵌入式等应用场景,支持多样性计算,提供安全、稳定、易用的操作系统。通过为应用提供确定性保障能力,支持 OT 领域应用及 OT 与 ICT 的融合。 “今年 6 月,华为已正式推出鸿蒙 2.0 系统。鸿蒙作为面向万物互联时代的智能终端操作系统,为不同设备的智能化、互联与协同提供了统一语言。鸿蒙实现了不同硬件的深度融合,通过无线连接、通过软件定义这些设备可以灵活地构成一个功能强大的超级终端,消费者使用体验...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- SpringBoot2整合Redis,开启缓存,提高访问速度
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS7设置SWAP分区,小内存服务器的救世主
- 设置Eclipse缩进为4个空格,增强代码规范
- CentOS7安装Docker,走上虚拟化容器引擎之路
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- Hadoop3单机部署,实现最简伪集群