Почему мой ISO-образ пользовательской сборки не загружается в EFI?

Почему мой ISO-образ пользовательской сборки не загружается в EFI?

Я создаю пользовательский iso с помощью xorriso в режиме mkisofs. Сборка кажется правильной, последующая проверка iso показывает 2 загрузочных образа (1 BIOS, 2 UEFI), но загрузка в ISO из qemu с использованием прошивки OVMF не находит никаких загрузочных носителей.

Если я попробую выполнить ту же самую загрузку в QEMU, но используя чистый загруженный образ сервера Ubuntu 16.04, то он загрузится без проблем.

Если я использую BIOS (не UEFI), обе системы загружаются нормально.

команда xorriso:

xorriso -as mkisofs \
   -l -J -R -V version \
   -no-emul-boot -boot-load-size 4 -boot-info-table \
   -b boot/isolinux/isolinux.bin -c boot/isolinux/boot.cat \
   -isohybrid-mbr isohhdpfx.bin \
   -eltorito-alt-boot -e EFI/BOOT/BOOTX64.EFI -no-emul-boot \
   -isohybrid-gpt-basdat \
   -o testos.iso ./cddir/

Подробности проверки двух iso (Ubuntu и моего собственного образа) с помощью xorriso -report_el_torito plainи cmdприведены в следующем gisthttps://gist.github.com/deitch/e069268f92402d6a2b1c7e060ddba622

решение1

Спасибо за полет xorriso.

Проблема в файле образа, который вы позволяете xorriso пометить как EFI System Partition. Предполагается, что это образ файловой системы FAT, содержащий двоичный файл с именем /EFI/BOOT/BOOTX64.EFI(или ... /BOOTIA32.EFIдля 32-битной x86) и, возможно, другие файлы. Смонтируйте файл /boot/grub/efi.img из Ubuntu ISO, чтобы узнать о его содержимом.

Файловые системы FAT, используемые Ubuntu и другими, вероятно, созданы программой GRUB2 grub-mkimage. Программное обеспечение ISOLINUX/SYSLINUX EFI не может быть использовано, поскольку оно выдает ошибку при обнаружении устройства CD-ROM.

Довольно удобный способ получить загрузочный ISO — программа grub-mkrescue. Если GRUB2 настроен для BIOS и EFI (например, путем установки бинарных пакетов grub-pc, grub-efi-amd64, и grub-efi-ia32), то grub-mkrescue будет создан ISO, который загружается в BIOS и EFI 32- и 64-разрядных машин x86: загрузочные образы El Torito для BIOS и EFI, образ EFI с BOOTX64.EFIи BOOTIA32.EFI, MBR для BIOS с жесткого диска, GPT для EFI с жесткого диска.

решение2

Очень простой способ сделать это:

Добавьте efi.img(из ISO-образа Ubuntu в boot/grub/efi.img) к вашему ISO-образу, и он будет загружаться в любой системе.

cat efi.img >> youriso.iso

После этого ваш ISO-образ будет работать и как CD-ROM, и как USB-флешка. :D

решение3

Я, конечно, не так много знаю о xorriso, как Томас Шмитт, но я использую следующее для создания ISO-образа, поддерживающего только EFI.

xorriso -as mkisofs \
    -V 'deb10.5.0 preseed amd64 efi' \
    -e boot/grub/efi.img \
    -no-emul-boot \
    -o $ISO_NEW $DIR_EXTRACT

Где $ISO_NEW — имя выходного ISO-образа, а $DIR_EXTRACT — это взломанный образ xorriso ... -extract / $DIR_EXTRACT, в данном случае из релиза Debian 10.

Почти все примеры, которые я видел, используют гибридный MBR/EFI, который более гибок, но также усложняет шаги загрузчика. ЭтоТОЛЬКОEFI с использованием образа VFAT в формате efi.img. Я использую сгенерированный ISO-образ в сочетании с загрузчиком OVMF для запуска пользовательского предварительно настроенного установщика Debian с целью создания $DISKобраза, который я использую для кодирования QEMU.

Запустите установку, чтобы создать диск qcow2:

   MACHOVMF="-machine q35,firmware=/usr/share/ovmf/OVMF.fd"
   $Q_P -m 4096 $MACHOVMF -hda $DISK -cdrom $ISO_NEW -vga std -monitor stdio

Настройте и проведите регрессионное тестирование ДИСКА через SSH.

   NET_Q35="-nic user,hostfwd=tcp::10022-:22"
   $Q_P -m 4096 $MACHOVMF -hda $DISK $NET_Q35 -vga std -monitor stdio

Для разработки я запускаю QEMU под GDB, используя похожую командную строку, но с большим количеством процессоров и безголовым интерфейсом -nographic-Sдля настройки загружаю исходные файлы GDB и т. д. перед cpu_exec.)

И, наконец, вот как выглядит установленный $DISK внутри VM. Обратите внимание на системный раздел EFI (ESP) в /boot/efi:

q35efi-2:17> df
Filesystem     1K-blocks    Used Available Use% Mounted on
udev             2004028       0   2004028   0% /dev
tmpfs             403768    5420    398348   2% /run
/dev/vda2        3546736 1515520   1831336  46% /
tmpfs            2018840       0   2018840   0% /dev/shm
tmpfs               5120       0      5120   0% /run/lock
tmpfs            2018840       0   2018840   0% /sys/fs/cgroup
/dev/vda1         523248    5228    518020   1% /boot/efi
tmpfs             403768       0    403768   0% /run/user/1000
q35efi-2:18> blkid
/dev/vda1: UUID="DB4A-1458" TYPE="vfat" PARTUUID="7bac2a49-d394-444f-b4f7-7c822b842023"
/dev/vda2: UUID="caada636-4214-4c13-98eb-74367c1c380c" TYPE="ext4" PARTUUID="40d7e26a-1273-4af7-beb9-3ca3647a0dc5"
/dev/vda3: UUID="6d427317-3434-4425-a057-a987e847f0d2" TYPE="swap" PARTUUID="4d44decf-5237-4e81-8892-77e5e9e97a70"
q35efi-2:19> efibootmgr -v
BootCurrent: 0006
Timeout: 0 seconds
BootOrder: 0006,0000,0001,0003,0004,0005,0002
Boot0000* UiApp FvVol(7cb8bdc9-f8eb-4f34-aaea-3ee4af6516a1)/FvFile(462caa21-7614-4503-836e-8ab6f4662331)
Boot0001* UEFI QEMU DVD-ROM QM00005     PciRoot(0x0)/Pci(0x1f,0x2)/Sata(2,65535,0)N.....YM....R,Y.
Boot0002* UEFI Misc Device  PciRoot(0x0)/Pci(0x3,0x0)N.....YM....R,Y.
Boot0003* UEFI PXEv4 (MAC:525400123456) PciRoot(0x0)/Pci(0x2,0x0)/MAC(525400123456,1)N.....YM....R,Y.
Boot0004* UEFI HTTPv4 (MAC:525400123456)    PciRoot(0x0)/Pci(0x2,0x0)/MAC(525400123456,1)/IPv4(0.0.0.00.0.0.0,0,0)/Uri()N.....YM....R,Y.
Boot0005* EFI Internal Shell    FvVol(7cb8bdc9-f8eb-4f34-aaea-3ee4af6516a1)/FvFile(7c04a583-9e3e-4f1c-ad65-e05268d0b4d1)
Boot0006* debian    HD(1,GPT,7bac2a49-d394-444f-b4f7-7c822b842023,0x800,0x100000)/File(\EFI\debian\shimx64.efi)
q35efi-2:20> 

Связанный контент