為什麼我的自訂建置 iso 無法在 EFI 中啟動?

為什麼我的自訂建置 iso 無法在 EFI 中啟動?

我正在 mkisofs 模式下使用 xorriso 建立自訂 iso。建置似乎是正確的,隨後檢查 iso 顯示 2 個啟動映像(1 個 BIOS、2 個 UEFI),但使用 OVMF 韌體從 qemu 啟動到 ISO 時無法找到任何可啟動媒體。

如果我在 qemu 中嘗試完全相同的啟動,但使用乾淨下載的 ubuntu 16.04 伺服器 iso,則啟動不會出現問題。

如果我使用 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/

xorriso -report_el_torito plain使用和檢查 2 個 iso(ubuntu 和我定制的一個)的詳細資訊cmd如下:https://gist.github.com/deitch/e069268f92402d6a2b1c7e060ddba622

答案1

謝謝你飛翔xorriso

問題出在您讓 xorriso 標記為 EFI 系統分割區的映像檔。它應該是一個 FAT 檔案系統映像,其中包含一個名為/EFI/BOOT/BOOTX64.EFI(或 .../BOOTIA32.EFI對於 32 位元 x86)的二進位檔案以及可能的其他檔案。從 Ubuntu ISO 掛載檔案 /boot/grub/efi.img 以了解其內容。

Ubuntu 和其他作業系統使用的 FAT 檔案系統可能是由 GRUB2 程式 grub-mkimage 產生的。 ISOLINUX/SYSLINUX EFI 軟體無法使用,因為它在看到 CD-ROM 裝置時會跳出。

取得可啟動 ISO 的一個非常方便的方法是程式設計grub-mkrescue。如果 GRUB2 配置為 BIOS 和 EFI(例如,透過安裝二進位套件grub-pcgrub-efi-amd64grub-efi-ia32),那麼grub-mkrescue 將產生一個在32 位元和64 位元x86 機器的BIOS 和EFI 上啟動的ISO: 用於BIOS 和EFI 的El Torito 啟動映像, EFI 映像具有 BOOTX64.EFI以及BOOTIA32.EFI,MBR 用於硬碟中的 BIOS,GPT 用於硬碟中的 EFI。

答案2

一個非常簡單的方法是:

將(來自 boot/grub/efi.img 處的 ubuntu ISO)附加efi.img到您的 ISO,它將在每個系統中啟動。

cat efi.img >> youriso.iso

之後,您的 ISO 將同時作為 CDROM 和 USB 隨身碟使用。 :D

答案3

我當然不像 Thomas Schmitt 那樣了解 xorriso,但我使用以下內容來創建僅 EFI 的 ISO。

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

xorriso ... -extract / $DIR_EXTRACT其中 $ISO_NEW 是輸出 ISO 的名稱,$DIR_EXTRACT 是從本例中的 Debian 10 版本破解的。

我見過的幾乎所有範例都使用混合 MBR/EFI,這更靈活,但也使引導程式步驟變得複雜。這是僅有的EFI,使用efi.img.我使用生成的 ISO 以及 OVMF 引導程式來運行自訂預設 debian 安裝程序,以建立$DISK用於 QEMU 編碼的映像。

運行 install 建立 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 配置和回歸測試 DISK。

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

對於開發,我使用類似的命令列在 gdb 下運行 QEMU,但具有更多 CPU 和無頭-nographic(並-S在之前設定、載入 gdb 原始檔等cpu_exec。)

最後,這是虛擬機器內安裝的 $DISK 的樣子。請注意 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> 

相關內容