Tutorial

Intro

*BIOS* and *UEFI* are two different firmware that try to solve the same problem - the initialization process of the machine. Stored in ROM.

Downloading

QEMU default is BIOS (SeaBios), so changes are to be done to boot with UEFI - a modern replacement for BIOS.

OVMF - просто UEFI для віртуальних машин, часто йде разом з QEMU, але не завжди.

# For 'apt' based distros (e.g. Debian, Ubuntu)
$ apt install qemu-efi-aarch64

$ sudo apt-get install virt-manager libvirt-daemon ovmf 
#(for ubuntu)
# For 'pacman' or 'yay' based distros (e.g. ArchLinux)
$ pacman -S edk2-ovmf
# Windows pre-installed with MSI Installer
# macOS pre-installed with Homebrew

Локації встановлених файлів для кожної системи різні, усі вони вказані туть.

Для arch, debain та windows там по дві різні архітектури: aarch64 та x86_64, у мене x86, відповідно, папка для мене наступна: /usr/share/edk2-ovmf/x64 (для Ubuntu (я скачувала OVMF командою sudo apt-get install virt-manager libvirt-daemon ovmf) шлях такий: usr/share/ovmf при чому половина з перелічених нижче файлів знаходиться у іншій папці (OVMF) за цим же шляхом ), у ній знаходиться наступне:

❯ la /usr/share/edk2-ovmf/x64
total 29M
-rw-r--r-- 1 root root 4,0M вер 24 14:15 MICROVM.4m.fd
-rw-r--r-- 1 root root 2,0M вер 24 14:15 MICROVM.fd
-rw-r--r-- 1 root root 4,0M вер 24 14:15 OVMF.4m.fd
-rw-r--r-- 1 root root 3,5M вер 24 14:15 OVMF_CODE.4m.fd
-rw-r--r-- 1 root root 3,5M вер 24 14:15 OVMF_CODE.csm.4m.fd
-rw-r--r-- 1 root root 1,9M вер 24 14:15 OVMF_CODE.csm.fd
-rw-r--r-- 1 root root 1,9M вер 24 14:15 OVMF_CODE.fd
-rw-r--r-- 1 root root 3,5M вер 24 14:15 OVMF_CODE.secboot.4m.fd
-rw-r--r-- 1 root root 1,9M вер 24 14:15 OVMF_CODE.secboot.fd
-rw-r--r-- 1 root root 2,0M вер 24 14:15 OVMF.fd
-rw-r--r-- 1 root root 528K вер 24 14:15 OVMF_VARS.4m.fd
-rw-r--r-- 1 root root 128K вер 24 14:15 OVMF_VARS.fd

UEFI on QEMU

To run UEFI on QEMU, we need two things: firmware itself and firmware variables.

Firmware itself

It is what OVMF is, so we have to provide path to installed file while starting QEMU, using the following argument:

-drive if=pflash,format=raw,readonly=on,file=/usr/share/edk2-ovmf/x64/OVMF.fd

Цей фалик є по факту отим ROMом для UEFI, як у звичайних компуктерах.

UEFI - це програма, яка щось там робить, і їй потрібна пам’ять в яку вона може щось писати, умовно якісь конфіги (Boot order, Hardware Configurations …), і ця пам’ять не затиратися після ребуту, тому потрібен ще один файлик - UEFI variables.

Обидва ці файлики є образами, і UEFI сприймає їх як окремі диски (опція -drive може натякати на то).

У UEFI variables є свій прикол, він має бути розміру рівно 64MiB (64 мебібайт = $2^{20}$ байт = $1,048,576$ байт). Цей файлик для лінуксоїдів треба робити самим:

$ dd if=/dev/zero of=efi-vars.raw bs=1M count=64
# dd      - Copy a file, converting and formatting according to the operands.
# if=FILE - read from FILE instead of stdin
# of=FILE - write to FILE instead of stdout
# bs=BYTES- read and write up to BYTES bytes at a time (block size)
# count=N - copy only N input blocks
# /dev/zero - file from which an infinite amount of 0x00 can be read