我正在尝试制作一个基于 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