Open5

yunibuild: qemuのコンテナを作りたい

okuokuokuoku

Github ActionsでHypervisor類が使えるようになったのでqemuをコンテナ化したい。いやまぁcrosvmとかでも良いんだけど。。

okuokuokuoku

qemuをビルドする

公式のWiki https://wiki.qemu.org/Hosts/W32 を適当に参考にしつつqemuをビルドする。

./configure --enable-whpx --enable-system --enable-slirp --enable-vnc \
  --target-list=aarch64-softmmu,arm-softmmu,avr-softmmu,riscv32-softmmu,riscv64-softmmu,x86_64-softmmu \
  --prefix=c:/qemugit
ninja -C build
ninja -C build install
okuokuokuoku

Dockerでビルドする

Windows上のDockerはimageの生成がアホみたいに遅いのでvolume上でビルドする。。

docker run --rm --isolation process \
  -v c:/cygwin64/home/oku/repos/yunibuild/qemu/qemusrc:c:/qemusrc:rw \
  -v c:/cygwin64/home/oku/repos/yunibuild/qemu/scripts:c:/scripts:ro \
  -v c:/cygwin64/home/oku/repos/yunibuild/qemu/output:c:/output:rw \
  yunibuild-msys2 \
  c:/msys64/msys2_shell.cmd -ucrt64 -defterm -where c:/scripts -no-start -c \
  "cmake -P buildqemu.cmake"

ボリュームは3つ用意して:

  1. qemusrc : ソースコードのGitリポジトリ。Configure時にGitのチェックアウトが入るのでrwにしている。
  2. scripts : ビルドスクリプト置き場。こちらはread onlyで良い。
  3. output : ビルドアーティファクト置き場。
okuokuokuoku

コンテナの中からはWHPX使えないのかよ!

ContainerAdministrator@193b1808104b UCRT64 /c/qemu
# ./qemu-system-x86_64.exe -accel whpx -vga virtio -vnc 127.0.0.1:5500,reverse
C:\qemu\qemu-system-x86_64.exe: -vnc 127.0.0.1:5500,reverse: warning: short-form boolean option 'reverse' deprecated
Please use reverse=on instead
C:\qemu\qemu-system-x86_64.exe: -accel whpx: Could not load library WinHvPlatform.dll.
C:\qemu\qemu-system-x86_64.exe: -accel whpx: failed to initialize whpx: Function not implemented

これはprocess isolationでもHyper-Vでも変わらなかった。 ...まぁビルドしたものを直接ホストで使えば良いだけだけど、ちょっと寂しいもんがあるな。。