Open5
yunibuild: qemuのコンテナを作りたい
Github ActionsでHypervisor類が使えるようになったのでqemuをコンテナ化したい。いやまぁcrosvmとかでも良いんだけど。。
MSYS2のコンテナを作る
MSYS2の公式サイトに説明 https://www.msys2.org/docs/ci/ がある。必要そうなパッケージをねっとり確認して、Dockerfileにする。
MSYSというかMinGWは色々なABIをサポートしているが、今回はUCRTにしてみる。
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
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つ用意して:
-
qemusrc
: ソースコードのGitリポジトリ。Configure時にGitのチェックアウトが入るのでrwにしている。 -
scripts
: ビルドスクリプト置き場。こちらはread onlyで良い。 -
output
: ビルドアーティファクト置き場。
コンテナの中からは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でも変わらなかった。 ...まぁビルドしたものを直接ホストで使えば良いだけだけど、ちょっと寂しいもんがあるな。。