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 MSYS」を起動します。
$ 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.xz
QEMU 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 
    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 を使えば自動的に並列度を調整してくれるので、make のように -j オプションを指定する必要はありません。(いきなり ninja install でも大丈夫ですが、私は二段階に分けます。)
$ 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 が発生するようです。

kmckk at 18:52コメント(0)qemu | 若槻 

コメントする

名前
 
  絵文字
 
 
記事検索
最新コメント
アクセスカウンター
  • 今日:
  • 昨日:
  • 累計:

QRコード
QRコード