【51CTO.com快译】rust-vmm有助于在Rust虚拟机监控器之间共享核心虚拟化组件。
一年多以前,我们开始开发Firecracker,这是在KVM(基于内核的虚拟机)上运行的虚拟机监控器(VMM)。我们想创建一种迅速启动虚拟机的轻量级VMM,内存占用少,从而打造高密度云环境。
我们开始通过分支Chrome OS VMM(CrosVM)来开发Firecracker,但由于我们针对不同的客户使用场景,没过多久就有了分歧。CrosVM在ChromeOS中提供Linux应用程序隔离,而Firecracker用于大规模运行多租户工作负载。尽管我们现在走不同的道路,仍然拥有通用的虚拟化组件,比如基于KVM输入/输出控件(ioctls)的包装器、最小的内核加载器以及使用Virtio设备模型。
考虑到这一点,我们开始考虑共享通用代码的***方法。拥有共享的代码库可以提升这两个项目的安全和质量标准。目前,修复安全漏洞需要重复的工作:将更改从一个项目移植到另一个项目,经历不同的审核流程来合并更改。开源Firecracker后,我们接到了添加功能的请求,包括GPU支持和启动bzImage文件。一些请求与Firecracker的目标不一致,却是原本合情合理的使用场合,只是没有找到适合实施的地方。
rust-vmm项目
rust-vmm项目于2018年12月问世,当时亚马逊、谷歌、英特尔和Red Hat的员工开始讨论共享虚拟化软件包的***方式。在此过程中,更多的贡献者加入了这项计划。我们仍然处于这个过程的开始阶段,只有一个组件发布到了Crates.io(Rust的软件包注册中心),另外几个组件(比如Virtio设备、Linux内核加载器和KVM ioctls包装器)正在开发中。两个用Rust编写的VMM正在积极开发中,构建其他专用VMM日益受到关注,rust-vmm是作为共享核心虚拟化组件的主机而诞生的。
rust-vmm的目标是使社区能够创建自定义VMM,仅针对使用场合导入所需的构建模块。我们决定将rust-vmm组织成一个多存储库项目,每个存储库对应一个独立的虚拟化组件。每个单独的构建模块都在Crates.io上发布。
使用rust-vmm创建自定义VMM
下面讨论的组件目前正在开发中。
图1. 自定义rust-vmm组件
图右侧的每个框都是对应于一个软件包(在Rust中名为crate)的GitHub存储库。一个crate的功能可以进一步分成多个模块,比如virtio-devices。不妨看看这些组件及一些潜在的使用场合。
- KVM接口:在KVM上创建VMM需要可以从Rust调用KVM功能的接口。kvm-bindings crate代表面向KVM内核头的Rust外部功能接口(FFI)。因为头只包含结构和定义,我们还有基于KVM ioctls(kvm-ioctls)的包装器,我们用它们来打开dev/kvm、创建虚拟机和创建vCPU等。
- Virtio设备和速率限制:Virtio拥有一套前后端架构。目前在rust-vmm中,前端实现在virtio-devices crate中,后端位于vhost软件包中。Vhost支持用户空间驱动程序和内核空间驱动程序,但用户也可以将virtio-devices插入到自定义后端。virtio-bindings是使用Virtio Linux头生成的Virtio设备的绑定。virtio-devices crate中的所有设备都使用条件编译,作为模块独立导出。一些设备(比如block、net和vsock)在每秒I/O和带宽方面支持速率限制。这可以通过使用rate-limiter crate中提供的功能来实现。
- kernel-loader负责将ELF内核映像的内容加载到访客内存中。
比如说,假设我们想要构建一个自定义VMM,让用户可以创建和配置在KVM上运行的单个虚拟机。作为配置的一部分,用户能够指定内核映像文件、根文件系统、vCPU数量和内存大小。可以使用kvm-ioctls crate来实现虚拟机资源的创建和配置。可以使用kernel-loader将内核映像加载到访客内存中,并且可以使用virtio-devices block模块来指定根文件系统。我们的VMM所需的***一点是编写VMM Glue,这个代码负责将rust-vmm组件与VMM用户接口集成起来,允许用户创建和管理虚拟机。
原文标题:Building the virtualization stack of the future with rust-vmm,作者:Andreea Florescu
【51CTO译稿,合作站点转载请注明原文译者和出处为51CTO.com】