Zirconのハイパーバイザ概要(未完成)
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”.
ディレクトリ構成
主要なものだけ紹介。
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
- デビアン src/virtualization/packages/debian_guest
- Termina
src/virtualization/packages/termina_guestTermina is a VM image with a stripped-down Chrome OS linux kernel and userland tools. Its only goal is to boot up as quickly as possible and start running containers.
- Zircon
src/virtualization/packages/zircon_guest
手動でビルドできるゲスト OS
- Biscotti
src/virtualization/packages/biscotti_guestThe biscotti_guest is a guest system based off the Termina VM.
ゲスト OS の起動
Fuchsia 起動後、シェルから下記コマンドを実行。
guest launch debian_guest # ゲスト OS が Debian の場合
調査前の疑問への回答
zircon hypervisor は、Linux がゲスト OS のときに I/O の仮想化を行うか。また、その際に qemu を利用するか
I/O の仮想化を行います。qemu は利用しません。
ゲスト OS の Linux カーネルをビルドする際に、virtio を利用します。準仮想化。
zircon hypervisor 機能は virtio を提供します。
- ゲスト Linux OS のソースコード
machina-4.18/ - ゲスト Linux OS の Kconfig(x86)
virtio を利用している
machina-4.18/arch/x86/configs/machina_defconfig - ゲスト Linux OS の Kconfig(arm64)
virtio を利用している
machina-4.18/arch/arm64/configs/machina_defconfig
fx set ... --with-base //src/virtualization で何が変わるか
fx set core.${ARCH} --with-base //src/virtualization
## --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_create、zx_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