Ошибка Exec format error или чёрный экран сразу после строки boot — самый частый симптом при попытке загрузить ISO через iPXE напрямую командой chain: ядро iPXE не умеет исполнять ISO-образ как загрузочный файл, и без промежуточного загрузчика процесс обрывается. Причина почти всегда одна — выбран неправильный метод передачи образа, а не «битый» ISO или сбой сети.
iPXE — это расширенная среда сетевой загрузки, которая поддерживает HTTP, позволяет писать гибкие скрипты и собирать интерактивные меню. Но у неё есть принципиальное ограничение: iPXE не монтирует ISO как виртуальный привод, поэтому «просто отдать ISO по HTTP» недостаточно. Ниже разберём рабочие способы загрузки ISO-образов, их ограничения и типичные ошибки.
Почему нельзя просто загрузить ISO напрямую
ISO-образ — это файловая система диска, а не исполняемый загрузочный код в том виде, в котором его ожидает iPXE. Когда вы пишете chain http://server/image.iso, iPXE скачивает файл и пытается передать ему управление, но не находит корректного загрузочного заголовка. Результат — ошибка формата или зависание.
Есть три рабочих подхода, которые обходят это ограничение:
- 💿 memdisk — загрузка образа целиком в оперативную память и эмуляция диска;
- 🧩 wimboot — извлечение загрузочных файлов из Windows-образа и старт без полного ISO;
- 📦 kernel + initrd — распаковка ISO и загрузка ядра Linux напрямую с параметрами.
Выбор метода зависит от того, что за образ вы загружаете: установщик Windows, Live-дистрибутив Linux или утилиту вроде memtest. Универсального решения нет, и это нужно принять как данность.
Способ 1: загрузка ISO через memdisk
Модуль memdisk из пакета Syslinux загружает образ целиком в RAM и эмулирует его как диск для BIOS. Это самый «честный» способ — содержимое ISO не распаковывается, а работает как виртуальный привод.
#!ipxe
kernel http://192.168.1.10/boot/memdisk iso raw
initrd http://192.168.1.10/iso/rescue.iso
boot
Ключевой момент — параметр raw: он отключает лишнюю обработку образа и снижает число проблем с совместимостью. Учтите, что memdisk работает только в режиме legacy BIOS — в чистом UEFI он не функционирует. Это аппаратно-программное ограничение самого механизма, обойти его настройками нельзя.
⚠️ Внимание: образ загружается в оперативную память целиком. Если ISO весит 4 ГБ, а на машине 4 ГБ RAM, загрузка либо не начнётся, либо система упадёт на этапе инициализации. Для больших образов используйте другие методы.
Способ 2: распаковка ISO и загрузка ядра напрямую
Для Linux-дистрибутивов правильный путь — извлечь из ISO ядро (vmlinuz) и initramfs (initrd.img) и загрузить их с параметрами, указывающими, где искать остальные файлы. Пути к этим файлам различаются между дистрибутивами, поэтому сверяйтесь со структурой конкретного образа.
#!ipxe
kernel http://192.168.1.10/ubuntu/casper/vmlinuz boot=casper netboot=url url=http://192.168.1.10/iso/ubuntu.iso
initrd http://192.168.1.10/ubuntu/casper/initrd
boot
Параметр url= в примере — механизм, при котором ядро после старта само скачивает ISO по HTTP и монтирует его. Он поддерживается не всеми дистрибутивами: в одних используется fetch=, в других — iso-scan/filename= или NFS-путь. Точный синтаксис берите из документации конкретного дистрибутива — универсальной команды здесь не существует.
☑️ Проверка перед загрузкой Linux-ISO
Способ 3: загрузка Windows-образов через wimboot
Для установочных ISO Windows прямой метод не работает вовсе — вместо него применяется wimboot: небольшой загрузчик, который стартует среду Windows PE из файлов boot.wim, boot.sdi и связанных компонентов, извлечённых из ISO.
#!ipxe
kernel http://192.168.1.10/wimboot
initrd http://192.168.1.10/win/boot/bcd BCD
initrd http://192.168.1.10/win/boot/boot.sdi boot.sdi
initrd http://192.168.1.10/win/sources/boot.wim boot.wim
boot
После старта Windows PE установщику нужен доступ к остальным файлам образа — обычно ISO подключают по сети (SMB-шара) скриптом, который запускается внутри WinPE. Это самый трудоёмкий в настройке, но единственный надёжный сценарий для установки Windows по сети без полной инфраструктуры WDS.
Сравнение методов загрузки
| Метод | Тип образа | UEFI | Ограничение по RAM |
|---|---|---|---|
| memdisk | Мелкие утилиты, legacy-образы | Нет | Весь ISO в память |
| kernel + initrd | Linux Live/установщики | Да | Нет (образ по сети) |
| wimboot | Windows PE / установка | Да | Только boot.wim в память |
| sanboot (iSCSI/AoE) | Диски целиком | Да | Нет |
Отдельно упомянем sanboot: он подключает блочное устройство (iSCSI-таргет) и грузится с него как с локального диска. Это не загрузка ISO в чистом виде, но для сценариев «загрузить готовую систему по сети» часто удобнее всех остальных вариантов.
Настройка HTTP-сервера и скриптов iPXE
iPXE лучше всего работает с HTTP: скорость выше TFTP, есть поддержка больших файлов. Подойдёт любой веб-сервер — nginx, Apache, даже встроенный сервер Python для тестов. Главное требование — файлы должны отдаваться напрямую, без редиректов на страницы с авторизацией.
Типичная структура меню iPXE выглядит так:
#!ipxe
menu Сетевые образы
item rescue Rescue-диск (memdisk)
item ubuntu Ubuntu Live
item winpe Установка Windows
choose target && goto ${target}
:rescue
kernel http://192.168.1.10/boot/memdisk iso raw
initrd http://192.168.1.10/iso/rescue.iso
boot
⚠️ Внимание: HTTP-серверы чувствительны к регистру символов в путях (особенно на Linux). Ошибка No such file or directory при визуально «правильном» пути почти всегда означает несовпадение регистра или лишний пробел в скрипте.
Как встроить скрипт прямо в iPXE
Скрипт можно вкомпилировать в бинарник iPXE при сборке командой make с параметром EMBED=script.ipxe. Тогда загрузчик сразу выполнит ваш сценарий без обращения к внешнему файлу — удобно для цепочки chainloading с PXE.
Типичные ошибки и их диагностика
Большинство проблем при загрузке ISO через iPXE сводится к короткому списку причин. Проверяйте их по порядку:
- 🔴
Exec format error— попытка загрузить ISO напрямую без memdisk/wimboot; - 🌐
Connection timed out— HTTP-сервер недоступен, проверьте IP и файрвол; - 📄
No such file or directory— неверный путь или регистр символов; - 💾 Зависание после boot — образ не поместился в RAM (memdisk) или неверные параметры ядра;
- 🖥️ Чёрный экран в UEFI — использован memdisk, который UEFI не поддерживает.
Для отладки добавьте в скрипт команду imgstat перед boot — она покажет, какие файлы реально загружены в память и их размеры. Если список пуст или размеры нулевые, проблема на этапе скачивания, а не исполнения.
FAQ: частые вопросы о загрузке ISO через iPXE
Можно ли загрузить любой ISO через iPXE без распаковки?
Нет. Только через memdisk, и только в режиме legacy BIOS, и только если образ помещается в оперативную память. Для UEFI и больших образов ISO нужно распаковывать и загружать ядро напрямую или использовать wimboot.
Почему memdisk не работает на современном компьютере?
Наиболее вероятная причина — машина загружена в режиме UEFI. Memdisk опирается на механизмы BIOS и в UEFI не функционирует. Проверьте режим загрузки и переключитесь на kernel+initrd или wimboot.
Как загрузить установочный ISO Windows по сети?
Прямая загрузка ISO невозможна. Используйте wimboot: извлеките из образа файлы BCD, boot.sdi и boot.wim, загрузите их через iPXE, а доступ к полному ISO организуйте по SMB из среды Windows PE.
Что быстрее: TFTP или HTTP для iPXE?
HTTP заметно быстрее и надёжнее для больших файлов, плюс поддерживает стандартные веб-серверы. TFTP обычно нужен только на первом этапе — чтобы отдать сам загрузчик iPXE от DHCP/PXE-инфраструктуры.
Ошибка Exec format error — что делать?
Эта ошибка означает, что iPXE получил файл, который не является загрузочным образом понятного ему формата. Проверьте, не пытаетесь ли вы загрузить ISO напрямую через chain — замените схему на memdisk, wimboot или kernel+initrd.