为什么带有自定义 iso 的 USB 无法启动 UEFI?

为什么带有自定义 iso 的 USB 无法启动 UEFI?

我正在尝试制作一个基于 Ubuntu 18.04 的 iso,它可以在 Bios 和 UEFI 模式下启动。我让它在 Bios 模式下启动,但在 UEFI 模式下启动时遇到问题。当我将其刻录到 U 盘时,我会在 ISO9660 USB 中获得一个 UEFI 分区。当我尝试以 UEFI 模式启动它时,我收到 grub 提示符。

fdisk -l 的结果

larry@larry-Satellite-C55-A:~/foxclone$ fdisk -l foxclone025-02.iso
Disk foxclone025-02.iso: 660 MiB, 692060160 bytes, 1351680 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x45d15306

Device              Boot Start     End Sectors  Size Id Type
foxclone025-02.iso1 *        0 1351679 1351680  660M  0 Empty
foxclone025-02.iso2        276    5203    4928  2.4M ef EFI (FAT-12/16/32)

创建EFI分区的方法是:

#! /bin/sh

BOOT_IMG_DATA=$($HOME/foxclone/newiso -d)
BOOT_IMG=efi.img

mkdir -p $(dirname $BOOT_IMG)

truncate -s 4M $BOOT_IMG
mkfs.vfat $BOOT_IMG
mkdir -p $BOOT_IMG_DATA/efi/boot

grub-mkimage \
    -C xz \
    -O x86_64-efi \
    -p /boot/grub \
    -o $BOOT_IMG_DATA/efi/boot/bootx64.efi \
    boot linux search normal configfile \
    part_gpt btrfs fat iso9660 loopback \
    test keystatus gfxmenu regexp probe \
    efi_gop efi_uga all_video gfxterm font \
    echo read ls cat png jpeg halt reboot

mcopy -i $BOOT_IMG -s $BOOT_IMG_DATA/efi ::

构建iso的方法是:

#!/bin/bash

orig_iso="$HOME"/foxclone/foxclone025-01.iso
new_iso="$HOME"/foxclone/foxclone025-02.iso
new_files=$HOME/foxclone/newiso
mbr_template=isohdpfx.bin

xorriso -as mkisofs \
    -r -V 'Foxclone' \
    -o "$new_iso" \
    -J -J -joliet-long -cache-inodes \
    -isohybrid-mbr /usr/lib/ISOLINUX/isohdpfx.bin \
    -b isolinux/isolinux.bin \
    -c isolinux/boot.cat \
    -boot-load-size 4 -boot-info-table -no-emul-boot \
    -eltorito-alt-boot \
    -e --interval:appended_partition_2:all:: \
    -append_partition 2 0xef efi.img \
    -no-emul-boot -isohybrid-gpt-basdat \
    "$new_files"

转储结果

larry@larry-Satellite-C55-A:~/foxclone$ dumpet -i foxclone025-02.iso
Validation Entry:
    Header Indicator: 0x01 (Validation Entry)
    PlatformId: 0x00 (80x86)
    ID: ""
    Checksum: 0x55aa
    Key bytes: 0x55aa
Boot Catalog Default Entry:
    Entry is bootable
    Boot Media emulation type: no emulation
    Media load segment: 0x0 (0000:7c00)
    System type: 0 (0x00)
    Load Sectors: 4 (0x0004)
    Load LBA: 38 (0x00000026)
Section Header Entry:
    Header Indicator: 0x91 (Final Section Header Entry)
    PlatformId: 0xef (EFI)
    Section Entries: 1
    ID: ""
Boot Catalog Section Entry:
    Entry is bootable
    Boot Media emulation type: no emulation
    Media load address: 0 (0x0000)
    System type: 0 (0x00)
    Load Sectors: 8192 (0x2000)
    Load LBA: 275968 (0x00043600)

我希望得到一些帮助,拉里

答案1

有足够多的微妙的事情可能会出错,我在你的脚本中没有看到任何彻底的错误,但这并不意味着没有;如果没有别的事,看看优秀的罗德的书关于主题,也许我的 ISO 生成器脚本——对于你的特定任务来说,它过于复杂(对我的任务来说仍然太简单),但也许你在那里发现了一些关键的东西。

PS:请注意,该脚本基于重新寻找(对我来说,这和那些书一样棒);目前正在努力添加 grub 支持,但尚未实现。

与此同时,如果您实际上并没有依赖 Ubuntu 18.04,而只需要一个具有 UEFI 启动功能的自定义 ISO(包括签名的 shim),那么您可能对 ALT 感兴趣MK图像,上面的脚本是其中的一部分,并且mkimage-配置文件它提供了一个框架来构建分发配置,以便随后烘焙其图像(例如ALT 入门套件是用它制成的,以及我们的9.0 版本;制作衍生品往往非常容易且技术性强,但目前大多数文档都是俄语的)。

抱歉这个无耻的插件,我只是碰巧是在 ALT Linux 中支持 UEFI 并设计了 mp 的人——所以忍不住问:-)

答案2

我喜欢尝试去理解为什么,但我讨厌告诉别人如何做才有效;因为一旦理解我就会知道“我的路”。一旦在 uefi 中启动,您很有可能只会看到 grub 的提示,这只是您的 grub 的 mkimage“找不到它寻找的任何 grub.cfg”

通常,在 debian(又名 ubuntu)上,“嵌入式 fat-efi-分区”——很久以前由著名的 mjg59 在 2012 年发起——有一个包含 grub.cfg 的“memdisk”(它实际上是嵌入 grub.cfg 的) efi.img)告诉在哪里查看下一个 grug.cfg -“自定义”“用户”最终 grub.cfg -根据需要调用它 -但这必须是 isoimage 的 grub.cfg(您在 isofs 中看到的内容)树结构 -isotree /boot/grub/grub.cfg + 当然是 grub 的树,以提供完整的 grub 支持。) grub-mkimage 中的指令 -p /boot/grub 告诉您 grub 的前缀 /boot/grub 来查看 grub .cfg 但它仍然在 fat 的空间中,没有理由可以看到 isotree 空间!(你喜欢它寻找什么)

你的grub-mkimage需要一个带有模块指令-m memdisk.tar的memdisk,它允许你“到达”iso树的grub.cfg,memdisk是一种tarfs,包含要查找并读取iso树的指令grub配置文件

为了说明这一切“等等”

1 一旦启动“你的”iso 进入 grub 提示符;只需输入“ls”即可查看 grub 能够看到的所有磁盘驱动器,并且你不应该看到任何“memdisk”

2 在 uefi 模式下启动(几乎)任何 ubuntu(伪)“iso”映像(伪我的意思是不是 pureiso 又名 isohybrid 不是 pureiso),在菜单中获取“尝试 ubuntu...blabla”类型“ESC”进入 grub 的控制台,然后再次输入“ls”并与您的 isoimage 进行比较。

grub> ls (memdisk)/ 最终查看这个 tarfs 磁盘后面有什么

grub> cat (memdisk)/grub.cfg 或类似的 (memdisk)/boot/grub/grub.cfg 查看他们尝试切换分区并获取 iso 树的 grub.cfg 的方式

3 捷径尝试:只需将您的 efi.img 替换为 ubuntu 的 efi.img 即可;请注意,ubuntu 的嵌入式 grub.cfg 要求 $isotree/.disk/[info mini-info] 中存在文件,因此您必须在 isotree 中添加类似 mkdir $isotree/.disk && touch $isotree/.disk/info 的内容你用 xorriso 构建你的 iso 可行的机会很高,但这是一种不好的学习方式

4 在末尾使用指令“-m memdsk”重建 grub-mkimage,其中“tar cf memdsk grub.cfg” grub.cfg 是您从 ubuntu 手动窃取的内容;更好的是自己写

5 要在 uefi 中愉快地启动 USB 上的任何 ubuntu.iso 映像;

  Type ESC to get into grub console
  Check your isofs partition as hd0 (since you booton it) by
      grub>ls (hd0)/   this will reveal the isofs tree
  Chroot to isofs partition with
      grub>set root=(hd0)

A 以标准方式切换 grub 配置 grub>configfile /boot/grub/grub.cfg

B 使用 grub-cmd "syslinux_configfile" 切换 grub 配置(通常不会显示在 google_search !!!) grub>syslinux_configfile /isolinux/isolinux.cfg

  Observe and play (where is legacy-bios or uefi boot now ?)

That's it

王吉

https://sourceforge.net/projects/toysbox/files/Exo_on_grub-mkimage/

https://sourceforge.net/projects/toysbox/files/practice_on_bootx64.efi/Practices_on_bootx64.pdf/download

相关内容