Привет, Хабр! На связи команда «Гравитон». В сегодняшней небольшой статье мы хотим поделиться примерами использования UEFI Shell для работы с персональными компьютерами и серверами.

Современные прошивки, реализующие спецификацию UEFI, предоставляют стандартизированный набор программных интерфейсов (протоколов). Эти протоколы, инкапсулирующие доступ к различным системным функциям, используются в *.efi приложениях, которые могут быть запущены через UEFI Shell. Хотя многие начинающие системные администраторы используют его лишь для базовых операций вроде обновления прошивки, этот инструмент открывает гораздо более широкие возможности для диагностики и управления системой.

UEFI Shell — это полноценный интерпретатор командной строки, работающий до загрузки ОС, он реализует интерактивную среду выполнения (REPL), аналогично bash/zsh, позволяет запускать nsh-скрипты, содержит ряд полезных встроенных утилит.

В этой статье мы рассмотрим основные сценарии применения UEFI Shell для управления компьютером или сервером.

Загрузка в UEFI shell для самых маленьких

В случае отсутствия загрузочной опции Built-in EFI Shell последовательность действий примерно такая:

  1. отформатируйте флешку в FAT32,

  2. в корне флешки создайте структуру каталогов EFI/BOOT,

  3. скачайте последнюю версию shell,

  4. переименуйте файл в Bootx64.efi (для автоматического запуска shell),

  5. переместите файл в созданную директорию BOOT,

  6. загрузитесь с этого носителя, предварительно убедившись в том, что Secure Boot отключен.

Базовые команды

Базовые команды совпадают с привычными bash:

  • ls — список файлов в директории,

  • cd — смена директории,

  • rm — удаление файла/директории,

  • cp — для копирования.

Для просмотра подключенных блочных устройств (диски, разделы) используется команда map, для обновления списка подключенных устройств необходимо добавить ключ -r.

map -r
fs0: Alias(s):HD0a1:   BLK1: 
     PciRoot(0x0)/Pci(0x1F,0x2)/Sata(0x0,0x0)/HD(1,GPT) 
blk0: Alias(s): 
     PciRoot(0x0)/Pci(0x1D,0x0)/USB(0x1,0x0)

Информацию о разделе можно получить с помощью команды vol:

vol fs0
Volume  (rw)
52307968 bytes total disk space
51177472 bytes available on disk
2048 bytes in each allocation unit

Для перехода в раздел используется команда вида: метка раздела и двоеточие. Например:

fs0:  
ls \EFI

По умолчанию поддерживаются только fat32, однако есть возможность подгрузить DXE драйвер для работы с другими файловыми системами.

# загрузка драйвера ntfs_x64.efi
load ntfs_x64.efi
# переинициализация дисков
map -r

Драйвер останется загруженным до первой перезагрузки компьютера. В следующем разделе рассмотрим способ сохранения загрузочной конфигурации.

Для обработки вывода команд (правда, только в формате Standart Form Output, то есть с ключом -sfo) применяется команда parse. Например можно получить имена файлов в текущей директории:

ls -sfo | parse FileInfo 2

Управление загрузкой

Для настройки загрузочных опций применяется команда bcfg. Добавление загрузочной опции (memtest):

bcfg boot add 3 FS0:\EFI\memtest64.efi "Memtest Boot Option"

bcfg также позволяет добавить драйвер в автозагрузку:

# копируем драйвер ntfs_x64.efi в системный EFI-раздел
cp ntfs_x64.efi FS0:\EFI\Boot
# добавление загрузочной записи для драйвера ntfs_x64.efi
bcfg driver add 0 FS0:\EFI\Boot\ntfs_x64.efi "NTFS Driver"

Информация о системе

Для получения информации о системе используются команды: smbiosview (аналог dmidecode) и devices (список подключенных устройств).

smbiosview -t 17
=========================================================
Type=17, Handle=0x1100
Dump Structure as:
Index=4,Length=0x35,Addr=0x1F9190DE
00000000: 11 28 00 11 00 10 FE FF-FF FF FF FF 00 02 09 00  *.(..............*
00000010: 01 00 07 02 00 00 00 02-00 00 00 00 00 00 00 00  *................*
00000020: 00 00 00 00 00 00 00 00-44 49 4D 4D 20 30 00 51  *........DIMM 0.Q*
00000030: 45 4D 55 00 00                                   *EMU..*
Structure Type: Memory Device 
Format part Len : 40
Structure Handle: 4352
MemoryArrayHandle: 0x1000
MemoryErrorInformationHandle: 0xFFFE
TotalWidth: 0xFFFF
DataWidth: 0xFFFF
Size: 512
Memory Device - Form Factor:   DIMM
DeviceSet: 0x0
DeviceLocator: DIMM 0
BankLocator: 
Memory Device - Type:   RAM
Memory Device - Type Detail:  Other
Speed: 0x0
Manufacturer: QEMU

Управление переменными

Команда dmpstore позволяет управлять (читать, удалять) переменные NVRAM:

dmpstore -all -s VarDump.txt

Для изменения переменных удобнее использовать утилиту setvar. Пример для переключения языка в меню Setup:

dmpstore PlatformLang
Variable NV+RT+BS 'EFIGlobalVariable:PlatformLang' DataSize = 0x03
 00000000: 65 6E 00                                         *en.*
setvar PlatfromLanh =667200
Variable NV+RT+BS 'EFIGlobalVariable:PlatformLang' DataSize = 0x03
 00000000: 66 72 00                                         *fr.*

Скрипты nsh

Система скриптов nsh довольно гибкая и предоставляет неплохие возможности для повышения читаемости и надежности создаваемых скриптов. Например, можно назначить псевдоним команде:

set -v MemInfo "smbiosview -t 17"
%MemInfo%
=========================================================
Type=17, Handle=0x1100
Dump Structure as:
Index=4,Length=0x35,Addr=0x1F9190DE
00000000: 11 28 00 11 00 10 FE FF-FF FF FF FF 00 02 09 00  *.(..............*
00000010: 01 00 07 02 00 00 00 02-00 00 00 00 00 00 00 00  *................*
00000020: 00 00 00 00 00 00 00 00-44 49 4D 4D 20 30 00 51  *........DIMM 0.Q*
00000030: 45 4D 55 00 00                                   *EMU..*

Exit Code последней команды сохраняется в переменной lasterror:

smbiosview -hahaha
echo %lasterror%
0xE

Есть возможность многократного исполнения блока кода без его дублирования с помощью goto:

set -v HTTP "http.efi -s 192.168.1.100"

# Скачиваем прошивку
echo "Downloading BIOS update..."
%HTTP% /bios_update.fd
if %lasterror% ne 0 then
 echo "Error: Download failed! (Code: %lasterror%)"
 goto EXIT
endif

echo "Flashing BIOS..."
%FWUPDATE% bios_update.fd
if %lasterror% ne 0 then
 echo "Error: Update failed! (Code: %lasterror%)"
 goto EXIT
endif

:EXIT
echo "Script terminated"

Таким образом, UEFI Shell — это гораздо больше, чем просто загрузочная оболочка с текстовым интерфейсом. Это мощный инструмент для низкоуровневой диагностики, отладки и управления системой, который может стать настоящей палочкой-выручалочкой для энтузиастов и системных администраторов. Мы лишь приоткрыли дверь в мир его возможностей, рассмотрев базовые сценарии использования.

Спасибо за прочтение! Будем рады, если поделитесь своим опытом использования этого замечательного инструмента в комментариях.

Комментарии (2)


  1. maisvendoo
    23.10.2025 13:41

    Таким образом, UEFI Shell — это гораздо больше, чем просто загрузочная оболочка

    Так то это полноценная операционная система. В целом uefi


    1. 13werwolf13
      23.10.2025 13:41

      лет 5 назад читал статью описывающая особенности uefi на macbook, насколько я помню суть статьи сводилась к тому что в маках uefi запускает большое кол-во приложений некоторые из которых продолжают работать парралельно с ОС хотя в ОС конечно не видны и в том что цели некоторых из этих приложений неясны.
      увы насколько я помню статья была удалена через пару дней, уж не знаю по какой причине. к сожалению на тот момент у меня уже не было мака для фактчекинга.

      сейчас можно нагуглить что некоторые из них выполняют роль секуребута, некоторые нужны для работы touchid и разшифровки загрузчика. последние как раз продолжают работать парралельно с ос.