可用的硬件
虚拟化功能适用于已启用 VMX 的 Intel 设备,以及启动进入 EL2 的 ARMv8.0 及更高版本的设备。AMD CPU 上不支持虚拟化 (b/467349022)。 以下硬件的供应情况最好:
- Pixelbook Go m3
- Intel NUC7 (NUC7i5DNHE)
以下硬件也可使用,但更容易出现故障:
- x64 QEMU/嵌套 VMX
如果使用启用了嵌套 VMX 的 Fuchsia 模拟器,某些虚拟化功能将可正常运行。值得注意的是,在 Fuchsia 模拟器中运行时,任何 guest 均无法使用 virtmagma 进行 Vulkan 加速。
可用的邀请对象
虽然任意 Linux 访客都可以在 Fuchsia 上运行,但以下访客配置可开箱即用:
- Zircon Guest - 一种可启动到 Zircon virtcon 的极简 Fuchsia 系统。
- Debian Guest - Debian bullseye guest。
- Termina Guest - 一种基于 ChromeOS 的 Termina 虚拟机的 Linux Guest,包含用于 Vulkan 和窗口管理器集成的其他功能。
使用虚拟化构建 Fuchsia
对于每个 guest 操作系统,都有一个 guest 管理器和一个必须包含在 build 中的核心分片。
首先,在 Fuchsia 代码库中创建一个 //local/BUILD.gn 文件,以启用虚拟化。在该文件中,添加一个用于启用虚拟化的程序集替换项:
assembly_developer_overrides("enable_virtualization") {
platform = {
virtualization = {
enabled = true
}
}
}
接下来,为所需的 Guest 配置 build。PRODUCT 通常为 core,而 BOARD 通常为 x64、chromebook-x64、sherlock 中的一个。
所有邀请对象
fx set PRODUCT.BOARD --assembly-override=//local:enable_virtualization --with //src/virtualization/bundles:all_guests
Debian Guest
fx set PRODUCT.BOARD --assembly-override=//local:enable_virtualization --with //src/virtualization/bundles:debian
Zircon Guest
fx set PRODUCT.BOARD --assembly-override=//local:enable_virtualization --with //src/virtualization/bundles:zircon
Termina Guest
fx set PRODUCT.BOARD --assembly-override=//local:enable_virtualization --with //src/virtualization/bundles:termina
最后,构建 Fuchsia:
fx build
通过 CLI 启动 Guest
您可以使用 guest CLI 工具启动 guest。该工具将启动 guest,然后通过 stdio 提供对 virtio-console 的访问权限。
配置主机
如果您直接在专用硬件(例如 Sherlock)上运行 Fuchsia,则无需进行主机配置。不过,大多数 Google 员工都希望在主机工作站上通过 QEMU 运行。对于此使用情形,您需要使用以下命令检查是否已启用嵌套虚拟化:
cat /sys/module/kvm_intel/parameters/nested输出 Y 表示已启用嵌套虚拟化,0 或 N 表示未启用。
如果需要,您可以启用嵌套虚拟化,直到下次重新启动:
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 Guest:
(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 Guest
(fuchsia) $ guest launch termina
Starting Termina
…
在具有界面堆栈的产品上,debian 和 zircon guest 也会创建一个窗口,用于显示由 virtio-gpu 提供支持的虚拟帧缓冲区。来自该窗口的输入内容也会以虚拟键盘的形式发送给嘉宾。
集成测试
Machina 具有一组集成测试,可启动 Zircon 和 Debian guest 来测试 VMM、管理程序和每个 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