13 次重大发布

0.14.1 2021 年 3 月 31 日
0.13.0 2021 年 2 月 12 日
0.12.0 2020 年 12 月 10 日
0.11.0 2020 年 10 月 29 日
0.1.0 2019 年 7 月 25 日

#133 in 硬件支持

3,557 个星标 & 76 个关注者

LICENSE-APACHE & LICENSE-BSD-3-Clause

3.5MB
81K SLoC

1. 什么是 Cloud Hypervisor?

Cloud Hypervisor 是一个在 KVM 虚拟机管理程序和微软虚拟机管理程序 (MSHV) 上运行的开源虚拟机监控程序 (VMM)。

该项目专注于在特定的、常见的硬件架构上运行现代的云工作负载。在这种情况下,云工作负载指的是客户在云服务提供商内部运行的工作负载。这意味着现代操作系统,其中大多数I/O由虚拟化设备(例如virtio)处理,不需要传统设备,并且支持64位CPU。

Cloud Hypervisor是用Rust实现的,并基于Rust VMM库。

目标

概要

  • 在KVM或MSHV上运行
  • 最小化模拟
  • 低延迟
  • 低内存占用
  • 低复杂性
  • 高性能
  • 小攻击面
  • 仅支持64位
  • CPU、内存、PCI热插拔
  • 机器到机器迁移

架构

Cloud Hypervisor支持x86-64AArch64架构。这两个架构在功能上存在一些细微差异(参见#1125)。

客户操作系统

Cloud Hypervisor支持64-bit Linux和Windows 10/Windows Server 2019。

2. 入门

以下章节将描述如何构建和运行Cloud Hypervisor。

AArch64的先决条件

  • AArch64服务器(推荐)或配备GICv3中断控制器的开发板。

主机操作系统

为了获得所需的KVM功能和足够的性能,推荐的宿主内核版本是5.13。CI的多数测试使用内核版本5.15。

使用预构建的二进制文件

开始使用Cloud Hypervisor的推荐方法是使用预构建的二进制文件。可在最新版本中找到二进制文件。使用cloud-hypervisor-static用于x86-64平台或使用cloud-hypervisor-static-aarch64用于AArch64平台。

软件包

为了方便起见,还提供了针对一些流行的Linux发行版的软件包。这得益于Open Build Service。在OBS README中解释了如何在受支持的Linux发行版中启用存储库并安装Cloud Hypervisor及其相关软件包。请在obs-packaging存储库中报告任何软件包问题。

从源代码构建

如果您不希望使用预构建的二进制文件,请参阅从源代码构建的说明

启动 Linux

Cloud Hypervisor支持直接内核启动(x86-64内核需要具有PVH支持构建的内核或bzImage)或通过固件启动(无论是Rust Hypervisor Firmware还是名为CLOUDHV / CLOUDHV_EFI的edk2 UEFI固件)。

固件文件的二进制构建可用于Rust Hypervisor Firmware的最新版本和我们的edk2存储库

固件的选择取决于您的客户操作系统选择;可能需要进行一些实验。

固件启动

Cloud Hypervisor支持启动包含运行云工作负载所需所有组件的磁盘镜像,即云镜像。

以下示例命令将下载Ubuntu云镜像,将其转换为Cloud Hypervisor可以使用的格式,以及用于启动镜像的固件。

$ wget https://cloud-images.ubuntu.com/focal/current/focal-server-cloudimg-amd64.img
$ qemu-img convert -p -f qcow2 -O raw focal-server-cloudimg-amd64.img focal-server-cloudimg-amd64.raw
$ wget https://github.com/cloud-hypervisor/rust-hypervisor-firmware/releases/download/0.4.2/hypervisor-fw

Ubuntu云镜像默认不包含密码,因此需要在第一次启动时使用cloud-init磁盘镜像来自定义镜像。该脚本可以生成基本的cloud-init镜像。该镜像默认使用用户名密码为cloud//cloud123。仅在第一次启动时需要添加此磁盘镜像。脚本还将默认IP地址通过test_data//cloud-init/ubuntu/local/network-config细节与--net "mac=12:34:56:78:90:ab,tap="选项一起分配。然后,根据network-config细节启用匹配的mac地址接口。

$ sudo setcap cap_net_admin+ep ./cloud-hypervisor
$ ./create-cloud-init.sh
$ ./cloud-hypervisor \
	--kernel ./hypervisor-fw \
	--disk path=focal-server-cloudimg-amd64.raw path=/tmp/ubuntu-cloudinit.img \
	--cpus boot=4 \
	--memory size=1024M \
	--net "tap=,mac=,ip=,mask="

如果需要访问固件消息或与引导加载程序(例如GRUB)交互,则有必要切换到串行控制台而不是virtio-console

$ ./cloud-hypervisor \
	--kernel ./hypervisor-fw \
	--disk path=focal-server-cloudimg-amd64.raw path=/tmp/ubuntu-cloudinit.img \
	--cpus boot=4 \
	--memory size=1024M \
	--net "tap=,mac=,ip=,mask=" \
	--serial tty \
	--console off

自定义内核和磁盘镜像

构建您的内核

Cloud Hypervisor还支持直接内核引导。对于x86-64,支持带PVH支持的vmlinux ELF内核或常规bzImage。为了支持开发,有一个自定义分支;然而,只要启用了所需的选项,任何最近的内核都足够了。

构建内核

# Clone the Cloud Hypervisor Linux branch
$ git clone --depth 1 https://github.com/cloud-hypervisor/linux.git -b ch-6.2 linux-cloud-hypervisor
$ pushd linux-cloud-hypervisor
# Use the x86-64 cloud-hypervisor kernel config to build your kernel for x86-64
$ wget https://raw.githubusercontent.com/cloud-hypervisor/cloud-hypervisor/main/resources/linux-config-x86_64
# Use the AArch64 cloud-hypervisor kernel config to build your kernel for AArch64
$ wget https://raw.githubusercontent.com/cloud-hypervisor/cloud-hypervisor/main/resources/linux-config-aarch64
$ cp linux-config-x86_64 .config  # x86-64
$ cp linux-config-aarch64 .config # AArch64
# Do native build of the x86-64 kernel
$ KCFLAGS="-Wa,-mx86-used-note=no" make bzImage -j `nproc`
# Do native build of the AArch64 kernel
$ make -j `nproc`
$ popd

对于x86-64,vmlinux内核镜像将位于linux-cloud-hypervisor/arch/x86/boot/compressed/vmlinux.bin。对于AArch64,Image内核镜像将位于linux-cloud-hypervisor/arch/arm64/boot/Image

磁盘镜像

对于磁盘镜像,可以使用之前相同的Ubuntu镜像。该镜像包含一个ext4根文件系统。

$ wget https://cloud-images.ubuntu.com/focal/current/focal-server-cloudimg-amd64.img # x86-64
$ wget https://cloud-images.ubuntu.com/focal/current/focal-server-cloudimg-arm64.img # AArch64
$ qemu-img convert -p -f qcow2 -O raw focal-server-cloudimg-amd64.img focal-server-cloudimg-amd64.raw # x86-64
$ qemu-img convert -p -f qcow2 -O raw focal-server-cloudimg-arm64.img focal-server-cloudimg-arm64.raw # AArch64

启动客户虚拟机

以下示例命令在同时提供所需内核命令行的情况下,使用自定义内核引导磁盘镜像。

  • x86-64
$ sudo setcap cap_net_admin+ep ./cloud-hypervisor
$ ./create-cloud-init.sh
$ ./cloud-hypervisor \
	--kernel ./linux-cloud-hypervisor/arch/x86/boot/compressed/vmlinux.bin \
	--disk path=focal-server-cloudimg-amd64.raw path=/tmp/ubuntu-cloudinit.img \
	--cmdline "console=hvc0 root=/dev/vda1 rw" \
	--cpus boot=4 \
	--memory size=1024M \
	--net "tap=,mac=,ip=,mask="
  • AArch64
$ sudo setcap cap_net_admin+ep ./cloud-hypervisor
$ ./create-cloud-init.sh
$ ./cloud-hypervisor \
	--kernel ./linux-cloud-hypervisor/arch/arm64/boot/Image \
	--disk path=focal-server-cloudimg-arm64.raw path=/tmp/ubuntu-cloudinit.img \
	--cmdline "console=hvc0 root=/dev/vda1 rw" \
	--cpus boot=4 \
	--memory size=1024M \
	--net "tap=,mac=,ip=,mask="

如果需要较早的内核消息,应使用串行控制台而不是virtio-console

  • x86-64
$ ./cloud-hypervisor \
	--kernel ./linux-cloud-hypervisor/arch/x86/boot/compressed/vmlinux.bin \
	--console off \
	--serial tty \
	--disk path=focal-server-cloudimg-amd64.raw \
	--cmdline "console=ttyS0 root=/dev/vda1 rw" \
	--cpus boot=4 \
	--memory size=1024M \
	--net "tap=,mac=,ip=,mask="
  • AArch64
$ ./cloud-hypervisor \
	--kernel ./linux-cloud-hypervisor/arch/arm64/boot/Image \
	--console off \
	--serial tty \
	--disk path=focal-server-cloudimg-arm64.raw \
	--cmdline "console=ttyAMA0 root=/dev/vda1 rw" \
	--cpus boot=4 \
	--memory size=1024M \
	--net "tap=,mac=,ip=,mask="

3. 状态

Cloud Hypervisor正在积极开发中。目前提供以下稳定性保证:

  • API(包括命令行选项)在没有至少2个主要版本通知的情况下,不会以破坏性的方式删除或更改。尽可能提供有关弃用功能使用的警告,并在发行说明中记录弃用。

  • 当有重大错误修复或需要修复的安全问题时,将在各个发行版之间发布点发行版。这些点发行版将仅包括错误修复。

以下项目目前在更新中没有保证:

  • 不支持跨不同版本的快照/恢复
  • 不支持跨不同版本的实时迁移
  • 以下功能被视为实验性的,在发行版之间可能发生重大变化:TDX、vfio-user、vDPA。

更多详细信息请参阅发行说明文档

截至2023-01-03,以下云镜像得到支持:

直接从内核引导到用户空间应该与大多数发行版的rootfs兼容,尽管您可能需要在参考内核配置中启用奇特的文件系统类型(例如XFS或btrfs)。

热插拔

Cloud Hypervisor支持CPU热插拔、设备直通(VFIO)、virtio-{net,block,pmem,fs,vsock}以及内存调整大小。此文档详细说明了如何将设备添加到正在运行的虚拟机中。

设备模型

设备模型的详细信息可以在本文档中找到。

路线图

项目路线图通过GitHub项目进行跟踪。

4. 与 Rust VMM 项目的关联

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

Cloud Hypervisor不是从头开始实现虚拟机管理程序组件,而是导入Rust VMM存储库,并与其他虚拟机管理程序如Amazon的Firecracker和Google的crosvm共享代码和架构。

Cloud Hypervisor接受Rust VMM项目的目标,即尽可能共享和重用尽可能多的虚拟化存储库。

与 Firecracker 和 crosvm 的区别

Cloud Hypervisor的大部分代码基于Firecracker或crosvm项目的实现。这两个项目都是像Cloud Hypervisor一样,以安全性和安全性为重点,用Rust编写的虚拟机管理程序。

Cloud Hypervisor项目的目标与上述项目不同,它旨在成为一个通用的虚拟机管理程序,用于云工作负载,而不是仅限于容器/无服务器或客户端工作负载。

Cloud Hypervisor项目感谢Firecracker和crosvm项目的社区做出了卓越的工作。

5. 社区

Cloud Hypervisor项目遵循社区仓库中描述的治理和社区指南。

贡献

项目强烈相信围绕Cloud Hypervisor项目建立一个全球、多样化和协作的社区。任何有兴趣贡献项目的人都可以参与。

向开源项目如Cloud Hypervisor贡献不仅仅是在发送代码。测试、文档、拉取请求审查、错误报告、功能请求、项目改进建议等,都是平等和受欢迎的贡献方式。有关详细信息,请参阅CONTRIBUTING文档。

Slack

获取我们的Slack频道邀请加入我们,并参与我们的社区活动

邮件列表

请使用GitHub问题跟踪器报告错误,但更广泛的社区讨论您可以使用我们的邮件列表

安全问题

请与MAINTAINERS.md文件中列出的维护者联系有关安全问题。

依赖关系

~3–15MB
~194K SLoC