Небольшая памятка по созданию загрузочной флешки с 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.