カスタムビルド ISO が EFI で起動できないのはなぜですか?

カスタムビルド ISO が EFI で起動できないのはなぜですか?

私は、mkisofs モードで xorriso を使用してカスタム ISO を構築しています。ビルドは正しいようですが、その後 ISO を検査すると 2 つのブート イメージ (1 つは BIOS、2 つは UEFI) が表示されますが、OVMF ファームウェアを使用して qemu から ISO を起動すると、起動可能なメディアが見つかりません。

クリーンにダウンロードした Ubuntu 16.04 サーバー ISO を使用して、qemu でまったく同じブートを試行すると、問題なく起動します。

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/

2つのISO(Ubuntuと私がカスタムビルドしたもの)を調べた詳細はxorriso -report_el_torito plaincmd次のgistにあります。https://gist.github.com/deitch/e069268f92402d6a2b1c7e060ddba622

答え1

ご搭乗ありがとうございましたxorriso

問題は、xorriso で EFI システム パーティションとしてマークしたイメージ ファイルにあります。これは、/EFI/BOOT/BOOTX64.EFI(または/BOOTIA32.EFI32 ビット x86 の場合は ...) という名前のバイナリ ファイルと、おそらく他のファイルを含む FAT ファイルシステム イメージであるはずです。Ubuntu ISO から /boot/grub/efi.img ファイルをマウントして、その内容を確認してください。

Ubuntu などで使用されている FAT ファイルシステムは、おそらく GRUB2 プログラム grub-mkimage によって生成されています。ISOLINUX/SYSLINUX EFI ソフトウェアは、CD-ROM デバイスを検出すると失敗するため、使用できません。

起動可能な ISO を取得する非常に便利な方法は、プログラムを使用することですgrub-mkrescue。GRUB2 が BIOS および EFI 用に構成されている場合 (たとえば、バイナリ パッケージgrub-pc、、grub-efi-amd64およびをインストールすることによってgrub-efi-ia32)、grub-mkrescue は 32 ビットおよび 64 ビット x86 マシンの BIOS および EFI で起動する ISO を生成します。BIOS および EFI 用の El Torito ブート イメージ、および を持つ EFI イメージ、 BOOTX64.EFIハードディスクBOOTIA32.EFIからの BIOS 用の MBR、ハードディスクからの EFI 用の GPT です。

答え2

非常に簡単な方法は次のとおりです。

efi.img(boot/grub/efi.img の ubuntu ISO から) を ISO に追加すると、すべてのシステムで起動するようになります。

cat efi.img >> youriso.iso

その後、ISO は CD-ROM としても 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

ここで、$ISO_NEW は出力 ISO の名前であり、$DIR_EXTRACT はxorriso ... -extract / $DIR_EXTRACT、この場合は Debian 10 リリースからハックされたものです。

私が見たほとんどの例では、ハイブリッドMBR/EFIが使用されており、これはより柔軟ですが、ブートローダーの手順も複雑になります。これはのみEFI、の VFAT イメージを使用しますefi.img。生成された ISO を OVMF ブートローダーと組み合わせて、カスタムの事前シード済み Debian インストーラーを実行し、$DISKQEMU コーディングに使用するイメージを作成します。

インストールを実行して 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)。

最後に、VM 内にインストールされた $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> 

関連情報