Всё чаще и чаще в мне руки попадают устройства без режима совместимости с BIOS (он же CSM). Ранее я уже делал заметку относительно организации PXE загрузки по сети на Mikrotik, сегодня же я хочу рассказать о том, как сделать загрузку гибридной — не только для систем на базе BIOS, но и для UEFI без CSM. Те читатели, кто уже успел поработать с UEFI, наверняка знают о принципе загрузки по умолчанию — если заранее не создавались пункты загрузочного меню, то UEFI будет пытаться найти загрузчик по следующему пути:
/EFI/Boot/bootx64.efi
Как это работает на практике: если скачать, например, EFI-версию утилиты Memtest86+ и переименовать извлеченный из архива бинарник mt86p_800_x86_64 в bootx64.efi, а затем расположить его по вышеуказанному пути, то система на базе UEFI самостоятельно его загрузит после включения. Общий концепт, надеюсь, понятен. Теперь же давайте откроем WinBox.
В первую очередь нужно загрузить EFI-бинарник в Mikrotik. Для визуального удобства я переименовываю mt86p_800_x86_64 в memtest86.efi, после чего через раздел Files загружаю его на USB-флешку в роутере. Далее переходим в раздел IP->TFTP и добавляем следующую запись:
IP Addresses: <ваша сеть>
Req. Filename: /EFI/Boot/bootx64.efi
Real Filename: usb1-part1/memtest86.efi
Allow: True
Read Only: True
С этим разобрались, теперь тонкий момент — нужно настроить DHCP сервер таким образом, чтобы при запросе загрузчика UEFI-клиенту выдавался наш правильный бинарник, а во всех остальных случаях считаем, что имеем дело с клиентом на базе BIOS. Переходим в раздел IP->DHCP Server, после чего смещаемся на вкладку Options и создаём новую опцию:
Name: pxe-uefi
Code: 67
Value: '/EFI/Boot/bootx64.efi'
Если с первым и третьим параметром всё очевидно, то второй для многих требует пояснения — что это за код такой? В DCHP сетевые опции указываются кодами, например код 1 отвечает за маску подсети, а код 51 — время аренды IP адреса в секундах. В нашем же случае код 67 отвечает за имя загрузочного файла, с полным списком кодов сетевых опций DHCP можно ознакомится в этой статье. Возвращаемся в WinBox, переходим на вкладку Option Sets и создаём новую запись:
Name: set-uefi
Options: pxe-uefi
И, наконец, идём на вкладку Option Matcher, создаём 2 записи:
Name: match-uefi
Server: <ваш DHCP сервер>
Address Pool: <ваш пул адресов>
Option Set: set-uefi
Code: 93
Value: 0x0007
Matching Type: exact
и почти такую же, но с небольшим отличием:
Name: match-uefi-alt
Server: <ваш DHCP сервер>
Address Pool: <ваш пул адресов>
Option Set: set-uefi
Code: 93
Value: 0x0009
Matching Type: exact
Опция с кодом 93 указывает на то, какой PXE-клиент обращается к DHCP серверу — на базе BIOS или UEFI. В случае с BIOS клиент передаёт значение 0x0000, а в случае с UEFI x86-64 значение будет 0x0007. Значение 0x0009 может соответствовать UEFI arm-64, а может и не соответствовать — тут всё зависит от производителя конкретной железки. Для UEFI x86-32 можете использовать значение 0x0006, но лично ко мне в руки такие системы не попадали. Допускаю, что они встречались в совсем небольшой период времени, когда материнки с UEFI только-только начали появляться на рынке.
Какая в итоге получается схема? Предположим, по умолчанию DHCP сервер предлагает загрузить grldr — и в случае с PXE-клиентом на базе BIOS (который передал значение 0x0000 по коду 93) всё пройдёт нормально, мы увидим меню grub4dos. Теперь представим, что к DHCP серверу обращается PXE-клиент на базе UEFI, он передаёт значение 0x0007 по коду 93 — Mikrotik проверяет соответствие опции и видит, что для значения 0x0007 нужно использовать набор опций set-uefi. Что происходит дальше? В набор опций set-uefi входит одна-единственная опция — pxe-uefi. Что делает опция pxe-uefi? Она говорит о том, что опции 67-го кода должно соответствовать значение '/EFI/Boot/bootx64.efi' — именно это имя файла и будет предложено для PXE загрузки нашему клиенту. Если всё сделано правильно, то вы увидите работающую утилиту Memtest86+ (и заодно можете прогнать тест оперативной памяти).
