虚拟化使用入门

可用硬件

虚拟化功能适用于启用了 VMX 的 Intel 设备,以及启动到 EL2 的 ARMv8.0 及更高版本设备。以下硬件将具有最佳可用性:

  • Pixelbook Go m3
  • Intel NUC7 (NUC7i5DNHE)

以下硬件也可用,但更容易出现故障:

  • x64 QEMU/嵌套 VMX

在启用嵌套 VMX 的情况下使用 Fuchsia 模拟器时,某些虚拟化功能将可用。值得注意的是,在 Fuchsia 模拟器中运行时,任何访客都无法使用使用 virtmagma 的 Vulkan 加速。

可用的房客

虽然任意 Linux 客户机都可以在 Fuchsia 上运行,但以下客户机配置可直接使用:

  • Zircon 访客 - 启动到 Zircon 虚拟控制台的极小 Fuchsia 系统。
  • Debian 访客 - Debian bullseye 访客。
  • Termina 客机 - 基于 ChromeOS 中的 Termina VM 的 Linux 客机,包含用于 Vulkan 和窗口管理器集成的额外功能。

使用虚拟化构建 Fuchsia

对于每个来宾操作系统,build 中都必须包含一个来宾管理器和一个核心分片。

首先,在 Fuchsia 检出中创建 //local/BUILD.gn 文件以启用虚拟化。在该文件中,添加一个用于启用虚拟化的汇编替换项:

assembly_developer_overrides("enable_virtualization") {
  platform = {
    virtualization = {
      enabled = true
    }
  }
}

接下来,为所需的访客配置 build。PRODUCT 通常为 coreBOARD 通常为 x64chromebook-x64sherlock 之一。

所有访客

fx set PRODUCT.BOARD --assembly-override=//local:enable_virtualization --with //src/virtualization/bundles:all_guests

Debian 访客

fx set PRODUCT.BOARD --assembly-override=//local:enable_virtualization --with //src/virtualization/bundles:debian

Zircon 访客

fx set PRODUCT.BOARD --assembly-override=//local:enable_virtualization --with //src/virtualization/bundles:zircon

Termina 访客

fx set PRODUCT.BOARD --assembly-override=//local:enable_virtualization --with //src/virtualization/bundles:termina

最后,构建 Fuchsia:

fx build

通过 CLI 启动访客

您可以使用 guest CLI 工具启动客机。该工具将启动该虚拟机,然后通过 stdio 提供对 virtio 控制台的访问权限。

配置主机

如果您直接在专用硬件(例如 Sherlock)上运行 Fuchsia,则无需进行主机配置。不过,大多数 Google 员工会希望在主机工作站上通过 QEMU 运行。对于此用例,您需要使用以下命令检查是否已启用嵌套虚拟化:

cat /sys/module/kvm_intel/parameters/nested

输出为 Y 表示嵌套虚拟化已启用,0N 表示未启用。

如果需要,您可以启用嵌套虚拟化,直到下次重新启动:

modprobe -r kvm_intel
modprobe kvm_intel nested=1

或者,您也可以通过将 options kvm_intel nested=1 添加到 /etc/modprobe.d/kvm.conf 来将更改设为永久性更改。

启动 QEMU

设置好宿主机后,您就可以启动 Fuchsia 模拟器了:

ffx emu start

启动 Debian 客户机:

(fuchsia) $ guest launch debian
Starting Debian
$ uname -a Linux machina-guest 5.10.0-13-amd64 #1 SMP Debian 5.10.106-1 (2022-03-17) x86_64 GNU/Linux

启动 Zircon 访客

(fuchsia) $ guest launch zircon
Starting zircon
physboot: {{{reset}}}
physboot: {{{module:0:physboot:elf:9f2c4d6615bd603d}}}
physboot: {{{mmap:0x100000:0x14a100:load:0:rwx:0x0}}}
physboot: | Physical memory range                    | Size    | Type
physboot: | [0x0000000000008000, 0x0000000000080000) |    480K | free RAM
physboot: | [0x0000000000100000, 0x00000000001cd000) |    820K | phys kernel image
physboot: | [0x00000000001cd000, 0x000000000024a000) |    500K | free RAM
physboot: | [0x000000000024a000, 0x000000000024a100) |    256B | phys kernel image
physboot: | [0x000000000024a100, 0x000000000024b000) |   3840B | free RAM
…

启动 Termina 访客

(fuchsia) $ guest launch termina
Starting Termina
…

在具有界面堆栈的产品中,debian 和 zircon 客户机还会创建一个窗口,用于显示由 virtio-gpu 提供支持的虚拟帧缓冲区。该窗口中的输入内容也会作为虚拟键盘发送给访客。

集成测试

Machina 提供了一组集成测试,用于启动 Zircon 和 Debian 客户机来测试 VMM、Hypervisor 和每个 virtio 设备。如需运行测试,请先将其添加到 build 中:

`fx set PRODUCT.BOARD --with //src/virtualization:tests`
fx build

然后,运行以下任一测试:

# Tests of the low level hypervisor syscalls:
$ fx test hypervisor_tests

# Basic tests that verify OS boot and basic functionality:
$ fx test virtualization-core-tests

# Test suites focused on specific devices:
$ fx test virtualization-block-tests
$ fx test virtualization-net-tests
$ fx test virtualization-sound-tests
$ fx test virtualization-vsock-tests
$ fx test virtualization-gpu-tests
$ fx test virtualization-input-tests