はしくれエンジニアもどきのメモ

情報系技術・哲学・デザインなどの勉強メモ・備忘録です。

Windows環境にUEFIアプリ動作用の仮想環境qemuをインストールする

Windows環境にUEFIアプリ動作用の仮想環境qemuをインストールする

UEFIアプリ自体はWindowsPCでも動くのに意外に仮想環境であるqemuwindowsにインストールして動かす話があまりなかったのでメモ.

環境

  • Windows10

ファームウェア周りの用語メモ

実機でファームウェアアプリを動かす場合

そもそもUEFIBIOSのPCがあればそのままファームウェアアプリを動かせるのでエミュレータはいらない.

手順として,

  1. Cで書いたファームウェアアプリをUEFI用にビルドしてイメージファイルを作る
  2. イメージファイルをBOOTX64.EFIにリネームして,いらないUSBメモリあたりに"EFI/BOOT/BOOTX64.EFI"に書き込む
  3. PCのUEFIを起動して起動ディスクの優先順を変更などして,このUSBの起動ディスクを起動.

これで自作のファームウェアが動く.

エミュレータを利用する

上のように実機でも動くが,

  • 毎回USBに書き出して起動するのは面倒
  • バグったコードでマザーボードが壊れる可能性

を考慮して今回はエミュレータを使用する.

qemuとは

QEMU is a generic and open source machine emulator and virtualizer.

公式サイト:

www.qemu.org

他の仮想マシンソフトとの違い - VirtualBox: ホストOSのCPUを使って同一CPU(のOS実行環境)をエミュレートするタイプ - qemu: CPUを丸ごとエミュレートするタイプ

参考: www.webzoit.net

qemuを使うと自作したファームウェアアプリをフォルダに配置するだけでそれをマウントした状態で起動できる.

qemuのインストール

今回はwindows上にインストールする.

インストーラのDL:

  1. Download QEMU - QEMU からOSに合わせて"64bit"or"32bit"を選択する.
    32bitか64bitを選択
    32bitか64bitを選択
  2. 最新の`qemu-w64-setup-20201124.exe`をDLする.
    インストーラのDL
    インストーラのDL

インストーラからインストール:

  1. 言語を選択する.今回は"English".
    言語選択
    言語選択
  2. セットアップ画面が立ち上がる.
    セットアップ画面
    セットアップ画面
  3. 内容確認して”agree”を選択.
    同意確認
    同意確認
  4. インストールするコンポーネントを選ぶ.今回は全部選択する.
    コンポーネント選択
    コンポーネント選択
  5. インストール先を選択する. 今回はDドライブ直下に選択.
    インストール先選択
    インストール先選択
  6. インストールが始まる.
    インストール中
    インストール中
  7. 無事インストールできれば終わり.
    インストール完了
    インストール完了
  8. powershellあたりから`qemu-system-x86_64.exe`を呼べるようにPATHを通す.
    set QEMU "D:\qemu"
    set PATH "%PATH%;%QEMU%""

wsl上でも動く?

こちらの記事でWSL上のDevianでqemuをインストールして試してるのがある.

http://www.neko.ne.jp/~freewing/software/uefi_bios_hack/

ただし,-nographicオプションが必要な模様.おそらくWSLではGUIが動かないため?

理想の仮想環境としてはwslかdockerかつGUIとして動かせるだろうか

OVMFとは

qemuにはUEFIは実装されていない. 別途用意する必要があり,それがOVMF(Open Virtual Machine Firmware)になる.

OVMFとは何か?

OVMF is an EDK II based project to enable UEFI support for Virtual Machines. OVMF contains sample UEFI firmware for QEMU and KVM.

OVMF · tianocore/tianocore.github.io Wiki · GitHub

OVMF.fdがイメージファイルになる. これをqemuを起動するときの-biosオプションで指定するとUEFIを起動できる.

OVMFのDL

以下からzipファイルをDLして解凍するとOVMF.fdファイルが入っている.

sourceforge.net

OVMF.fdのDL
OVMF.fdのDL

解凍して適当な場所に置く.

実装されているUEFIのバージョンは書かれていない?

ビルド方法

最新版が欲しい場合は, EDKⅡのプロジェクトをDLしてビルドすればいい.

サポート環境:

以下の記事で実際にビルドを試している..

cluster.hatenablog.com

qemuの動作確認

そのまま起動

PATHが通ってるので以下のコマンドで起動できる.

> qemu-system-x86_64.exe

以下のように立ち上がればok

qemu起動
qemu起動

空フォルダをマウントしてOVMFを起動

qemuではフォルダをディスクとしてマウントして起動できる.

  • -biosオプションでOVMFファイルを指定する.
  • -hdaオプションでマウントしたいフォルダを指定する.

option一覧は Invocation — QEMU 5.0.92 (v5.1.0-rc2) documentationに載っている.

>  qemu-system-x86_64.exe -bios D:\OSImage\OVMF-X64-r15214\OVMF.fd -hda fat:rw:Desktop/qemu

今回は空フォルダなのでロードに失敗して以下のように立ち上がる.

OVMF起動
OVMF起動

イメージフォーマットを指定してないので以下の警告が出るが問題なく動作する.

WARNING: Image format was not specified for 'json:{"fat-type": 0, "backing": {"driver": "vvfat_write_target"}, "dir": "Desktop/qemu", "driver": "vvfat", "floppy": false, "rw": true, "write-target": {"driver": "qcow", "file": {"driver": "file", "filename": "C:\\Users\\...' and probing guessed raw.
         Automatically detecting the format is dangerous for raw images, write operations on block 0 will be restricted.
         Specify the 'raw' format explicitly to remove the restrictions.

回避するには-driveオプションを使って, -drive format=rawで回避できる.

OSイメージの起動

今回使わないので省略. 仮想ディスクのサイズを指定しておくなど前処理が必要ぽい.

こちらの記事で使い方がまとまっている.

legacyos.ichmy.0t0.jp