为何我的 isohybrid USB 无法启动?

为何我的 isohybrid USB 无法启动?

我正在尝试使用 RedHat 7.7 上的 isohybrid 实用程序构建一个也可以从 USB 驱动器启动的 ISO。但是当我尝试从生成的 USB 介质启动时,我的目标系统显示“未找到介质”(无论是使用传统 BIOS 启动还是使用 UEFI)。在同一个 USB 介质和同一个目标系统上使用下载的可启动 ISO 映像,它可以工作。这排除了 USB 棒的硬件问题。

我过去也曾成功构建过混合 ISO 映像。

目标是为 Satellite Server 6.5 构建通用启动映像,如下所述:https://access.redhat.com/articles/3464601(链接需登录后才能查看)

在测试并排除了我的大多数其他理论之后,我主要关注 isohybrid --uefi 命令。

我已经做了:

  • 使用 VirtualBox 将生成的 ISO 作为 CD 映像进行测试。它似乎在传统模式和 UEFI 模式下都可以无问题地启动。
  • 将 efiboot.img 文件的大小从 RedHat 文章中建议的 64MB 减少到 2MB;显然,isohybrid 对 64MB 图像存在问题。
  • 插入 USB 介质并查看是否可以挂载分区。没有问题。
  • 检查 isohybrid 生成的分区表(MBR 和 GPT),并与已知可工作的映像进行比较。我没有发现任何显著差异。正如预期的那样,主映像分区被标记为可启动。
  • 检查 isohybrid 添加的 MBR。同样,我没有发现任何显著差异。
  • 为 mkisofs 添加了 --eltorito-platform 0xEF 选项(默认值似乎是 0x07)。这可能没有什么区别,因为工作 ISO 映像也使用 0x07。

此时,我不知道还能尝试什么,以及为什么我的目标系统无法将该媒体视为可启动。

fdisk 显示以下分区表:

You must set cylinders.
You can do this from the extra functions menu.
Welcome to fdisk (util-linux 2.23.2).

Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.


Command (m for help): p

Disk generic-boot-usb.iso: 4 MB, 4194304 bytes, 8192 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
Disk label type: dos
Disk identifier: 0x6233e677

               Device Boot      Start         End      Blocks   Id  System
generic-boot-usb.iso1   *           0        8191        4096    0  Empty
generic-boot-usb.iso2             148        4243        2048   ef  EFI (FAT-12/16/32)

gdisk 报告的 GPT 分区表如下:

Command (? for help): p
Disk generic-boot-usb.iso: 8192 sectors, 4.0 MiB
Logical sector size: 512 bytes
Disk identifier (GUID): E3E66CDD-C58D-45C0-BA06-06D20DFABD21
Partition table holds up to 128 entries
First usable sector is 34, last usable sector is 8158
Partitions will be aligned on 4-sector boundaries
Total free space is 30 sectors (15.0 KiB)

Number  Start (sector)    End (sector)  Size       Code  Name
   2             148            4243   2.0 MiB     0700  I

完整脚本如下:

#!/bin/bash

OUTDIR=${PWD}
OUTFILE_CD=${OUTDIR}/generic-boot-cd.iso
OUTFILE_USB=${OUTDIR}/generic-boot-usb.iso
DIR=${PWD}/Generic_Boot
CDROOT=${DIR}/CD_Root

sudo yum install gcc xz-devel dosfstools syslinux genisoimage

mkdir -p ${DIR}
cp generic-boot-script ${DIR}/script
cp generic-boot-isolinux-cfg ${DIR}/isolinux.cfg
pushd ${DIR}
 git clone git://git.ipxe.org/ipxe.git


 pushd ${DIR}/ipxe/src
  make clean
  make bin/ipxe.lkrn
  make bin-x86_64-efi/ipxe.efi EMBED=${DIR}/script
 popd

 dd if=/dev/zero of=${DIR}/efiboot.img bs=1024 count=2048
 mkfs.fat -s1 -F32 ${DIR}/efiboot.img

 mkdir -p efiboot
 sudo mount -o loop efiboot.img efiboot
 sudo mkdir -p efiboot/EFI/BOOT
 sudo rm -f efiboot/EFI/BOOT/BOOTX64.EFI
 sudo cp ipxe/src/bin-x86_64-efi/ipxe.efi efiboot/EFI/BOOT/BOOTX64.EFI
 sudo umount efiboot
 rmdir efiboot

 mkdir -p ${CDROOT}/EFI/BOOT

 cp efiboot.img ${CDROOT}
 cp script ${CDROOT}
 cp isolinux.cfg ${CDROOT}
 cp ipxe/src/bin-x86_64-efi/ipxe.efi ${CDROOT}/EFI/BOOT/BOOTX64.EFI
 cp ipxe/src/bin/ipxe.lkrn ${CDROOT}/EFI/BOOT
 cp ipxe/src/bin/ipxe.lkrn ${CDROOT}
 cp /usr/share/syslinux/isolinux.bin ${CDROOT}
popd

mkisofs \
  -untranslated-filenames \
  -rational-rock \
  -v \
  -translation-table \
  -input-charset UTF-8 \
  -J \
  -joliet-long \
  -V "Generic Boot" \
  -A "Generic Boot" \
  -volset "Generic Boot" \
  -x ./lost+found \
  -b isolinux.bin \
  -c boot.cat \
  -no-emul-boot \
  -boot-load-size 4 \
  -boot-info-table \
  -eltorito-alt-boot \
  -eltorito-platform 0xEF \
  -efi-boot efiboot.img \
  -no-emul-boot \
  -o ${OUTFILE_CD} \
  ${CDROOT}

cp ${OUTFILE_CD} ${OUTFILE_USB}
/usr/bin/isohybrid -v --uefi ${OUTFILE_USB}

相关内容