Tutorial
*BIOS* and *UEFI* are two different firmware that try to solve the same problem - the initialization process of the machine. Stored in ROM.
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
To run UEFI on QEMU, we need two things: firmware itself and firmware variables.
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