云虚拟机管理程序-用Rust编写的开源虚拟机监视器

2020-09-21 02:52:31

Cloud Hypervisor是在KVM之上运行的开源虚拟机监视器(VMM)。该项目专注于在一组有限的硬件体系结构和平台上专门运行现代的云工作负载。云工作负载是指通常由云提供商内部的客户运行的工作负载。对于我们来说,这意味着大多数I/O由半虚拟化设备(即virtio)处理的现代操作系统,不需要遗留设备和64位CPU。

云虚拟机监控程序支持x86-64和AArch64架构。这两种架构在功能上有一些细微的不同(参见#1125)。

云虚拟机管理程序支持64位Linux,并支持目前正在开发的现代64位Windows客户。

$PUSH$CLOUDH$GIT CLONE https://github.com/cloud-hypervisor/cloud-hypervisor.git$CD云虚拟机管理程序$CAGOR BUILD--Release#我们需要为云虚拟机管理程序二进制文件提供NET_ADMIN功能,以便它在主机上设置分路接口。$sudo setcap_net_admin+ep./target/release/cloud-Hypervisor$popd。

如果您希望构建和测试Cloud Hypervisor而不必安装所有必需的依赖项(Ruust工具链、货运工具等),您也可以使用Cloud Hypervisor的开发脚本:dev_cli.sh。请注意,在第一次调用时,此脚本将拉出相当大的容器图像。

使用dev_cli.sh还可以在本地运行云虚拟机管理程序配置项。这可以非常方便地调试CI错误,而不必完全依赖云虚拟机管理程序CI基础设施。

运行./scripts/dev_cli.sh--help命令查看所有受支持的开发脚本命令及其相关选项。

您可以通过使用现有云映像或引导到您自己的内核和磁盘映像来运行来宾VM。

云管理程序支持启动包含运行云工作负载所需的所有组件的磁盘镜像,也称为。云图。为此,我们依靠Rust Hypervisor Firmware项目提供ELF格式的KVM固件,以供云虚拟机管理程序直接引导。

我们需要最新的Ruust-Hypervisor-Firmware版本,还需要一个可用的云映像。这里我们将使用Ubuntu镜像:

$PUSH D$CLOUDH$wget https://cloud-images.ubuntu.com/focal/current/focal-server-cloudimg-amd64.img$qemu-img转换-p-f qco2-O原始焦点服务器-cloudimg-amd64.img焦点服务器-cloudimg-amd64.raw$wget https://github.com/cloud-hypervisor/rust-hypervisor-firmware/releases/download/0.2.8/hypervisor-fw$popd。

$PUSH$CLOUDH$SUDO SETCAP_NET_ADMIN+EP./cloud-hypervisor/target/release/cloud-hypervisor$./cloud-hypervisor/target/release/cloud-hypervisor\--内核。/HYPMOVER-FW\--磁盘路径=焦点-服务器-CLODMG-AMD64.raw\--CPU引导=4\--内存大小=1024M\--NET";TAP=,mac=,ip=,MASK=";\--rng$popd。

云虚拟机管理程序还支持内核直接引导到vmlinux ELF内核或bzImage。为了支持virtio-fs和virtio-IOMMU,我们有自己的开发分支。您当然可以使用您自己的内核,但是这些说明将继续使用我们开发和测试的版本。

#克隆云虚拟机管理程序Linux分支$PUSH$CLOUDH$GIT CLONE--深度1 https://github.com/cloud-hypervisor/linux.git-bvirtio-fs-virtio-IOMMU-virtio-mem-5.6-rc4linux-cloud-Hypervisor$push d linux-cloud-Hypervisor#使用云虚拟机管理程序内核配置构建内核$cp bzImage.config$make bzImage-j`nproc`$popd。

对于磁盘镜像,我们将使用包含根分区的Ubuntu云镜像:

$PUSH D$CLOUDH$wGET https://cloud-images.ubuntu.com/focal/current/focal-server-cloudimg-amd64.img$qemu-img转换-p-f qco2-O原始焦点服务器-cloudimg-amd64.img焦点服务器-cloudimg-amd64.raw$popd

现在,我们可以直接引导到自定义内核,并使其使用Ubuntu根分区。如果我们想拥有4个vCPU和512MB内存:

$PUSH$CLOUDH$SUDO SETCAP_NET_ADMIN+EP./cloud-hypervisor/target/release/cloud-hypervisor$./cloud-hypervisor/target/release/cloud-hypervisor\--内核./linux-cloud-hypervisor/arch/x86/boot/compressed/vmlinux.bin\--磁盘路径=焦点-服务器-Cloudimg-amd64.raw\--cmdline";控制台=hvc0root=/dev/vda1 RW";\--CPU引导=4\--内存大小=1024M\--NET";TAP=,mac=,ip=,掩码=";\--RNG。

上面的示例使用virtio-console设备作为客户控制台,客户内核可能不会很快启用该设备以获取早期内核调试消息。

当需要更早的调试消息时,首选使用基于传统串行设备的控制台:

$./cloud-hypervisor/target/release/cloud-hypervisor\--内核./linux-cloud-hypervisor/arch/x86/boot/compressed/vmlinux.bin\--控制台关闭\--串行tty\--磁盘路径=焦点-服务器-cloudimg-amd64.raw\--cmdline";控制台=ttyS0root=/dev/vda1 RW";\--CPU引导=4\--内存大小=1024M\--NET";TAP=,mac=,ip=,掩码=";\--rng。

云管理程序支持CPU热插拔、直通设备热插拔(VFIO)、virtio-{net、block、pem、fs、vsock}和内存调整。本文档详细介绍如何将设备添加到正在运行的虚拟机。

我们不是通过特定的git跟踪文件来跟踪Cloud Hypervisor TODO列表,而是通过GitHub问题来跟踪。

为了满足拥有高性能、以安全为中心的虚拟机管理程序的设计目标,决定使用Rust编程语言。该语言对内存和线程安全的高度关注使其成为实现虚拟机管理系统的理想候选者。

云虚拟机管理程序不是从头开始实现VMM组件,而是导入rust-vmmcrates,并与亚马逊(Amazon)的Firecracker和谷歌(Google)的CrossVM等其他虚拟机共享代码和架构。

Cloud Hypervisor接受了Rust-VMM项目的目标,即能够共享和重用尽可能多的虚拟化机箱。因此,云虚拟机管理程序与rust-vmmproject的关系是双重的:

它将尽可能多地使用Rust-VMM代码。任何与项目目标相关的新的铁锈-VMM板条箱都将尽快集成。

由于RUST-VMM项目可能会缺少云虚拟机管理程序所需的一些功能(例如,ACPI、VFIO、vhost-User等),我们将使用云虚拟机管理程序VMM来实现和测试它们,并将其贡献给RUST-VMM项目。

云虚拟机管理程序的很大一部分代码要么基于Firecracker,要么基于CrossVM项目实现,两者都是用Rust编写的侧重于安全性的虚拟机管理程序,就像云虚拟机管理程序一样。

然而,我们想要强调的是,云虚拟机管理程序项目既不是这些项目的分支,也不是它们的重新实现。我们试图实现的目标和使用案例各不相同。我们的目标是支持云工作负载,即那些目前由云服务提供商(CSP)租户运行的现代化、完整的Linux分发映像。

我们的主要目标不是支持客户端或无服务器用例,因此我们的代码库已经与CrossVM和Firecracker有所不同。随着我们添加更多的功能来支持我们的用例,我们相信分歧将会增加,同时通过RUST-VMM项目箱共享尽可能多的基本虚拟化代码。

我们正致力于围绕云虚拟机管理程序项目建立一个全球性、多样化和协作性的社区。欢迎任何有兴趣参与该项目的人参与。

我们相信,为像Cloud Hypervisor这样的开源项目做出贡献所涵盖的不仅仅是发送代码。测试、文档编制、拉请求审查、错误报告、特性请求、项目改进建议等都是平等且受欢迎的贡献方式。有关更多详细信息,请参阅投稿文档。