虚拟化使用入门

支持的硬件

启用了 VMX 的 Intel 设备以及启动到 EL2 的 ARMv8.0 及更高版本的设备支持虚拟化。由于以下硬件包含在每日自动和手动测试中,因此可以得到最佳支持:

  • Pixelbook Go m3
  • Intel NUC7 (NUC7i5DNHE)

以下硬件也经常使用,但自动测试覆盖率不同。

  • x64 QEMU/嵌套 VMX

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

受支持的邀请对象

虽然任意 Linux 客户机可以在 Fuchsia 上运行,但以下客户机配置在 Fuchsia 上的 CI 中进行测试:

  • Zircon Guest - 一种极简的紫红色系统,可启动到 Zircon virtcon。
  • Debian 客户机 - Debian bullseye 客户机。
  • Termina Guest - 一种 Linux 客机,基于 ChromeOS 中的 Termina VM,包含与 Vulkan 和窗口管理器集成的额外功能。

使用虚拟化构建 Fuchsia

对于每个客机操作系统,构建中都必须包含一个客机管理器和一个核心分片。

在下例中,PRODUCT 通常是 core 之一,BOARD 通常是 x64chromebook-x64sherlock 中的一个。

$ fx set PRODUCT.BOARD \
    # For Debian Guest
    --with //src/virtualization/bundles:debian \
    --args='core_realm_shards += [ "//src/virtualization/bundles:debian_core_shards" ]' \
    # For Zircon Guest
    --with //src/virtualization/bundles:zircon \
    --args='core_realm_shards += [ "//src/virtualization/bundles:zircon_core_shards" ]' \
    # For Termina Guest
    --with //src/virtualization/bundles:termina \
    --args='core_realm_shards += [ "//src/virtualization/bundles:termina_core_shards" ]'

或者,您也可以使用以下命令启用所有访客:

$ fx set PRODUCT.BOARD \
    --with //src/virtualization/bundles:all_guests \
    --args='core_realm_shards += [ "//src/virtualization/bundles:all_core_shards" ]'

从 CLI 启动访客

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

启动 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 Guest

(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 驱动的虚拟帧缓冲区。来自该窗口的输入内容还将作为虚拟键盘发送给访客。

在 QEMU 上运行

在 x64 上的 QEMU 上运行客户机需要 KVM。您可能还需要在主机上启用嵌套 KVM。如需检查是否已启用嵌套虚拟化,请运行以下命令:

配置主机

cat /sys/module/kvm_intel/parameters/nested

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

如需启用嵌套虚拟化,直到下次重新启动,请运行以下命令:

modprobe -r kvm_intel
modprobe kvm_intel nested=1

如需使更改永久生效,请将以下行添加到 /etc/modprobe.d/kvm.conf 中: options kvm_intel nested=1

启动 QEMU

完成主机设置后,您就可以启动 Fuchsia 模拟器:

$ ffx emu start

集成测试

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