Arrancada UEFI bàsica amb QEMU
Tetris amb UEFI 🕹️
En aquest exercici aprendrem a crear un entorn d’arrencada UEFI senzill utilitzant QEMU. A diferència de la BIOS tradicional, la UEFI utilitza fitxers executables en format PE (Portable Executable) per carregar els sistemes operatius. Aquests fitxers es col·loquen en una partició especial del disc anomenada ESP (EFI System Partition).
L’objectiu final és carregar i executar un petit joc de Tetris dins de l’entorn UEFI.
Preparar l’entorn
Per a aquest laboratori, necessitem una màquina virtual amb Debian i una interfície gràfica, ja que la UEFI per defecte utilitza un entorn gràfic.
Si no teniu una interfície gràfica, podeu instal·lar-la amb la següent comanda:
su -c "apt install task-gnome-desktop -y"
Un cop instal·lada la interfície gràfica, reinicieu la màquina virtual i inicieu sessió a l’entorn d’escriptori.
A més, necessitem instal·lar les eines necessàries per compilar i executar el nostre codi UEFI.
su -c "apt install qemu-system-x86 gcc-x86-64-linux-gnu nasm make gnu-efi gdisk mtools -y"
su -c “apt install qemu-system-x86 make gdisk mtools -y”
Finalment, clonem el repositori amb el codi font del joc de Tetris per UEFI:
git clone https://github.com/a1ive/uefi-tetris.git
cd uefi-tetris
Quan executeu les comandes QEMU, no ho feu amb la conexió SSH ja que us donarà problemes amb la interfície gràfica. Utilitzeu la terminal de la màquina virtual directament.
Metode 1: Arrancant utilitzant la UEFI Shell 🚀
Aquest mètode ens permetrà executar ràpidament un executable UEFI sense la necessitat de crear una imatge de disc. Utilitzarem la UEFI Shell, una línia de comandes que ens permet interactuar amb l’entorn UEFI.
qemu-system-x86_64 -bios /usr/share/qemu/OVMF.fd -drive format=raw,file=fat:rw:./ -net none
On aquest comandament:
bios /usr/share/qemu/OVMF.fd
: Carrega el firmware OVMF (Open Virtual Machine Firmware), que és la implementació UEFI per a QEMU.-drive format=raw,file=fat:rw:./
: Munta el directori actual (./) com si fos una partició FAT. La UEFI Shell reconeix aquest format de manera nativa, donant-nos accés al nostre fitxertetris.efi
.-net none
: Deshabilita la xarxa, ja que no la necessitem per a aquest exercici.
En executar la comanda, QEMU s’iniciarà i, com que no hi ha cap sistema operatiu per arrencar, caurà directament a la UEFI Shell.
Metode 2: Creant una imatge de disc amb partició ESP 🏗️
Aquest mètode simula un escenari més real, on el fitxer executable es troba en una partició dedicada al disc. La partició ESP (EFI System Partition) és una partició especial, formatada en FAT32, on es guarden els fitxers d’arrencada del sistema operatiu.
Crear la imatge del disc
Primer, creem un fitxer que farà de disc dur virtual. Amb 64 MB n’hi ha prou.
qemu-img create -f raw tetris.img 64M
Crear la taula de particions GPT
Utilitzarem gdisk
per crear la partició ESP. La GPT (GUID Partition Table) és el format modern de taules de particions, necessari per a la UEFI.
su -
cd /path/to/uefi-tetris # Canvia al directori on has clonat el repositori
gdisk tetris.img
A la consola de gdisk
, utilitzarem les següents comandes:
- Prémer
o
per crear una nova taula GPT. - Prémer
n
per crear una nova partició. - Prèmer
1
per assignar el número de partició. - Prèmer
Enter
per acceptar l’inici per defecte. - Prèmer
Enter
per acceptar la mida per defecte (fins al final del disc). - Prèmer
ef00
per assignar el tipus EFI System Partition. - Prèmer
w
per escriure els canvis i sortir.
Confirmeu tots els canvis escrivint Y
quan se us demani. Per assegurar-vos que la partició s’ha creat correctament, podeu utilitzar gdisk -l tetris.img
per llistar les particions del fitxer d’imatge. Observeu que la partició té el tipus EF00
, indicant que és una partició ESP.
Formatejar la partició com a FAT32
Ara que tenim la partició, l’hem de formatar, és a dir, donar-li un sistema de fitxers. La UEFI requereix que la partició ESP estigui formatada en FAT32.
- Identificar el dispositiu de bucle:
# Com a root
losetup --partscan --find --show tetris.img
Aquesta comanda mostrarà el nom del dispositiu de bucle creat (p. ex., /dev/loop1
) i la seva partició (/dev/loop1p1
). Anoteu-ho.
- Formatejar la partició:
# Com a root
mkfs.fat -F 32 /dev/loop1p1
Copiar el fitxer UEFI a la partició ESP
Ara, muntem la partició i copiem el fitxer tetris.efi
a la ubicació correcta dins de l’estructura de directoris esperada per la UEFI.
# Com a root
mount /dev/loop1p1 /mnt
mkdir -p /mnt/EFI/BOOT
cp tetris.efi /mnt/EFI/BOOT/BOOTX64.EFI
umount /mnt
losetup -d /dev/loop1
La UEFI espera trobar el fitxer d’arrencada en aquesta ubicació específica: \EFI\BOOT\BOOTX64.EFI
per a sistemes x86_64. Si utilitzeu una arquitectura diferent, assegureu-vos de canviar el nom del fitxer segons sigui necessari (per exemple, BOOTAA64.EFI
per a ARM64). Com estem emulant un sistema x86_64, utilitzem BOOTX64.EFI
.
Arrancar la imatge del disc amb QEMU
Finalment, podem arrencar la nostra imatge de disc amb QEMU utilitzant el firmware UEFI.
qemu-system-x86_64 -bios /usr/share/qemu/OVMF.fd -drive format=raw,file=tetris.img -net none
Si tot ha anat bé, hauríeu de veure el joc de Tetris en funcionament a la pantalla directament sense necessitat d’entrar a la UEFI Shell.