Небольшая памятка по созданию загрузочной флешки с UEFI Shell

Порой бывает нужно поковыряться в UEFI Shell на системах, где его либо нет, либо запуск сложен по каким-либо причинам. В таком случае можно создать загрузочную флешку, содержащую скомпилированный EFI-файл с Shell’ом.

Для начала следует собрать Shell, воспользовавшись репозиторием edk2:

nihonium@delta/~$ git clone https://github.com/tianocore/edk2.git
nihonium@delta/~$ cd edk2
nihonium@delta/~/edk2$ git submodule update --init

Установим необходимые для сборки пакеты:

nihonium@delta/~/edk2$ pacman -S base-devel glibc iasl python2 subversion

Соберем и инициализируем среду сборки edk2:

nihonium@delta/~/edk2$ make -C BaseTools
nihonium@delta/~/edk2$ ./edksetup.sh

Отныне и впредь мы можем работать с системой сборки edk2.

Каждый раз перед сборкой пакета с помощью edk2 следует проделать следующие шаги:

nihonium@delta/~/edk2$ export EDK_TOOLS_PATH=$HOME/edk2/BaseTools
nihonium@delta/~/edk2$ source edksetup.sh

Укажем используемый компилятор и нужную архитектуру в файле Conf/target.txt:

....
TARGET_ARCH           = X64
....
TOOL_CHAIN_TAG        = GCC
....

Соберем ShellPkg:

nihonium@delta/~/edk2$ build -p ShellPkg/ShellPkg.dsc

После успешного завершения сборки в каталоге Build/Shell/DEBUG_GCC/X64 будут находиться два файла вида Shell*.efi - нам будет нужен больший по размеру.

Пришло время подготовить флешку для запись на неё полученного EFI-файла. В первую очередь нам нужно создать таблицу разделов GPT и раздел размером 100 мегабайт на флешке (/dev/sdb):

nihonium@delta/~/$ sudo fdisk /dev/sdb

Welcome to fdisk (util-linux 2.39.1).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.

Command (m for help): g
Created a new GPT disklabel (GUID: 55B4AD54-A725-4AE3-A093-F5E0CC2B3E45).

Command (m for help): n
Partition number (1-128, default 1):
First sector (2048-30719966, default 2048):
Last sector, +/-sectors or +/-size{K,M,G,T,P} (2048-30719966, default 30717951): +100M

Created a new partition 1 of type 'Linux filesystem' and of size 100 MiB.

Command (m for help): w
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.

Отформатируем созданный раздел в FAT:

nihonium@delta/~/$ sudo mkfs.vfat /dev/sdb1

Создадим необходимую структуру каталогов на новом разделе:

nihonium@delta/~/$ sudo mount /dev/sdb1 /mnt
nihonium@delta/~/$ sudo mkdir -p /mnt/efi/boot

Скопируем полученный выше Shell*.efi в каталог /mnt/efi/boot под названием bootx64.efi:

nihonium@delta/~/edk2/$ cp Build/Shell/DEBUG_GCC/X64/Shell*.efi /mnt/efi/boot/bootx64.efi

Всё, можно втыкать носитель в компьютер, запускать систему и пытаться выдавить F12 в ожидании Boot Menu.