ESPディスクを自作してUEFIアプリを起動するまでの手順
はじめに
UEFIアプリを自作して実行するには、単にアプリ(BOOTX64.EFI)をコンパイルするだけではなく、ESP(EFI System Partition)付きのディスクイメージを用意して正しく配置する必要があります。
今回は「Hello UEFI」を表示する最小アプリを作り、QEMU上で起動するまでの流れを記録します。
手順
ステップ1: 作業ディレクトリを用意する
mkdir -p ~/uefi-hello
cd ~/uefi-hello
ステップ2:Hello UEFI のソースコードを書く
Visual Studioでソースコード(hello.cを作成する)
※保存先: C:\Users\ユーザー名\Documents\hello.c
(今回の場合 : ls /mnt/c/Users/momot/Documents/hello.c)
#include <efi.h>
#include <efilib.h>
EFI_STATUS EFIAPI efi_main(EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE *SystemTable) {
InitializeLib(ImageHandle, SystemTable); // これがあると各種ライブラリが正常化
Print(L"Hello UEFI!\n"); // ワイド文字 L""
return EFI_SUCCESS; // ← 重要:成功で返す
}
作成した.cファイルを作業フォルダへコピー
cp /mnt/c/Users/momot/Documents/hello.c ~/uefi-hello/
ls -l hello.c
ステップ3: コンパイルとリンク(EFIアプリ化)
# コンパイルする
gcc -I/usr/include/efi -I/usr/include/efi/x86_64 \
-fno-stack-protector -fpic -fshort-wchar -mno-red-zone \
-c hello.c -o hello.o
# リンク
ld -nostdlib -znocombreloc -shared -Bsymbolic \
-L/usr/lib \
/usr/lib/crt0-efi-x86_64.o hello.o \
-o hello.so -lefi -lgnuefi \
-T /usr/lib/elf_x86_64_efi.lds
# EFIアプリ形式に変換
objcopy -O efi-app-x86_64 \
-j .text -j .sdata -j .data -j .dynamic -j .dynsym \
-j .rel -j .rela -j .reloc \
hello.so BOOTX64.EFI
#動作確認
ile BOOTX64.EFI
# → PE32+ executable (EFI application) x86-64 が理想
objdump -x BOOTX64.EFI | grep -i Subsystem
# → Subsystem: EFI application が出れば確実
hexdump -C -n 2 BOOTX64.EFI
# → 4d 5a("MZ")
ステップ4: ESPイメージを作る
# 200MBのRAWイメージ作成
qemu-img create -f raw disk.img 200M
# GPT作成とESP領域確保
parted -s disk.img mklabel gpt
parted -s disk.img mkpart ESP fat32 1MiB 100%
parted -s disk.img set 1 esp on
# ループ割当て & FAT32フォーマット
LOOP=$(sudo losetup -Pf --show disk.img)
sudo mkfs.vfat -F32 -n ESP ${LOOP}p1
# マウントして配置
sudo mkdir -p /mnt/esp
sudo mount ${LOOP}p1 /mnt/esp
sudo mkdir -p /mnt/esp/EFI/BOOT
sudo cp -f BOOTX64.EFI /mnt/esp/EFI/BOOT/BOOTX64.EFI
ls -R /mnt/esp
・アンマウント
sudo umount /mnt/esp
sudo losetup -d "$LOOP"
ステップ5: QEMUで起動する
cp /usr/share/OVMF/OVMF_VARS.fd ./OVMF_VARS.fd
qemu-system-x86_64 \
-drive if=pflash,format=raw,readonly=on,file=/usr/share/OVMF/OVMF_CODE.fd \
-drive if=pflash,format=raw,file=./OVMF_VARS.fd \
-drive format=raw,file=esp.img
・QEMU起動後画面
その後矢印で「Boot Manager」を選択しエンターキーを押す。
その後矢印で「EFI Internal Shell」を選択しエンターキーを押す。
fs0:
ls
cd EFI\BOOT
BOOTX64.EFI
を打つ
画像のようにHello UTFI!が出れば成功!!
つまづきポイントと解決法
今回の作業では、以下のようなハマりどころがありました。実際に試す方の参考になれば幸いです。
- QEMU内でBOOTX64.EFIが見つからない
起動後に fs0: に切り替えて \EFI\BOOT\BOOTX64.EFI を実行しようとしても、
「見つからない or Unsupported」と表示されて焦りました。
原因
キーボード操作の問題と、EFIアプリ形式のリンク設定が正しくなかったことが重なっていた。
対処法
・キーボードは 「Shiftキー+:」 で : が入力できる。
・¥ は 「むキー(キーボードで「む」と書いてあるキー)」 で入力可能。
・リンク時に正しいEFIライブラリ(libefi.a, libgnuefi.a)を指定してビルドし直すことで解決。
- QEMU起動時に Permission denied
以下のようなエラーが出ました。
Could not open '/usr/share/OVMF/OVMF_VARS.fd': Permission denied
原因
システムの OVMF_VARS.fd を直接書き込みしようとして失敗していた。
対処法
元のファイルをコピーしてカレントディレクトリに置き、そちらを使う。
cp /usr/share/OVMF/OVMF_VARS.fd ./OVMF_VARS.fd
qemu-system-x86_64 \
-drive if=pflash,format=raw,readonly=on,file=/usr/share/OVMF/OVMF_CODE.fd \
-drive if=pflash,format=raw,file=./OVMF_VARS.fd \
-drive format=raw,file=esp.img
- Boot Managerから選んでも動かない
「UEFI QEMU HARDDISK」を選んでも反応せず、アプリが起動できなかった。
対処法
EFI Internal Shell に入り、手動で以下を入力して起動すると動作した。
fs0:
cd EFI\BOOT
BOOTX64.EFI
まとめ
キーボード入力方法 を事前に確認すること
EFIアプリ形式の正しいリンク を行うこと
OVMF_VARS.fd はコピーして使う こと
これらを意識するだけで、ハマりポイントをだいぶ回避できます。
次回予告
次回は、いよいよ本格的な UEFI 開発環境「EDK2」EDK2を使って、より本格的なビルド環境でUEFIアプリを作る方法を解説します。
gnu-efi での最小プログラムを踏まえて、より実践的な開発の流れに挑戦していきましょう。
Discussion