2023年04月26日
MSYS2でQEMU 7.1をビルド
このブログでも何度か取り上げてきましたが、QEMU の Windows バイナリ(x64)のビルドは、以前はとても大変でした。今回、とある事情で数年ぶりに Xilinx QEMU の git HEAD(QEMU 7.1.0 ベース)をビルドする必要がでてきたので調査したところ、以前作った Xilinx QEMU 2020.3(QEMU 5.0.50 ベース)のビルド環境ではライブラリが古いためビルドできず、アップデートも困難な状態でした。
最終的に、最も王道である MSYS2 でビルドが成功し、正常動作が確認できました。その時のメモです。
最終的に、最も王道である MSYS2 でビルドが成功し、正常動作が確認できました。その時のメモです。
MSYS2 をインストールし、「MSYS2 MSYS」を起動します。
https://eng-notebook.com/post-3582/
Xilinx QEMU の 2023.1 がまだリリースされていない中途半端な状況なので、git HEAD ではなく、そのベースとなった公式の QEMU 7.1.0 をビルドします。今回のターゲットは aarch64 ですが、同じようにして他のターゲットもビルドできると思います。
https://zenn.dev/tlls/articles/553b022a4ae4d63efc65
https://gist.github.com/itzurabhi/a760155c28c0e34ebb14ccf10f08d47b
事前に Ubuntu で cloud.img を作成してコピーしておきます。user/password は任意のものでかまいません。
$ pacman -Syu # ベースシステムアップデート & ターミネート $ pacman -Syu # アップデート $ pacman -S base-devel mingw-w64-x86_64-toolchain mingw-w64-x86_64-glib2 mingw-w64-x86_64-pixman mingw-w64-x86_64-python ninja mingw-w64-x86_64-SDL2 mingw-w64-x86_64-gtk3 mingw-w64-x86_64-libslirpこのサイト様を参考に、prefix 付きのバイナリを作成します。Windows でシンボリックリンクはなんとなく不安だったので、ハードリンクしています。
https://eng-notebook.com/post-3582/
$ cd /c/msys64/mingw64/bin $ ln ar.exe x86_64-w64-mingw32-ar.exe $ ln ranlib.exe x86_64-w64-mingw32-ranlib.exe $ ln windres.exe x86_64-w64-mingw32-windres.exe $ ln nm.exe x86_64-w64-mingw32-nm.exe $ ln objcopy.exe x86_64-w64-mingw32-objcopy.exe「MSYS2 MSYS」を終了し、「MSYS2 MinGW x64」を起動します。
Xilinx QEMU の 2023.1 がまだリリースされていない中途半端な状況なので、git HEAD ではなく、そのベースとなった公式の QEMU 7.1.0 をビルドします。今回のターゲットは aarch64 ですが、同じようにして他のターゲットもビルドできると思います。
$ wget https://download.qemu.org/qemu-7.1.0.tar.xz $ tar xvf qemu-7.1.0.tar.xzQEMU 7.1 を MSYS2 でビルドするとエラーが出るので、以下を修正しておきます。
qemu-7.1.0/include/qemu/osdep.h -extern G_NORETURN +extern __attribute__((noreturn))
$ mkdir build install $ cd build/ $ ../qemu-7.1.0/configure --prefix=/home/kmc/test/QEMU/install --enable-gtk --enable-sdl --enable-slirp --target-list=aarch64-softmmu --cross-prefix=x86_64-w64-mingw32-以下のようなエラーが出力されますが、気にしなくて良さそうです。
Running postconf script 'C:/msys64/mingw64/bin/python3.exe C:/msys64/home/kmc/test/QEMU/qemu-7.1.0/s cripts/symlink-install-tree.py' --- stdout --- --- stderr --- error making symbolic link C:/msys64/home/kmc/test/QEMU/install/share/trace-events-all Traceback (most recent call last): File "C:\msys64\home\kmc\test\QEMU\qemu-7.1.0\scripts\symlink-install-tree.py", line 33, inビルドします。ninja を使えば自動的に並列度を調整してくれるので、make のように -j オプションを指定する必要はありません。(いきなり ninja install でも大丈夫ですが、私は二段階に分けます。)raise e File "C:\msys64\home\kmc\test\QEMU\qemu-7.1.0\scripts\symlink-install-tree.py", line 29, in os.symlink(source, bundle_dest) OSError: [WinError 1314] クライアントは要求された特権を保有していません。: 'C:/msys64/home/kmc/test/ QEMU/build_test/trace/trace-events-all' -> 'qemu-bundle/msys64/home/kmc/test/QEMU/install/share/trac e-events-all'
$ ninja $ ninja install $ cd .. $ ./install/qemu-system-aarch64.exe --version QEMU emulator version 7.1.0 Copyright (c) 2003-2022 Fabrice Bellard and the QEMU Project developers以下のサイト様を参考に Ubuntu 18.04 aarch64 を起動してみます。
https://zenn.dev/tlls/articles/553b022a4ae4d63efc65
https://gist.github.com/itzurabhi/a760155c28c0e34ebb14ccf10f08d47b
事前に Ubuntu で cloud.img を作成してコピーしておきます。user/password は任意のものでかまいません。
$ sudo apt install cloud-image-utils $ vim cloud.txt $ cat cloud.txt #cloud-config user: kmc password: kmc chpasswd: { expire: False } ssh_pwauth: True $ cloud-localds --disk-format qcow2 cloud.img cloud.txt以後は MSYS2 上で完結します。
$ wget "http://cloud-images.ubuntu.com/releases/bionic/release/ubuntu-18.04-server-cloudimg-arm64.img" # create a backup, VM will modify the image. $ cp ubuntu-18.04-server-cloudimg-arm64.img ubuntu-18.04-server-cloudimg-arm64.img.orig $ dd if=/dev/zero of=flash0.img bs=1M count=64 $ wget https://releases.linaro.org/components/kernel/uefi-linaro/latest/release/qemu64/QEMU_EFI.fd $ dd if=QEMU_EFI.fd of=flash0.img conv=notrunc $ dd if=/dev/zero of=flash1.img bs=1M count=64 $ ./install/qemu-system-aarch64 -m 4096 -smp 4 -cpu cortex-a57 -M virt -nographic -pflash flash0.img -pflash flash1.img -drive if=none,file=ubuntu-18.04-server-cloudimg-arm64.img,id=hd0 -device virtio-blk-device,drive=hd0 -drive if=none,id=cloud,file=cloud.img -device virtio-blk-device,drive=cloud -device virtio-net-device,netdev=user0 -netdev user,id=user0,hostfwd=tcp::2222-:22この記事を書くために、当初は最新の QEMU 8.0 を試したのですが、-smp 4 を指定すると Segmentation Fault が発生するようです。