我正在尝试编写一个脚本,它将解压缩和重新包装一个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持有一个引导映像位于/tmp/myboot/ boot /cdboot中的可引导FreeBSD系统,则此命令将生成/tmp/
mkisofs -R -no-emul-boot -b boot/cdboot -o /tmp/bootable.iso /tmp/myboot。
这不会产生在UEFI模式下在VirtualBox下引导的ISO。
有人知道怎么回事吗?
发布于 2018-12-15 09:05:10
问题不在于文件系统内容,而在于引导记录和分区:
$ xorriso -indev FreeBSD-12.0-RELEASE-amd64-bootonly.iso -report_el_torito plain -report_system_area plain
...
libisofs: WARNING : Found hidden El-Torito image. Its size could not be figured out, so image modify or boot image patching may lead to bad results.
libisofs: NOTE : Found hidden El-Torito image for EFI.
libisofs: NOTE : EFI image start and size: 20 * 2048 , 1600 * 512
...
Boot record : El Torito , MBR protective-msdos-label cyl-align-off GPT
...
El Torito catalog : 19 1
El Torito images : N Pltf B Emul Ld_seg Hdpt Ldsiz LBA
El Torito boot img : 1 BIOS y none 0x0000 0x00 4 420
El Torito boot img : 2 UEFI y none 0x0000 0x00 1600 20
El Torito img blks : 1 1204
El Torito img blks : 2 400
System area options: 0x00000201
System area summary: MBR protective-msdos-label cyl-align-off GPT
ISO image size/512 : 675508
Partition offset : 0
MBR heads per cyl : 0
MBR secs per head : 0
MBR partition table: N Status Type Start Blocks
MBR partition : 1 0x00 0xee 1 676107
GPT : N Info
GPT backup problems: Not a GPT 1.0 header of 92 bytes for 128 bytes per entry
GPT disk GUID : 7ce0bf52def9e8118c360cc47ad8b808
GPT entry array : 2 2 separated
GPT lba range : 3 676105 676107
GPT partition name : 1
GPT partition GUID : 1 6de0bf52def9e8118c360cc47ad8b808
GPT type GUID : 1 28732ac11ff8d211ba4b00a0c93ec93b
GPT partition flags: 1 0x0000000000000000
GPT start and size : 1 80 1600
GPT partition name : 2
GPT partition GUID : 2 73e0bf52def9e8118c360cc47ad8b808
GPT type GUID : 2 9d6bbd83417fdc11be0b001560b84f0f
GPT partition flags: 2 0x0000000000000000
GPT start and size : 2 3 29BIOS引导映像和EFI系统分区都不是ISO中的文件,而是未命名的块区域。
如果你不按照固定的增长方式或通过
cp FreeBSD-12.0-RELEASE-amd64-bootonly.iso new.iso
xorriso -boot_image any keep \
-dev new.iso \
-map /path/to/your_installerconfig /etc/installerconfig
[other -map commands for files or directory trees ...]然后你需要提取这些区域
dd if=FreeBSD-12.0-RELEASE-amd64-bootonly.iso bs=512 skip=80 count=1600 \
of=efi_part.img
dd if=FreeBSD-12.0-RELEASE-amd64-bootonly.iso bs=512 skip=1680 count=4816 \
of=bios_boot.img(El Torito给LBAs的分块为2048年,大小为512块。4* 420 = 1680。2048字节的1204块BIOS映像大小是由420以上的最低文件系统对象LBA估计的。它可能更小,但任何过大的东西都不会造成伤害。)
然后是从USB棒启动BIOS的MBR代码:
dd if=FreeBSD-12.0-RELEASE-amd64-bootonly.iso bs=1 count=446 \
of=mbr_code.img如果您不计划通过BIOS启动,则不需要bios_boot.img和mbr_code.img。
从解压缩和主机树$HOME/ files _for_iso和提取的图像文件构建新的ISO
xorriso -as mkisofs \
-o new.iso \
-d -l -r \
-V "12_0_RELEASE_AMD64_BO" \
-G mbr_code.img \
-b /bios_boot.img \
-no-emul-boot -boot-load-size 4 \
-eltorito-alt-boot \
-append_partition 2 0xef efi_part.img \
-e '--interval:appended_partition_2:all::' \
-no-emul-boot \
bios_boot.img $HOME/files_for_iso这将不会产生GPT,而是生成一个MBR分区表,其中ISO文件系统具有0x83类型的分区,EFI系统分区的类型为0xef。
(是否需要测试从USB棒启动的BIOS。许多MBR需要修补信息才能找到引导程序的下一阶段。)
发布于 2018-12-14 01:40:58
通过在标准映像的基础上创建另一个cd9660会话来添加额外的文件(S),而不是解压和打包iso,要容易得多:
cp FreeBSD-12.0-RELEASE-amd64-bootonly.iso new.iso
volid=$(isoinfo -d -i new.iso | awk '/Volume id/{print$3}')
growisofs -M new.iso -d -l -r -V "$volid" -graft-points \
/etc/installerconfig=/path/to/your_installerconfig \
[other files ...]这应该“继承”上一次会话的启动,具有相同路径的新文件将覆盖磁盘上已经存在的文件(但只有在使用标准的mkisofs/genisoimage时,它们才会更新)。
注意,除非将新会话的卷Id设置为与旧会话相同(如上面所示),否则FreeBSD安装程序不会自动挂载cd,而是会提示使用mountroot>的fs规范。
我使用来自OVMF的这里的UEFI固件在qemu上测试了上面的内容,使用以下命令行:
qemu-system-x86_64 -enable-kvm -m 2G -serial none \
-bios ovmf-x64/OVMF-pure-efi.fd -cdrom new.iso如果您真的需要从头创建UEFI可引导cd,那么您可以在FreeBSD的维基 (在UEFI下的CD/DVD引导下)和这里中找到更多信息。
由于一个错误,growisofs在与常规文件而不是设备一起使用时会在FreeBSD上崩溃;为了避免这种情况,您应该将此差异应用于growisofs.c (与patch -l一起应用):
--- growisofs.c~ 2018-12-14 07:32:38.814189935 +0200
+++ growisofs.c 2018-12-14 07:32:43.602431986 +0200
@@ -3471,7 +3471,8 @@
CLOSEONEXEC(in_fd);
CLOSEONEXEC(out_fd);
#if !(defined(__APPLE__) && defined(__MACH__))
- CLOSEONEXEC(ioctl_fd);
+ if(ioctl_handle != INVALID_HANDLE)
+ CLOSEONEXEC(ioctl_fd);
#endif
#undef CLOSEONEXEC发布于 2018-12-14 10:06:30
关于创建可引导is的许多文档的问题在于,它们在默认情况下倾向于假定非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。PowerPC使用1;值2是为Mac指定的;UEFI指定的值为0xef,或在十进制中为239。
因此,在我看来,您必须有某种方法来指定平台ID值:直接指定,或者使用某些选项来指定引导映像应该是UEFI引导映像。我认为这个Fedora文档由mosvy链接是通过使用选项-e来指定efiboot.img的位置来做到这一点的,而不是像传统的BIOS引导映像那样使用-b。
因此,验证您的boot/cdboot是一个有效的UEFI引导映像,并尝试在mkisofs命令行中使用-e boot/cdboot而不是-b boot/cdboot。
下面描述UEFI引导映像的内容可能是什么样子:
我碰巧手头有一个RHEL8.0 beta 1 ISO映像,我刚刚确认它实际上是可以在UEFI模式下使用VirtualBox引导的。它使用的UEFI引导映像可以在映像的主iso9660文件系统中作为images/efiboot.img使用,而且它显然只包含一个胖文件系统映像,没有任何类型的分区表。
在efiboot.img的文件系统中,只有一个带有适当UEFI引导加载程序的目录\EFI\BOOT:在本例中,BOOTX64.EFI和BOOTIA32.EFI都是安全引导,与相应版本的GRUB分别为grubx64.efi和grubia32.efi,以及这些文件所需的任何辅助文件: GRUB配置文件、GRUB字体文件和安全Boot的MOKManager。
https://unix.stackexchange.com/questions/487895
复制相似问题