将 UEFI 引导功能添加到仅 BIOS、基于 Ubuntu 18.04 的自定义 iso

将 UEFI 引导功能添加到仅 BIOS、基于 Ubuntu 18.04 的自定义 iso

我正在尝试将 UEFI 启动功能添加到基于 BIOS 的 Ubuntu 18.04 自定义 ISO。到目前为止我发现的所有方法都需要 efi.img 文件,而 ISO 中不存在该文件。我可以在完整安装的 Ubuntu 18.04 中使用该文件吗?如果是,我需要编辑它吗?如果没有,我该如何构建 efi.img 文件?

自定义 iso 设计为从 USB 运行,而不是安装。它还旨在分发给新的 Linux 用户。将 UEFI 功能添加到 USB 而不是 iso 并不是我们正在寻找的解决方案。

这是我用来构建 fat 分区的脚本。它在包含提取的 iso 的文件夹中运行:

#! /bin/sh

BOOT_IMG_DATA="$PWD"
BOOT_IMG=efi.img

#Ensure needed folders exist

if [ ! -d "$BOOT_IMG_DATA"/efi/boot ]; then
  mkdir -p "$BOOT_IMG_DATA"/efi/boot
fi

if [ ! -d "$BOOT_IMG_DATA"/boot/grub ]; then
  mkdir -p "$BOOT_IMG_DATA"/boot/grub
fi

chmod -R +rw "$BOOT_IMG_DATA"/boot/grub
chmod -R +rw "$BOOT_IMG_DATA"/efi/boot

# Create the 64-bit EFI GRUB binary (bootx64.efi) and the El-Torito boot
# image (efiboot.img) that goes in the /isolinux directory for booting on
# UEFI systems.

# First, build bootx64.efi, which will be installed here in /EFI/BOOT:

grub-mkimage --format=x86_64-efi --output=bootx64.efi --config=grub.cfg --compression=xz --prefix=/EFI/BOOT part_gpt part_msdos fat ext2 hfs hfsplus iso9660 udf ufs1 ufs2 zfs chain linux boot appleldr ahci configfile normal regexp minicmd reboot halt search search_fs_file search_fs_uuid search_label gfxterm gfxmenu efi_gop efi_uga all_video loadbios gzio echo true probe loadenv bitmap_scale font cat help ls png jpeg tga test at_keyboard usb_keyboard

# Then, create a FAT formatted image that contains bootx64.efi in the
# /EFI/BOOT directory.  This is used to bootstrap GRUB from the ISO image.
dd if=/dev/zero of=efiboot.img bs=1K count=1440

# Format the image as FAT12:
mkdosfs -F 12 efiboot.img

# Create a temporary mount point:
MOUNTPOINT=$(mktemp -d)

# Mount the image there:
mount -o loop efiboot.img $MOUNTPOINT

# Copy the GRUB binary to /EFI/BOOT:
mkdir -p $MOUNTPOINT/EFI/BOOT
cp -a bootx64.efi -s $MOUNTPOINT/EFI/BOOT


# Unmount and clean up:
umount $MOUNTPOINT
rmdir $MOUNTPOINT

# Move the efiboot.img to isolinux:
mv efiboot.img isolinux
mv bootx64.efi efi/boot

echo
echo "Done building /EFI/BOOT/bootx64.efi and /isolinux/efiboot.img."

这是我用来构建 iso 的脚本:

#!/bin/bash

# The example names get mapped to their roles here
orig_iso="$HOME"/foxclone/foxclone025-01.iso
new_iso="$HOME"/foxclone/foxclone025-02.iso
new_files="$PWD"
mbr_template=isohdpfx.bin


# Extract MBR template file to disk
dd if="$orig_iso" bs=1 count=432 of="$mbr_template"


# Create the new ISO image
xorriso -as mkisofs \
   -U  \
   -allow-lowercase  \
   -r -V 'foxclone025-02' \
   -o "$new_iso" \
   -J -J -joliet-long \
   -isohybrid-mbr "$mbr_template" \
   -c isolinux/boot.cat \
   -b isolinux/isolinux.bin \
    -no-emul-boot -boot-load-size 4 -boot-info-table \
   -eltorito-alt-boot \
   -e isolinux/efiboot.img \
    -no-emul-boot \
    -isohybrid-gpt-basdat \
   "$new_files"

有人看到代码中有问题吗?我真的很欣赏用不同的眼光看待这个问题,因为我认为我已经“离森林太近,看不到树木了”。

蒂亚,拉里

答案1

我认为问题出在 xooriso 上。尝试一下,首先从普通的 live iso 中提取引导扇区,如下所述:

https://linuxconfig.org/legacy-bios-uefi-and-secureboot-ready-ubuntu-live-image-customization

有趣的是这些文件不在那里。 syslinux-utils 软件包有 isohybrid。不知道它被移动了。不在乎。

上述方法有效。否则utils默认只会制作i386/i686版本。

uck 可以修改为使用 udf 和有限大小,以使 dvdDL 和 BDR 图像能够正常工作。

xorriso 可以工作,但超出了约 4GB 以上大小的规格。

在大多数情况下,squishfs 都会超出限制。更具体地说,文件大小限制为 4GB,而不是 iso 大小限制。如果您不指定允许有限的 joliet/rr 大小,则大多数实用程序在创建 iso 时都会失败。另一种方法是构建一个仅安装的 iso,就像 debian 那样。并非没有其他问题。我还没有超过可启动 bdrom 的大小、规格,甚至是重量级玩家发行版(fedora)。

相关内容