我正在尝试编写一个脚本来解压缩并重新打包 FreeBSD ISO,以便我可以使用它进行安装。目标是无人值守的安装。
我已经编写了以下脚本,但它不起作用。虽然原始 ISO 将在 UEFI 模式下在 VirtualBox 中启动,但新创建的 ISO 不会。
#!/bin/sh
inst_cfg="$1"
src_iso="$2"
dst_iso="$3"
iso_mnt=$(mktemp -d /tmp/freebsd-mnt-XXXXXX)
iso_wrk=$(mktemp -d /tmp/freebsd-wrk-XXXXXX)
vol_id=$(isoinfo -d -i "${src_iso}" | sed -n -e 's/^Volume id: \(.*\)$/\1/p')
md_name=$(mdconfig -a -t vnode -f "${src_iso}")
mount -t cd9660 "/dev/${md_name}" "${iso_mnt}"
cp -a -v "${iso_mnt}/" "${iso_wrk}"
cp "${inst_cfg}" "${iso_wrk}/etc/installerconfig"
mkisofs -J -R -no-emul-boot -V "${vol_id}" -b boot/cdboot -o "${dst_iso}" "${iso_wrk}"
umount "${iso_mnt}" # cd9660
mdconfig -d -u "${md_name}"
rm -rf "${iso_mnt}"
rm -rf "${iso_wrk}"
创建的文件系统看起来不错。我已经区分了原始 ISO 和自定义 ISO 的文件,唯一的区别是installerconfig
添加的文件和boot.catalog
(我理解mkisofs
添加,但是为什么?这可能是问题吗?)
我尝试了各种选项组合mkisofs
,包括-R -U
, -L -D -R
, -J -R
,但没有任何区别。
此外,有趣的是, FreeBSD 手册有以下评论:
因此,如果 /tmp/myboot 拥有一个可引导的 FreeBSD 系统,其引导映像位于 /tmp/myboot/boot/cdboot,则此命令将生成 /tmp/bootable.iso:
mkisofs -R -no-emul-boot -b boot/cdboot -o /tmp/bootable.iso /tmp/myboot
这不会生成在 UEFI 模式下在 VirtualBox 下启动的 ISO。
有谁知道出了什么问题?
通过在标准映像之上创建另一个 cd9660 会话来添加额外的文件,而不是解包和打包回 iso,要容易得多:
这应该“继承”上一个会话的引导映像,具有相同路径的新文件将覆盖光盘上已有的文件(但仅当它们较新时,使用标准
mkisofs
/时genisoimage
)。请注意,除非新会话的卷 ID 设置为与旧会话相同(如上),否则 FreeBSD 安装程序不会自动挂载 cd,而是会提示输入带有
mountroot>
.我已经在 qemu 上使用OVMF UEFI 固件从这里测试了上述内容,使用以下命令行:
如果您确实需要从头开始创建 UEFI 可启动 cd,那么您可以在 FreeBSD 的wiki(在“UEFI 下的 CD/DVD 启动”下)和此处找到更多信息。
FreeBSD 的损坏的 growisofs
由于一个错误,
growisofs
当与常规文件而不是设备一起使用时,将在 FreeBSD 上崩溃;为避免这种情况,您应该将此差异应用于growisofs.c
(适用于patch -l
):问题不在于文件系统内容,而在于引导记录和分区:
BIOS 引导映像和 EFI 系统分区都不是 ISO 中的文件,而是未命名的块区域。
如果您不通过固定的 growisofs 或通过
那么你需要提取这些区域
(El Torito 以 2048 块为单位提供 LBA,但以 512 块为单位提供大小。4 * 420 = 1680。1204 个 2048 字节块的 BIOS 映像大小由高于 420 的最低文件系统对象 LBA 估计。可能它更小但任何过大不应该有害。)
然后是从 U 盘启动 BIOS 的 MBR 代码:
如果您不打算通过 BIOS 引导,则不需要 bios_boot.img 和 mbr_code.img。
从解压和主树 $HOME/files_for_iso 和提取的图像文件构建一个新的 ISO
这将不会产生 GPT,而是会产生一个 MBR 分区表,其中包含两个用于 ISO 文件系统的 0x83 类型的分区和用于 EFI 系统分区的 0xef。
(是否必须测试从 U 盘启动的 BIOS。许多 MBR 需要修补信息才能找到下一阶段的启动程序。)
许多关于创建可引导 ISO 的文档的问题在于,它们倾向于默认采用非 UEFI 引导。
这是一个很好的参考资料,其中包含有关从 CD/DVD 媒体启动 UEFI 的信息:https ://dev.lovelyhq.com/libburnia/libisofs/raw/master/doc/boot_sectors.txt
因此,如果您想在 UEFI 中使用单独的 El Torito 启动映像(就像您以前使用 BIOS 一样),您需要确保启动映像嵌入了 UEFI 的正确平台 ID字节。对于 x86 BIOS,平台 ID 为 0。PowerPCs used 1;值 2 是为 Mac 指定的;UEFI 指定值 0xef,即十进制的 239。
因此,在我看来,您必须有某种方法来指定平台 ID 值:直接或通过使用某些选项来指定引导映像应该是UEFI引导映像。我想这个由 mosvy 链接的 Fedora 文档是通过使用选项
-e
来指定位置efiboot.img
而不是-b
像传统的 BIOS 引导映像那样使用。因此,请验证您
boot/cdboot
是有效的UEFI启动映像,并尝试-e boot/cdboot
在mkisofs
命令行中使用而不是-b boot/cdboot
.以下是 UEFI 启动映像内容的描述:
我碰巧手头有一个 RHEL 8.0 beta 1 ISO 映像,我刚刚确认它实际上可以在 UEFI 模式下使用 VirtualBox 启动。它使用的 UEFI 引导映像在映像的主 iso9660 文件系统中可用
images/efiboot.img
,并且它显然只包含一个 FAT 文件系统映像,没有任何类型的分区表。在 的文件系统中
efiboot.img
,只有一个\EFI\BOOT
包含适当 UEFI 引导加载程序的目录:在这种情况下,两者BOOTX64.EFI
和BOOTIA32.EFI
似乎都是安全引导垫片,以及相应版本的 GRUBgrubx64.efi
和grubia32.efi
,以及这些所需的任何辅助文件:GRUB配置文件、GRUB 字体文件和安全启动 shim 的 MOKManager。