💮

Zirconのハイパーバイザ概要(未完成)

2021/03/31に公開

Fuchsia の Zircon カーネルが提供するハイパーバイザ機能について、概要を紹介します。

要約

  • Zircon hypervisor は、I/O 仮想化のために virtio を提供
  • 対応するゲスト OS は、Linux と Zircon。I/O は準仮想化ドライバを使用
  • KVM と同じく、ホスト OS(Zircon)に hypervisor 機能を組み込んでいる

参考文献

概要

Zircon が提供するハイパーバイザ機能は Machina と呼ばれます。

The vmm app enables booting a guest operating system using the Zircon hypervisor. The hypervisor and VMM are collectively referred to as “Machina”.

ディレクトリ構成

主要なものだけ紹介。

src/virtualization/
bin/
  guest/ -------------- guest コマンド
  guest_manager/ ------ guest_manager コマンド
  guest_runner/ ------- guest_runner コマンド
  vmm/ ---------------- vmm コマンド
lib/
  guest_interaction/ --
  guest_config/ -------
  grpc/ ---------------
  vsh/ ----------------
packages/
  biscotti_guest/ ----- Biscotti ゲストOS用パッケージ
  debian_guest/ ------- Debian ゲストOS用パッケージ
  linux_guest/ -------- Linux ゲスOSト用パッケージ
  termina_guest/ ------ Termina ゲストOS用パッケージ
  zircon_guest/ ------- Zircon ゲストOS用パッケージ
third_party/
  fdt/ ---------------- libfdt ライブラリ
  • guest コマンド
    guest_runner コマンド → vmm コマンド
    ゲスト OS を起動するコマンド
  • guest_manager コマンド
  • guest_runner コマンド
  • vmm コマンド
    VM・VCPU の作成、メモリ割り当て、各種デバイス(UART,RTC,I/O ポート、PCI、GPU、コンソール、キーボード、etc.)の初期化、ゲスト OS の起動準備(ブートローダ代替処理)。
    bin/vmm/main.cc#79
  • fdt ライブラリ
    Flat Device Tree 操作のライブラリ。vmm コマンドで使う

hypervisor システムコール

vmm コマンドは、hypervisor システムコールを使って VM を操作します。

ビルド方法

hypervisor 機能を Zircon カーネルに含めるには、fx set に、--with-base //src/virtualization を追加します。
Fuchsia/Zircon ビルド時(fx build 時)にゲスト OS も同時にビルドします。

fx set core.${ARCH} --with-base //src/virtualization
# ゲスト Linux 用設定
./src/virtualization/packages/linux_guest/mklinux.sh \
  -l /tmp/linux/source \
  -o prebuilt/virtualization/packages/linux_guest/images/${ARCH}/Image \
  -b machina-4.18 \
  ${ARCH}
./src/virtualization/packages/linux_guest/mksysroot.sh \
  -o  prebuilt/virtualization/packages/linux_guest/images/${ARCH}/disk.img \
  -d /tmp/toybox \
  -s /tmp/dash \
  -u \
  ${ARCH}
fx build

fx build でビルドされるゲスト OS

手動でビルドできるゲスト OS

ゲスト OS の起動

Fuchsia 起動後、シェルから下記コマンドを実行。

guest launch debian_guest # ゲスト OS が Debian の場合

調査前の疑問への回答

zircon hypervisor は、Linux がゲスト OS のときに I/O の仮想化を行うか。また、その際に qemu を利用するか

I/O の仮想化を行います。qemu は利用しません。
ゲスト OS の Linux カーネルをビルドする際に、virtio を利用します。準仮想化。
zircon hypervisor 機能は virtio を提供します。

fx set ... --with-base //src/virtualization で何が変わるか

fx set core.${ARCH} --with-base //src/virtualization
tools/devshell/set
##   --with-base GNLABEL   Labels of additional packages to include in the
##                         'base' set of packages. These packages are included in
##                         the system image and can be updated only with an OTA.
##                         Multiple labels can be provided delimited by commas
##                         or the --with-base argument can be provided multiple
##                         times.

base パッケージに、src/virtualization(vmm、guest コマンドなど)が含まれます。
--with-base //src/virtualization を含まない通常のビルド方法では、hypervisor 機能 (Machina)は Zircon カーネルに含まれないです。
狭義の hypervisor であるシステムコール(zx_guest_createなど)は --with-base //src/virtualization にかかわらず、Zircon カーネルに含まれます。

Intel VT(VT-x)、ARM 仮想化支援は必須か

必須だと思われる。

KVM との違い

Linux のハイパーバイザ KVM では、ioctl システムコール + /dev/kvm を通じて VM 、VCPU を作成します。

Zircon ハイパーバイザでは、システムコール(zx_guest_createzx_vcpu_create など)を通じて VM 、VCPU を作成します。

その他

fx build のワーニング

fx set core.${ARCH} --with-base //src/virtualization
fx build

fx buildの前に、ゲスト OS 用 Linux イメージを作成していない場合、下記警告が出ます。

❯ fx build

ninja: Entering directory `/home/junkawa/sdk/fuchsia/out/default'
[1075/46128] ACTION //src/virtualization/packages/debian_guest:initrd(//build/toolchain/fuchsia:x64)
WARNING: ../../prebuilt/virtualization/packages/debian_guest/images/x64/initrd.img not found, using a dummy image. See src/virtualization/docs/README.md for manual build instructions.
[1077/46128] ACTION //src/virtualization/packages/debian_guest:kernel(//build/toolchain/fuchsia:x64)
WARNING: ../../prebuilt/virtualization/packages/debian_guest/images/x64/vmlinuz not found, using a dummy image. See src/virtualization/docs/README.md for manual build instructions.
[1081/46128] ACTION //src/virtualization/packages/debian_guest:rootfs(//build/toolchain/fuchsia:x64)
WARNING: ../../prebuilt/virtualization/packages/debian_guest/images/x64/rootfs.qcow2 not found, using a dummy image. See src/virtualization/docs/README.md for manual build instructions.
[1083/46128] ACTION //src/virtualization/packages/debian_guest:tests(//build/toolchain/fuchsia:x64)
WARNING: ../../prebuilt/virtualization/packages/debian_guest/images/x64/tests.img not found, using a dummy image. See src/virtualization/docs/README.md for manual build instructions.
[1085/46128] ACTION //src/virtualization/packages/termina_guest:kernel(//build/toolchain/fuchsia:x64)
WARNING: ../../prebuilt/virtualization/packages/linux_guest/images/x64/Image not found, using a dummy image. See src/virtualization/docs/README.md for manual build instructions.
[1087/46128] ACTION //src/virtualization/packages/termina_guest:rootfs(//build/toolchain/fuchsia:x64)
WARNING: ../../prebuilt/virtualization/packages/termina_guest/images/x64/vm_rootfs.img not found, using a dummy image. See src/virtualization/docs/README.md for manual build instructions.
[1092/46128] ACTION //src/virtualization/packages/termina_guest:tools(//build/toolchain/fuchsia:x64)
WARNING: ../../prebuilt/virtualization/packages/termina_guest/images/x64/vm_tools.img not found, using a dummy image. See src/virtualization/docs/README.md for manual build instructions.

guest コマンドから vmm コマンドが起動する流れ

  • guest コマンド
    packages/guest_package.gni により、//src/virtualization/packages/meta/guest_package.cmx を debian_guest.cmx に。
    bin/guest/launch.cc で
    fuchsia-pkg://fuchsia.com/debian_guest#meta/debian_guest.cmx を起動
  • guest_runner コマンド
    debian_guest.cmx で、fuchsia-pkg://fuchsia.com/guest-runner#meta/guest_runner.cmx を起動。
    bin/guest_runner/main.cc から、fuchsia-pkg://fuchsia.com/vmm#meta/vmm.cmx を起動
  • vmm コマンド

Discussion