首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何创建一个FreeBSD ISO与VirtualBox将在UEFI下引导?

如何创建一个FreeBSD ISO与VirtualBox将在UEFI下引导?
EN

Unix & Linux用户
提问于 2018-12-14 00:36:36
回答 3查看 3.1K关注 0票数 4

我正在尝试编写一个脚本,它将解压缩和重新包装一个FreeBSD ISO,这样我就可以使用它进行安装了。目标是无人值守的安装。

我已经编写了下面的脚本,但它不起作用。虽然原始的ISO将在UEFI模式下在VirtualBox中引导,但是新创建的ISO不会。

代码语言:javascript
复制
#!/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。

有人知道怎么回事吗?

EN

回答 3

Unix & Linux用户

回答已采纳

发布于 2018-12-15 09:05:10

问题不在于文件系统内容,而在于引导记录和分区:

代码语言:javascript
复制
$ 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  29

BIOS引导映像和EFI系统分区都不是ISO中的文件,而是未命名的块区域。

如果你不按照固定的增长方式或通过

代码语言:javascript
复制
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 ...]

然后你需要提取这些区域

代码语言:javascript
复制
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代码:

代码语言:javascript
复制
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

代码语言:javascript
复制
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需要修补信息才能找到引导程序的下一阶段。)

票数 4
EN

Unix & Linux用户

发布于 2018-12-14 01:40:58

通过在标准映像的基础上创建另一个cd9660会话来添加额外的文件(S),而不是解压和打包iso,要容易得多:

代码语言:javascript
复制
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上测试了上面的内容,使用以下命令行:

代码语言:javascript
复制
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引导下)和这里中找到更多信息。

FreeBSD's断裂生长

由于一个错误,growisofs在与常规文件而不是设备一起使用时会在FreeBSD上崩溃;为了避免这种情况,您应该将此差异应用于growisofs.c (与patch -l一起应用):

代码语言:javascript
复制
--- 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
票数 4
EN

Unix & Linux用户

发布于 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.EFIBOOTIA32.EFI都是安全引导,与相应版本的GRUB分别为grubx64.efigrubia32.efi,以及这些文件所需的任何辅助文件: GRUB配置文件、GRUB字体文件和安全Boot的MOKManager。

票数 0
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/487895

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档