В интернете огромное количество примеров создания гибридных iso которые загружаются как в режиме efi так и mbr. НО практически все эти примеры используют в своем составе isolinux для загрузки в mbr режиме и grub2 (или другой) в качестве загрузчика mbr.
Основная сложность создания гибридного образа, это сложность команды для программы создания дисков. Наиболее функциональной программой является xorriso. Задача: создать гибридный загрузочный iso, способный загружаться в режимах efi и mbr, а также если его записать на флешку используя dd, флешка также должна стать загрузочной в режимах efi и mbr.
Полученная команда выполняется из каталога в котором находится содержимое образа, команда выглядит так:
xorriso -as mkisofs -allow-lowercase -J -D -R -A "$CDLABEL" -V "$CDLABEL" \
-no-emul-boot -boot-load-size 4 -hide boot.catalog -boot-info-table \
-b grub2.eltorito --grub2-mbr /usr/lib/grub/i386-pc/boot_hybrid.img \
-boot-info-table --grub2-boot-info grub2.eltorito \
-append_partition 2 0xef /usr/lib/grub/efi.img \
-eltorito-alt-boot --efi-boot EFI/BOOT/bootx64.efi \
-no-emul-boot \
-o test.iso .
Более новый и универсальный вариант, с поддержкой efi загрузки на qemu:
xorriso -as mkisofs -allow-lowercase -J -D -R -A "$CDLABEL" -V "$CDLABEL" \
-no-emul-boot -boot-load-size full --boot-catalog-hide -boot-info-table -partition_offset LBA \
-b grub2.eltorito --grub2-boot-info --grub2-mbr /usr/lib/grub/i386-pc/boot_hybrid.img \
--mbr-force-bootable --efi-boot EFI/BOOT/bootx64.efi \
-isohybrid-gpt-basdat --protective-msdos-label \
-append_partition' 2 0xef /usr/lib/grub/efi.img -appended_part_as_gpt -no-pad \
-o test.iso .
$CDLABEL - т.к. я взял команду из скрипта, эта переменная задает метку диска. Желательно для совместимости метку задавать в ВЕРХНЕМ регистре.
-b grub2.eltorito - файл загрузчика в формате eltorito внутри образа, в данном случае файл находится в корне образа.
--grub2-mbr /usr/lib/grub/i386-pc/boot_hybrid.img - путь к образу mbr из состава grub2 (тоже самое по сути делает -isohybrid-mbr). Этот образ только заготовка.
--grub2-boot-info grub2.eltorito - этот параметр практически не описан в документации, во всех примерах нигде не используется то, что
параметр имеет значение! это значение задает имя загрузчика которое будет прописываться в загрузочную запись. В данном случае grub2.eltorito.
grub2.eltorito представляет из себя загрузчик сделанный grub-mkimage, образец команды следующий:
grub-mkimage --directory=/usr/lib/grub/i386-pc --compression=auto \
--config=/usr/share/grub/grub.cfg --verbose --prefix=/EFI/BOOT \
--output=grub2.eltorito --format=i386-pc-eltorito \
part_msdos biosdisk disk fat iso9660 test vbe vga normal gzio xzio search configfile linux linux16 chain loopback echo file halt reboot ls true gfxterm gettext font
-eltorito-alt-boot --efi-boot EFI/BOOT/bootx64.efi - делает iso загружаемым через EFI. bootx64.efi находится внутри iso, рядом с ним я поместил файл конфигурации, локализации, шрифта.
На этом этапе получается iso способный загружаться как CD диск в режимах iso и mbr, а также если записать его на флешку, то флешка будет грузится через mbr, в системе она будет видна как /dev/sdb и монтироваться как iso9660. В принципе этого достаточно для загрузки, добавление файлов на флешку я не пробовал.