QEMU用のUEFIファームウェアをビルドする
QEMUはUEFI用のファームウェアを持っていないので、UEFI環境でのブートをしたかったら別途用意しなきゃいけないのですが、Intel用のファームウェアはLinuxのパッケージマネージャーのレポジトリにあって使いにくかったり、ARM 64bit版はビルド済みのファームウェアがまともに配布されていなかったりするので、自前で用意しました。
ビルド環境
Dockerのubuntu:20.04
イメージを使います。
$ docker run -it --name "ovmf_build" ubuntu:20.04
必要なパッケージ
必要なパッケージをインストールします。
apt update
apt install -y build-essential
apt install -y git python uuid-dev
apt install -y nasm acpica-tools
また、もしx86_64のマシンでaarch64のUEFIファームウェアをビルドしようとしているなら、クロスコンパイラも必要になります。
apt install -y gcc-aarch64-linux-gnu
ソースコードの入手
gitからダウンロードします。
masterだとビルド失敗することがあるのでstableブランチから取ってきます(※ 2021/12/19 加筆)
git clone https://github.com/tianocore/edk2.git -b stable/202011
cd edk2
git submodule update --init
ビルド
BaseToolsのビルド
make -C BaseTools
成功するとOK
と出ます。
x86_64(AMD/Intel 64bit)
ビルド用のスクリプトがあるのでこちらを利用します。-n 4
はマルチスレッド数なので、使っているCPUに合わせて適宜変更してください。
OvmfPkg/build.sh -a X64 -b RELEASE -n 4
ビルドが完了すればBuild/OvmfX64/RELEASE_GCC5/FV/OVMF.fd
が生成されるので、Dockerを抜けたらdocker cp
でホストOS上にコピーしましょう。
docker cp ovmf_build:/edk2/Build/OvmfX64/RELEASE_GCC5/FV/OVMF.fd .
i386(Intel 32bit)
こちらもビルド用のスクリプトがあります。
OvmfPkg/build.sh -a IA32 -b RELEASE -n 4
ビルドが完了すればBuild/OvmfIa32/RELEASE_GCC5/FV/OVMF.fd
が生成されるので、Dockerを抜けたらdocker cp
でホストOS上にコピーしましょう。
docker cp ovmf_build:/edk2/Build/OvmfIa32/RELEASE_GCC5/FV/OVMF.fd .
aarch64(ARM 64bit)
まずedkのパスを通します
source edksetup.sh
もしIntelマシンでビルドしようとしているなら、クロスコンパイラを指定してください。
export GCC5_AARCH64_PREFIX=aarch64-linux-gnu-
あとはビルドコマンドを叩けば大丈夫。
build -a AARCH64 -t GCC5 -p ArmVirtPkg/ArmVirtQemu.dsc -b RELEASE -n 4
ビルドが完了すればBuild/ArmVirtQemu-AARCH64/RELEASE_GCC5/FV/QEMU_EFI.fd
が生成されるので、Dockerを抜けたらdocker cp
でホストOS上にコピーしましょう。
docker cp ovmf_build:/edk2/Build/ArmVirtQemu-AARCH64/RELEASE_GCC5/FV/QEMU_EFI.fd .
お掃除
ビルドが終わって必要なファイルをコンテナ内から取り出したら、もうコンテナはいらないので消しましょう。
docker rm ovmf_build
まとめ
Apple Siliconの登場でARMの仮想化をすることも増えてくると思うので、一旦ファームウェアをビルドして手元に置いておくと便利です。
参考
QEMUでARM64(AARCH644)のUEFIコンソールを実行する - /home/tnishinaga/TechMEMO
コメント