2025年11月17日

Windows で OVMF をビルドする

QEMU で UEFI を使うには、別途 OVMF というファームウェアが必要なのですが、ホスト OS が Windows の場合、簡単には入手できないようです。そこで自力でビルドしてなんとかゲットしたのですが、そこに至るまでの道のりがとても険しかったので、忘れないように記事にしておきます。

この記事を読む前に

さんざん苦労してビルドしたあとで知ったのですが、Windows で利用できるコンパイル済みの OVMF が下記のサイトで配布されているようです。この記事を読む前に試してみるとよいかもしれません (私は試してないので、すんなり動作するかはわかりません)。

また、公式 Wiki によると OVMF をビルドするための方法は 3 通りあります。

  • コンテナを使った開発環境でビルドする。
  • Stuart を使ってビルドする。
  • 手動でビルドする。

この順におすすめすると書かれていますが、個人的には手動でビルドするのが一番よいと考えています。すんなりビルドが通るなら上 2 つでもよいと思うんですけど、最初からうまくいくことはまずないと思うので、どの工程でつまずいたかがわかりやすい手動による方法が一番いいと思います。本稿でも手動でやります。

参考 URL

作業にあたり参考にしたサイトを挙げておきます。

公式 Wiki による Windows でのビルド手順の説明。なんかこの文書、Git GUI とかどうでもいいことは異常に詳しく書かれているのに、肝心のビルドの説明がものすごく大雑把です。流れをざっくり把握するにはいいんですけど、部外者がこのページだけ読んで作業に取りかかるのは、さすがにちょっと無理があります。

この記事と、それに続く【1.ビルド環境の準備】(2/2) ~ 【3.OVMFのビルド】の一連の記事は大変参考になりました。この記事がなかったら、私は挫折していたと思います。

ビルド環境の構築

まずビルド用の作業フォルダを作ります。場所はどこでもいいんですが、ここでは C:\qemu\ovmf とします。

> C:
> md qemu\ovmf
> cd qemu\ovmf

必要なツールを解凍したり、実際にビルドしたりといった作業は、なるべくこのフォルダの中で行うことにします。

ビルドに使用したツールとバージョンは次のとおりです:

Visual Studio Community 2022

  1. ダウンロードした VisualStudioSetup.exe を起動し [変更] ボタン > [ワークロード] タブで [C++ によるデスクトップ開発] にチェックを入れる。
  2. [言語パック] タブ > [日本語] を外して [英語] を選択する。
  3. インストールする。
  4. スタートメニュー > [プログラム] > [Visual Studio 2022] > [Visual Studio Tools] > [VC] の [x64 Native Tools Command Prompt for VS 2022] と [x86 Native Tools Command Prompt for VS 2022] のショートカットを C:\qemu\ovmf に作っておくと楽かもしれない。
  5. 作ったショートカットを右クリック > [プロパティ] > [作業フォルダー] に「%~dp0」と入力しておくと、ショートカットがあるフォルダに cd してくれるので、楽かもしれない。

Python

インストールの際、いくつか選択肢が出ますが、環境に合わせて適当に (適切に) 選んでください。以下は私の場合です。

  1. インストーラを起動する。
  2. 最初の画面:
    • [Add python.exe to PATH] のチェックを外す (自分でやる)。
    • [Use admin privileges when installig py.exe] のチェックも外す (管理者権限がなくてもインストールできる)。
    • [Customize installation] を選択して次へ。
  3. Optional Features:
    • [pip] にチェックを入れ、他は外す。
  4. Advanced Options:
    • チェックをすべて外す。
    • install location: C:\Users\<ユーザ名>\AppData\Local\Programs\Python\Python313 (デフォルトのまま)
  5. インストールが終わると "Disable path length limit" という項目が表示されるが、とりあえず無視して [Close] をクリックした。
  6. コマンドプロンプトを開いてインストールされたか確認する。
    > set PATH=%LOCALAPPDATA%\Programs\Python\Python313;%PATH%
    > python --version
    Python 3.13.9
    

NASM

単に nasm-<バージョン>-win64.zip を取得して解凍します。PATH はあとで他のツールとまとめて設定します。

IASL

これも単に iasl-win-<yyyymmdd>.zip を取得して解凍します。PATH はあとで設定します。

PortableGit

  1. たぶん自己解凍形式なので、PortableGit-<バージョン>.7z.exe をダブルクリックすればインストーラが起動する。
  2. あとは指示に従えば PortableGit というフォルダに展開される。PATH はあとで設定する。
  3. もし .gitconfig で SSH URL を強制するように設定されている場合は、一時的に無効にしておく (次のようにコメントアウトしておく)。
    #[url "git@github.com:"]
    #  InsteadOf = https://github.com/
    
    これをやっておかないと、後の作業でgit submodule updateに失敗する。

各ツールへのパスを通す

各ツールへのパスを通すためのバッチファイルを用意しました。このあとの工程で使用します。

C:\qemu\ovmf\setpath.bat

@echo off

rem ビルド中の日本語文字化け対策
chcp 65001

rem 各ツールへのパスの定義
set path_py=%LOCALAPPDATA%\Programs\Python\Python313
set path_nasm=%CD%\nasm-3.01
set path_iasl=%CD%\iasl-win-20250807
set path_git=%CD%\PortableGit\bin

rem ビルドに必要な環境変数の定義
rem なんちゃら_PREFIX の末尾には '\' を付けること
set PYTHON_HOME=%path_py%
set PYTHON_COMMAND=%path_py%\python
set NASM_PREFIX=%path_nasm%\
set IASL_PREFIX=%path_iasl%\

set PATH=%path_py%;%path_nasm%;%path_iasl%;%path_git%;%PATH%

EDK II を取得する

EDK II がなんなのかイマイチわかってませんが、言われるまま GitHub から取得します。

  1. スタートメニュー > [プログラム] > [Visual Studio 2022] > [Visual Studio Tools] > [VC] >[x86 Native Tools Command Prompt for VS 2022] を開く。
    ※ 「x64」ではなく「x86」のほうです。
  2. 作業フォルダに移動して、先ほど作ったバッチファイルにより各ツールへのパスを通す。
    > C:
    > cd qemu\ovmf
    > setpath.bat
    
  3. EDI 本体とサブモジュールたちのソースコードを取得する。
    > git clone https://github.com/tianocore/edk2.git
    > cd edk2
    > git submodule update --init
    

BaseTools のビルド

引き続き [x86 Native Tools Command Prompt for VS 2022] で作業します。今いる edk2 フォルダで、次のように edksetup.bat を実行します。

> edksetup.bat Rebuild

※ 「!!! WARNING !!! No CYGWIN_HOME set, gcc build may not be used !!!」という警告が表示されますが、気にしなくて大丈夫です。

これにより、edk2\BaseTools\Bin\Win32 に OVMF のビルドに必要なツール類が生成されます。

MdeModulePkg のビルド

  1. BaseTools のビルドの際に生成された edk2/Conf/target.txt を次のように編集する。
    edk2/Conf/target.txt
    ACTIVE_PLATFORM = MdeModulePkg/MdeModulePkg.dsc
    TARGET = RELEASE
    TARGET_ARCH = X64
    TOOL_CHAIN_CONF = Conf/tools_def.txt
    TOOL_CHAIN_TAG = VS2022
    BUILD_RULE_CONF = Conf/build_rule.txt
    
    ※ 各項目に指定可能な値は、edk2\BaseTools\Conf\target.template を読むとだいたいわかる。
  2. スタートメニュー > [プログラム] > [Visual Studio 2022] > [Visual Studio Tools] > [VC] >[x64 Native Tools Command Prompt for VS 2022] を開く。
    ※ 今度は「x86」ではなく「x64」のほうです。
  3. 作業フォルダに移動してツールへのパスを通す。
    > C:
    > cd qemu\ovmf
    > setpath.bat
    
  4. edk2 フォルダに移動して edksetup.bat を実行する。
    > cd edk2
    > edksetup.bat
    
    ※ 「!!! WARNING !!! CLANG_BIN environment variable is not set」「!!! WARNING !!! No CYGWIN_HOME set, gcc build may not be used !!!」という警告が表示されますが、気にしなくて大丈夫です。
  5. ビルドする。
    > build
    
  6. 待つ。

半日くらいかかるかもしれません。Nintendo Switch で復刻された『パタポン 1+2 リプレイ』でもプレイしながら気長に待つのがいいと思います。

OvmfPkg のビルド

これが最終工程です。引き続き [x64 Native Tools Command Prompt for VS 2022] で、build コマンドを実行します。

> build -p OvmfPkg/OvmfPkgX64.dsc -a X64 -t VS2022 -b RELEASE

これも前工程に負けず劣らず時間がかかります。ビルドに成功すると、edk2\Build\OvmfX64\RELEASE_VS2022\FV\ フォルダに次のようなファイルが作成されます。

  • OVMF.fd
  • OVMF_CODE.fd
  • OVMF_VARS.fd

OVMF_CODE.fd がファームウェア本体、OVMF_VARS.fd がファームウェアが読み書きする変数を記録するための NVRAM 領域、OVMF.fd はそれらが一緒くたになったファイル、ということのようです。基本的に OVMF.fd は使わずに、OVMF_CODE.fd と OVMF_VARS.fd をセットで使います。複数の仮想マシンを作ったときに、OVMF_CODE.fd を共有しつつ、OVMF_VARS.fd は個別に用意する (仮想マシンごとに複製する)、といった使い方になるようです。

QEMU で UEFI を起動してみる

まず、これから起動する仮想マシン用の OVMF_VARS.fd を作成します (コピー先のパスは環境に合わせて適当に読み替えてください)。

> cp edk2\Build\OvmfX64\RELEASE_VS2022\FV\OVMF_VARS.fd MY_OVMF_VARS.fd

UEFI を起動するには、次にように実行します。

> qemu-system-x86_64 -drive if=pflash,format=raw,readonly=on,file=OVMF_CODE.fd -drive if=pflash,format=raw,file=MY_OVMF_VARS.fd

スクリーンショットはこんな感じ:

おわりに

記事にしてしまえば、どうということのないボリューム感だなという気がしますが、その背後で費やした時間と労力たるや、出来上がった OVMF.fd をプリントアウトして神棚に祀っておきたいと思ったほどです。どうもお疲れさまでした、俺。