cloud-hypervisor/cloud-hypervisor
GitHub: cloud-hypervisor/cloud-hypervisor
用 Rust 编写的现代云虚拟机监视器,支持热插拔、实时迁移和多架构,专注于安全性和高性能。
Stars: 5444 | Forks: 613
- [1. 什么是 Cloud Hypervisor?](#1-what-is-cloud-hypervisor)
- [目标](#objectives)
- [高层概览](#high-level)
- [架构](#architectures)
- [客户机操作系统](#guest-os)
- [2. 入门指南](#2-getting-started)
- [主机操作系统](#host-os)
- [使用预构建二进制文件](#use-pre-built-binaries)
- [软件包](#packages)
- [从源码构建](#building-from-source)
- [启动 Linux](#booting-linux)
- [固件启动](#firmware-booting)
- [自定义内核和磁盘镜像](#custom-kernel-and-disk-image)
- [构建你的内核](#building-your-kernel)
- [磁盘镜像](#disk-image)
- [启动客户机 VM](#booting-the-guest-vm)
- [3. 状态](#3-status)
- [热插拔](#hot-plug)
- [设备模型](#device-model)
- [路线图](#roadmap)
- [4. 与 _Rust VMM_ 项目的关系](#4-relationship-with-rust-vmm-project)
- [与 Firecracker 和 crosvm 的差异](#differences-with-firecracker-and-crosvm)
- [5. 社区](#5-community)
- [贡献](#contribute)
- [Slack](#slack)
- [邮件列表](#mailing-list)
- [安全问题](#security-issues)
# 1. 什么是 Cloud Hypervisor?
Cloud Hypervisor 是一个开源的虚拟机监视器 (VMM),运行在
[KVM](https://www.kernel.org/doc/Documentation/virtual/kvm/api.txt)
Hypervisor 和 Microsoft Hypervisor (MSHV) 之上。
该项目专注于在特定的、常见的硬件架构上运行现代 _云工作负载_。在这种
情况下,_云工作负载_ 指的是客户在云服务提供商内部运行的工作负载。这意味着
现代操作系统,其大部分 I/O 由半虚拟化设备(例如 _virtio_)处理,不需要
遗留设备,并且使用 64 位 CPU。
Cloud Hypervisor 由 [Rust](https://www.rust-lang.org/) 实现,并
基于 [Rust VMM](https://github.com/rust-vmm) crates。
## 目标
### 高层概览
- 运行在 KVM 或 MSHV 上
- 最小化模拟
- 低延迟
- 低内存占用
- 低复杂性
- 高性能
- 小攻击面
- 仅支持 64 位
- CPU、内存、PCI 热插拔
- 虚拟机到虚拟机迁移
### 架构
Cloud Hypervisor 支持 `x86-64`、`AArch64` 和 `riscv64`
架构,但不同平台的功能有所差异。`x86-64` 和 `AArch64` 之间的功能差异记录
在 [#1125](https://github.com/cloud-hypervisor/cloud-hypervisor/issues/1125) 中。
`riscv64` 架构支持是实验性的,提供的功能有限。有关更多详细信息和说明,
请参阅 [riscv 文档](docs/riscv.md)。
### 客户机操作系统
Cloud Hypervisor 支持 `64-bit Linux` 和 Windows 10/Windows Server 2019。
# 2. 入门指南
以下部分介绍如何构建和运行 Cloud Hypervisor。
## AArch64 的前置条件
- 配备 GICv3 中断控制器的 AArch64 服务器(推荐)或开发板。
## 主机操作系统
为了获得所需的 KVM 功能和足够的性能,推荐的主机
内核版本是 5.13。目前大部分 CI 测试使用的是内核
版本 5.15。
## 使用预构建二进制文件
开始使用 Cloud Hypervisor 的推荐方法是使用预构建的二进制文件。[最新
版本](https://github.com/cloud-hypervisor/cloud-hypervisor/releases/latest) 提供了二进制文件。
对于 `x86-64` 平台,请使用 `cloud-hypervisor-static`;对于 `AArch64`
平台,请使用 `cloud-hypervisor-static-aarch64`。
## 软件包
为方便起见,针对某些流行的 Linux 发行版也提供了软件包。这得益于
[Open Build Service](https://build.opensuse.org)。[OBS
README](https://github.com/cloud-hypervisor/obs-packaging) 说明了如何
在受支持的 Linux 发行版中启用仓库并安装 Cloud Hypervisor
及其附属软件包。请在
[obs-packaging](https://github.com/cloud-hypervisor/obs-packaging) 仓库中报告任何打包问题。
## 从源码构建
如果您不希望使用预构建的二进制文件,请参阅[从源码构建的说明](docs/building.md)。
## 启动 Linux
Cloud Hypervisor 支持直接内核启动(x86-64 内核需要启用 PVH 支持构建的内核或 bzImage)或通过固件启动([Rust Hypervisor
Firmware](https://github.com/cloud-hypervisor/rust-hypervisor-firmware) 或名为 `CLOUDHV` / `CLOUDHV_EFI` 的
edk2 UEFI 固件)。
固件文件的二进制构建版本可在以下最新版本中找到:
[Rust Hypervisor
Firmware](https://github.com/cloud-hypervisor/rust-hypervisor-firmware/releases/latest)
和 [我们的 edk2
仓库](https://github.com/cloud-hypervisor/edk2/releases/latest)
固件的选择取决于您的客户机操作系统选择;可能需要
进行一些实验。
### 固件启动
Cloud Hypervisor 支持启动包含运行云工作负载所需所有组件的磁盘镜像,
即云镜像。
以下示例命令将下载一个 Ubuntu Cloud 镜像,
将其转换为 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` 镜像由此 [脚本](scripts/create-cloud-init.sh) 生成。
这会为镜像设置默认用户名/密码 `cloud/cloud123`。
只需在首次启动时添加此磁盘镜像。脚本还会使用
`test_data/cloud-init/ubuntu/local/network-config` 中的详细信息并配合
`--net "mac=12:34:56:78:90:ab,tap="` 选项来分配默认 IP 地址。然后匹配的 mac 地址
接口将根据 `network-config` 详细信息启用。
```
$ sudo setcap cap_net_admin+ep ./cloud-hypervisor
$ ./create-cloud-init.sh
$ ./cloud-hypervisor \
--firmware ./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
```
## 启动:`--firmware` 与 `--kernel`
Cloud Hypervisor 支持以下场景来引导 VM,即
加载有效负载/启动项:
- 提供固件
- 提供内核 \[+ cmdline\]\ [+ initrd\]
请注意,我们的 Cloud Hypervisor 固件 (`hypervisor-fw`) 有一个 Xen PVH
引导入口,因此它也可以通过 `--kernel` 参数引导,正如
某些示例中所示。
### 自定义内核和磁盘镜像
#### 构建你的内核
Cloud Hypervisor 也支持直接内核启动。对于 x86-64,支持 `vmlinux` ELF 内核(启用 PVH 支持编译)或常规 bzImage。为了支持开发,有一个自定义分支;但是,只要启用了所需的选项,任何最新的内核都足够。
构建内核:
```
# 克隆 Cloud Hypervisor Linux 分支
$ git clone --depth 1 https://github.com/cloud-hypervisor/linux.git -b ch-6.12.8 linux-cloud-hypervisor
$ pushd linux-cloud-hypervisor
$ make ch_defconfig
# 对 x86-64 kernel 进行原生构建
$ KCFLAGS="-Wa,-mx86-used-note=no" make bzImage -j `nproc`
# 对 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
```
#### 启动客户机 VM
这些示例命令使用自定义内核启动磁盘镜像,同时
提供所需的内核命令行。
- 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。
更多详情可在[发行文档](docs/releases.md)中找到。
截至 2023-01-03,支持以下云镜像:
- [Ubuntu Focal](https://cloud-images.ubuntu.com/focal/current/) (focal-server-cloudimg-{amd64,arm64}.img)
- [Ubuntu Jammy](https://cloud-images.ubuntu.com/jammy/current/) (jammy-server-cloudimg-{amd64,arm64}.img)
- [Ubuntu Noble](https://cloud-images.ubuntu.com/noble/current/) (noble-server-cloudimg-{amd64,arm64}.img)
- [Fedora 36](https://archives.fedoraproject.org/pub/archive/fedora/linux/releases/36/Cloud/) ([Fedora-Cloud-Base-36-1.5.x86_64.raw.xz](https://archives.fedoraproject.org/pub/archive/fedora/linux/releases/36/Cloud/x86_64/images/) / [Fedora-Cloud-Base-36-1.5.aarch64.raw.xz](https://archives.fedoraproject.org/pub/archive/fedora/linux/releases/36/Cloud/aarch64/images/))
使用来自大多数发行版的 rootfs 进行直接内核启动到用户空间应该可以工作,
尽管您可能需要在参考内核配置中启用特殊的文件系统类型
(例如 XFS 或 btrfs)。
## 热插拔
Cloud Hypervisor 支持 CPU、直通设备 (VFIO)、
`virtio-{net,block,pmem,fs,vsock}` 和内存调整大小的热插拔。此
[文档](docs/hotplug.md) 详细说明了如何向正在运行的 VM 添加设备。
## 设备模型
设备模型的详细信息可在
此[文档](docs/device_model.md)中找到。
## 路线图
项目路线图通过 [GitHub
project](https://github.com/orgs/cloud-hypervisor/projects/6) 进行跟踪。
# 4. 与 _Rust VMM_ 项目的关系
为了满足拥有高性能、注重安全的 Hypervisor 这一设计目标,
决定使用 [Rust](https://www.rust-lang.org/) 编程语言。该语言对内存和
线程安全的强烈关注使其成为实现
VMM 的理想选择。
Cloud Hypervisor 没有从头开始实现 VMM 组件,而是
导入了 [Rust VMM](https://github.com/rust-vmm) crates,并与
其他 VMM(例如 Amazon 的 [Firecracker](https://firecracker-microvm.github.io/) 和 Google 的
[crosvm](https://chromium.googlesource.com/chromiumos/platform/crosvm/))共享代码和架构。
Cloud Hypervisor 秉承 _Rust VMM_ 项目的目标,即尽可能
共享和重用虚拟化 crates。
## 与 Firecracker 和 crosvm 的差异
Cloud Hypervisor 代码的很大一部分基于 Firecracker 或
crosvm 项目的实现。这两者都是用 Rust 编写的 VMM,
像 Cloud Hypervisor 一样专注于安全性和保障。
Cloud Hypervisor 项目的目标与上述
项目不同,因为它旨在成为 _云工作负载_ 的通用 VMM,
而不仅限于容器/无服务器或客户端工作负载。
Cloud Hypervisor 社区感谢 Firecracker
和 crosvm 项目社区的出色工作。
# 5. 社区
Cloud Hypervisor 项目遵循 [Community](https://github.com/cloud-hypervisor/community)
仓库中描述的治理和社区准则。
## 贡献
该项目坚信要在 Cloud Hypervisor 项目周围建立一个全球化、多元化和协作的
社区。任何对项目感兴趣的人
[贡献](CONTRIBUTING.md) 都欢迎参与。
为像 Cloud Hypervisor 这样的开源项目做贡献涵盖的
不仅仅是发送代码。测试、文档、Pull Request
审查、错误报告、功能请求、项目改进建议等,
都是同等且受欢迎的贡献方式。有关更多详细信息,请参阅
[CONTRIBUTING](CONTRIBUTING.md) 文档。
## Slack
获取 [Slack 频道邀请](https://join.slack.com/t/cloud-hypervisor/shared_invite/enQtNjY3MTE3MDkwNDQ4LWQ1MTA1ZDVmODkwMWQ1MTRhYzk4ZGNlN2UwNTI3ZmFlODU0OTcwOWZjMTkwZDExYWE3YjFmNzgzY2FmNDAyMjI),
[加入我们的 Slack](https://cloud-hypervisor.slack.com/),并[参与我们的社区活动](https://cloud-hypervisor.slack.com/archives/C04R5DUQVBN)。
## 邮件列表
请使用 [GitHub issue
tracker](https://github.com/cloud-hypervisor/cloud-hypervisor/issues) 报告错误,但对于
更广泛的社区讨论,您可以使用我们的[邮件
列表](https://lists.cloudhypervisor.org/g/dev/)。
## 安全问题
请通过 MAINTAINERS.md 文件中列出的维护者联系方式报告安全问题。
标签:Hakrawler, Hypervisor, KVM, LangChain, Linux虚拟化, Rust, Rust-VMM, Vhost-user, Virtio, VMM, Windows虚拟化, 云计算, 低延迟, 内存安全, 可视化界面, 固件启动, 安全计算, 容器替代, 嵌入式虚拟化, 服务器, 沙箱, 热插拔, 系统底层, 系统虚拟化, 网络流量审计, 虚拟化, 虚拟机监控器, 虚拟设备, 规则引擎, 资源调度, 轻量级, 通知系统