Ubuntu Desktop で OVMF と QEMU をソースコードからビルドする

2025/6/07(土)時点での EDK II と QEMU の HEAD をビルドして使ってみた時のメモです。

# 注意点

2025/6/07(土)時点のコードをビルドする場合には、git show コマンドで表示されている版に git checkout してください。

EDK II のビルドですが、Docker の次に推奨されているのが Stuart です。Stuart を使うことでビルド環境が整い、従来からある build コマンドを円滑に使えるようになります。

stuart_ci_build コマンドの実行で、cspell の警告が出力されますが、この記事では cspell の npm install は行いません。nodenv を利用することで、Node.js のバージョンを調整するなどすれば使えるはずですが、試していません。

# 作業環境

Ubuntu Desktop 24.04 LTS 等では、Oracle VirtualBox 上でのインストール中にフリーズしたり、インストーラの画面が大きすぎて Oracle VirtualBox のウインドウに収まらずボタンが押せなかったりと、いろいろと不都合があるため、代替環境として Linux Mint 22.1 を使います。

そのため、Ubuntu Desktop 24.04 LTS は未検証ですが、WSL(Ubuntu 24.04.2 LTS)でのビルドは確認済みです。Oracle VirtualBox 以外の仮想環境や、PC に直接インストールした Ubuntu Desktop 24.04 LTS ではビルドできる可能性があります。

* Windows 11
* Oracle VirtualBox 7.1.8 (仮想ストレージ 20 GB 以上)  
Downloads – Oracle VirtualBox  
https://www.virtualbox.org/wiki/Downloads
* Linux Mint 22.1
Download Linux Mint 22.1 - Linux Mint  
https://www.linuxmint.com/download.php

# 準備作業

Linux Mint を Oracle VirtualBox にインストールし、Terminal から以下のコマンドを投入。ビルドエラーになった場合に、「apt-file search ファイル名」でパッケージを探せるようにするため。

````
$ sudo apt update && sudo apt upgrade -fy && sudo apt autoremove -fy
$ sudo apt install -fy apt-file && sudo apt-file update
````

Oracle VirtualBox で Linux Mint の仮想マシンのスナップショットを作成し、Linux Mint をシャットダウンすること。Linux Mint の仮想マシンをクローンし、クローンした仮想マシンを起動。Terminal を開くこと。

# EDK II の OvmfPkg をビルドする

* Terminal から以下のコマンドを投入する。同じ版を試したい場合は、git checkout すること

````
$ cd ~
$ sudo apt install -fy python3 python3-pip python3-venv git mono-complete make uuid-dev nasm iasl nodejs
$ wget https://dist.nuget.org/win-x86-commandline/latest/nuget.exe
$ mono nuget.exe install
$ python3 -m venv .venv_edk2
$ source .venv_edk2/bin/activate
(.venv_edk2) $ pip install --upgrade edk2-pytool-extensions

(.venv_edk2) $ git clone https://github.com/tianocore/edk2.git
(.venv_edk2) $ cd edk2
(.venv_edk2) $ git show -s --format=%H
431da739a0a45882f2b4e703ba2bca5583914646

(.venv_edk2) $ pip install -r pip-requirements.txt --upgrade
(.venv_edk2) $ stuart_setup --platform_module .pytool/CISettings.py --pkg-dir OvmfPkg --arch X64 TOOL_CHAIN_TAG=GCC5
(.venv_edk2) $ python3 BaseTools/Edk2ToolsBuild.py -t GCC5
(.venv_edk2) $ stuart_update --platform_module .pytool/CISettings.py --pkg-dir OvmfPkg --arch X64 TOOL_CHAIN_TAG=GCC5
(.venv_edk2) $ stuart_ci_build --platform_module .pytool/CISettings.py --pkg-dir OvmfPkg --arch X64 TOOL_CHAIN_TAG=GCC5

(.venv_edk2) $ . ./edksetup.sh
(.venv_edk2) $ build -a X64 -t GCC5 -p OvmfPkg/OvmfPkgX64.dsc
(.venv_edk2) $ cp -p Build/OvmfX64/DEBUG_GCC5/FV/OVMF_*.fd ~
(.venv_edk2) $ cd ..
````

# QEMU をビルドする

* Terminal から以下のコマンドを投入する。同じ版を試したい場合は、git checkout すること

````
(.venv_edk2) $ pip install --upgrade sphinx sphinx_rtd_theme
(.venv_edk2) $ sudo apt install -fy ninja-build libglib2.0-dev flex bison libgtk-3-dev

(.venv_edk2) $ git clone https://gitlab.com/qemu-project/qemu.git
(.venv_edk2) $ cd qemu
(.venv_edk2) $ git show -s --format=%H
96215036f47403438c7c7869b7cd419bd7a11f82
(.venv_edk2) $ ./configure --target-list=x86_64-softmmu --enable-gtk
(.venv_edk2) $ make -j4
(.venv_edk2) $ sudo make install

(.venv_edk2) $ qemu-system-x86_64 --version
QEMU emulator version 10.0.50 (v10.0.0-1523-g96215036f4)
Copyright (c) 2003-2025 Fabrice Bellard and the QEMU Project developers
(.venv_edk2) $ cd ..
````

# シェルスクリプトを準備する

* ホームディレクトリに以下のシェルスクリプトを作成する。chmod コマンドで実行可能属性を設定すること。ホームディレクトリに作業用の tmp_efi ディレクトリを作成するので注意すること

````efi_exec.sh
#!/bin/bash

IS_DBG=${1:-0}

mkdir -p $HOME/tmp_efi

if test $IS_DBG -eq 1
then
    DBG="-gdb tcp::10000 -S"
else
    DBG=""
fi

qemu-system-x86_64 \
    -machine pc -net none -vga std -display gtk \
    -drive if=pflash,readonly=on,file=OVMF_CODE.fd,format=raw \
    -drive if=pflash,file=OVMF_VARS.fd,format=raw \
    -drive format=raw,file=fat:rw:$HOME/tmp_efi \
    -debugcon file:$HOME/tmp_efi/ovmf.log \
    -global isa-debugcon.iobase=0x402 $DBG
````

* Oracle VirtualBox で Linux Mint の仮想マシンのスナップショットを作成すること

# GTK で EFI Shell を使ってみる

* Terminal から以下のコマンドを投入する

```
$ ./efi_exec.sh
```

* この画面が表示されたら、Enter キーを押すこと

![Boot.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/68513/ed8f1ebd-8b84-4f24-817b-aa68831ba58d.png)

* この画面が表示されたら、↓ キーで EFI Internal Shell を選択し、Enter キーを押すこと

![Select.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/68513/f66503e8-04e9-4387-9909-b6e08b7131bb.png)

* EFI Shell が起動するので使ってみる

GTK ウインドウから離脱したい時は、Ctrl+Alt+G キーを 1 回押すこと。  
Oracle VirtualBox から離脱したい時は、右 Ctrl キーを 1 回押すこと。

![Shell.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/68513/7517ce67-d905-4aba-882c-d2feda3495f0.png)

# 参考

Build Instructions · tianocore/tianocore.github.io Wiki  
https://github.com/tianocore/tianocore.github.io/wiki/Build-Instructions

How to Build With Stuart · tianocore/tianocore.github.io Wiki  
https://github.com/tianocore/tianocore.github.io/wiki/How-to-Build-With-Stuart