本文共 1925 字,大约阅读时间需要 6 分钟。
vscode构建rust
一年多以前,我们开始开发 ,这是一种在KVM(基于内核的虚拟机)上运行的虚拟机监视器(VMM)。 我们希望创建一个轻量级的VMM,以在不到一秒钟的时间内启动虚拟机(VM),并减少内存占用,以实现高密度的云环境。
我们最初通过创建Chrome OS VMM( )来开发Firecracker,但是不久之后我们就出现了分歧,因为我们针对不同的客户用例。 CrosVM在Chrome操作系统中提供Linux应用程序隔离,而Firecracker用于大规模运行多租户工作负载。 即使我们走了不同的道路,我们仍然拥有通用的虚拟化组件,例如KVM输入/输出控件(ioctls)上的包装器,最小的内核加载器以及设备模型的使用。
考虑到这一点,我们开始考虑共享通用代码的最佳方法。 共享代码库提高了两个项目的安全性和质量标准。 当前,要修复安全漏洞,需要进行重复的工作,以将更改从一个项目移植到另一个项目,并经历不同的审核过程以合并更改。 在开源Firecracker之后,我们收到了添加功能(包括GPU支持和启动文件)的请求。 有些请求与Firecracker的目标不符,但在其他方面却是有效的用例,只是找不到合适的实现位置。
项目于2018年12月生效,当时亚马逊,谷歌,英特尔和Red Hat员工开始讨论共享虚拟化软件包的最佳方法。 一路走来,有更多的贡献者加入了这项倡议。 我们仍处于这一旅程的开始,只有一个组件发布到 (Rust的程序包注册表),而其他几个组件(例如Virtio设备,Linux内核加载器和KVM ioctls包装器)也正在开发中。 由于有两个用Rust编写的VMM受到积极的开发,并且对构建其他专用VMM的兴趣日益浓厚,因此rust-vmm诞生了,是共享核心虚拟化组件的主机。
rust-vmm的目标是使社区能够创建自定义VMM,这些VMM仅导入其用例所需的构件。 我们决定将rust-vmm组织为一个多存储库项目,其中每个存储库都对应一个独立的虚拟化组件。 每个单独的构建块均在Crates.io上发布。
下面讨论的组件目前正在开发中。
图右侧的每个框都是一个库的GitHub存储库,对应于一个包,在Rust中称为crate 。 一个板条箱的功能可以进一步分为模块,例如virtio-devices 。 让我们看一下这些组件及其一些潜在的用例。
KVM界面:在KVM之上创建我们的VMM需要一个可以从Rust调用KVM功能的界面。 kvm-bindings板条箱表示到KVM内核标头的Rust外部功能接口(FFI)。 由于标头仅包含结构和定义,因此我们还具有用于打开dev / kvm,创建VM,创建vCPU等的KVM ioctl( kvm-ioctls )的包装。
Virtio设备和速率限制: Virtio具有前端-后端架构。 当前在rust-vmm中,前端在virtio-devices板条箱中实现,后端在vhost包中。 Vhost支持用户界面和内核界面驱动程序,但用户也可以将virtio设备插入其自定义后端。 virtio绑定是使用Virtio Linux标头生成的Virtio设备的绑定。 使用条件编译将virtio-devices箱子中的所有设备独立导出为模块。 某些设备(例如block , net和vsock)支持每秒I / O和带宽方面的速率限制。 这可以通过使用速率限制器板条箱中提供的功能来实现。
例如,假设我们要构建一个自定义的VMM,允许用户创建和配置在KVM之上运行的单个VM。 作为配置的一部分,用户将能够指定内核映像文件,根文件系统,vCPU的数量和内存大小。 可以使用kvm-ioctl包来创建和配置VM的资源。 可以使用kernel-loader将内核映像加载到来宾存储器中,并且可以使用virtio-devices块模块实现指定根文件系统。 VMM的最后一件事是编写VMM Glue ,该代码负责将rust-vmm组件与VMM用户界面集成在一起,该界面允许用户创建和管理VM。
这是一个令人兴奋的旅程的开始,我们期待着更多的人对VMM,Rust以及可以找到两者的地方感兴趣: 。
目前,我们每两周一次以讨论rust-vmm组织的未来。 会议对任何愿意参加的人开放。 如果您有任何疑问,请在打开一个问题,或将电子邮件发送到rust-vmm (您也可以 )。 我们也有一个 ,如果您有兴趣的话,鼓励您加入。
翻译自:
vscode构建rust
转载地址:http://atbzd.baihongyu.com/