我正在尝试使用 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}