【.com速译】rust-vmm有助于在Rust虚拟机监视器之间共享核心虚拟化组件。一年多以前,我们开始开发Firecracker,这是一种在KVM(基于内核的虚拟机)上运行的虚拟机监视器(VMM)。我们想创建一个轻量级的VMM,它可以快速启动具有小内存占用的虚拟机,以创建高密度的云环境。我们通过分叉ChromeOSVMM(CrosVM)开始开发Firecracker,但没过多久我们就出现了分歧,因为我们针对的是不同的客户使用场景。CrosVM在ChromeOS中提供Linux应用程序隔离,而Firecracker用于大规模运行多租户工作负载。尽管我们现在走的是不同的道路,但我们仍然拥有通用的虚拟化组件,例如基于KVM输入/输出控制(ioctls)的包装器、最小内核加载器和Virtio设备模型的使用。考虑到这一点,我们开始思考共享公共代码的最佳方式。共享代码库提高了两个项目的安全和质量标准。目前,修复安全漏洞需要重复工作:将更改从一个项目移植到另一个项目,通过不同的审查流程来合并更改。在开源Firecracker之后,我们收到了添加功能的请求,包括GPU支持和启动bzImage文件。有些请求与Firecracker的目标不一致,但有合法的用例,但没有合适的地方来实现。rust-vmm项目rust-vmm项目于2018年12月问世,当时亚马逊、谷歌、英特尔和红帽的员工开始讨论共享虚拟化包的最佳方式。在此过程中,更多的贡献者加入了该倡议。我们仍处于这个过程的开始阶段,只有一个组件发布到Crates.io(Rust的包注册表),还有几个其他组件(例如Virtio设备、Linux内核加载器和KVMioctls包装器)正在开发中。两个用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-bindingscrate表示KVM内核头文件的Rust外部函数接口(FFI)。由于标头仅包含结构和定义,我们也有基于KVMioctls(kvm-ioctls)的包装器,用于打开dev/kvm、创建虚拟机、创建vCPU等。Virtio设备和速率限制:Virtio有一个前端-端和后端架构。目前在rust-vmm中,前端在virtio-devicescrate中实现,后端在vhost包中。Vhost支持用户空间驱动程序和内核空间驱动程序,但用户也可以将virtio设备插入自定义后端。virtio-bindings是使用VirtioLinux标头生成的Virtio设备的绑定。virtio-devicescrate中的所有设备都使用条件编译并作为模块独立导出。某些设备(例如block、net和vsock)支持每秒I/O和带宽方面的速率限制。这可以通过使用rate-limitercrate中提供的功能来实现。kernel-loader负责将ELF内核映像的内容加载到客户机内存中。例如,假设我们要构建一个自定义VMM,允许用户创建和配置在KVM上运行的单个虚拟机。作为配置的一部分,用户可以指定内核映像文件、根文件系统、vCPU数量和内存大小。您可以使用kvm-ioctlscrate创建和配置虚拟机资源。可以使用kernel-loader将内核映像加载到客户内存中,并且可以使用virtio-devices块模块指定根文件系统。我们的VMM最不需要的是编写VMMGlue,该代码负责将rust-vmm组件与VMM用户界面集成,允许用户创建和管理虚拟机。原标题:Buildingthevirtualizationstackofthefuturewithrust-vmm,作者:AndreeaFlorescu
