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虚拟化, 云计算, 低延迟, 内存安全, 可视化界面, 固件启动, 安全计算, 容器替代, 嵌入式虚拟化, 服务器, 沙箱, 热插拔, 系统底层, 系统虚拟化, 网络流量审计, 虚拟化, 虚拟机监控器, 虚拟设备, 规则引擎, 资源调度, 轻量级, 通知系统