mkisofsを使用してUEFIのVirtualBoxから起動するFreeBSD ISOを生成するにはどうすればよいですか?

mkisofsを使用してUEFIのVirtualBoxから起動するFreeBSD ISOを生成するにはどうすればよいですか?

インストールに使用できるように、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/bootable.iso を生成します。

mkisofs -R -no-emul-boot -b boot/cdboot -o /tmp/bootable.iso /tmp/myboot

これは実際にいいえUEFI モードの VirtualBox から起動する ISO を生成します。

何が間違っているのか知っている人はいますか?

答え1

問題はファイルシステムの内容ではなく、ブートレコードとパーティションにあります。


$ 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のファイルではなく、名前が付けられていないブロック領域です。

固定成長セッションまたは追加セッションを使用しない場合


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 は 2048 ブロックで LBA を提供しますが、サイズは 512 ブロックです.4 * 420 = 1680 です.でも可能ですが、大きすぎると痛みません。

その後、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を生成しませんが、0x83(ISOファイルシステム用)と0xef(EFIシステムパーティション用)タイプの2つのパーティションを含むMBRパーティションテーブルを作成します。

(USBスティックから起動するときにBIOSをテストする必要がありますか?多くのMBRには、起動プロセスの次の手順を見つけるためにパッチ情報が必要です。)

答え2

isoを解凍してパッケージ化するよりも、標準イメージの上に別のcd9660セッションを作成して追加のファイルを追加する方がはるかに簡単です。

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>

qemuを使用して上記の内容をテストしました。OVMFUEFIファームウェアここ、次のコマンドラインを使用します。

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が破損した成長ファイル

バグが原因で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

答え3

起動可能な ISO 生成に関する多くのドキュメントの問題は、デフォルトでは非 UEFI 起動に設定される傾向があることです。

以下は、CD/DVD メディアからの UEFI ブートに関する情報を含む良い参考資料です。https://dev.lovelyhq.com/libburnia/libisofs/raw/master/doc/boot_sectors.txt

したがって、以前にBIOSで使用したように、UEFIで別々のEl Toritoブートイメージを使用するには、ブートイメージに正しいブートイメージが含まれていることを確認する必要があります。プラットフォームIDUEFI用のバイト。 x86 BIOSの場合、プラットフォームIDは0です。 PowerPCは1を使用し、値2はMacを指定し、UEFIは0xef値(10進数239)を指定します。

だから私の考えでは、一部プラットフォームID値を指定する方法:直接または一部のオプションを使用してブートイメージを指定する方法UEFI画像を起動します。私の考えではこのFedoraドキュメントはmosvyでリンクされています。これは、既存のBIOSブートイメージを使用する代わりに-e場所を指定するオプションを使用して行われます。efiboot.img-b

したがって、あなたの情報がboot/cdboot有効であることを確認してくださいUEFIイメージを起動し、代わりにコマンドライン-e boot/cdbootで使用してみてください。mkisofs-b boot/cdboot

以下は、UEFIブートイメージの内容の説明です。

偶然にはRHEL 8.0ベータ1 ISOイメージを持っていますが、VirtualBoxを使用して実際にUEFIモードで起動することを確認しました。ここで使用されているUEFIブートイメージは、イメージのデフォルトのiso9660ファイルシステムで使用でき、images/efiboot.imgパーティションテーブルを指定せずにFATファイルシステムイメージのみを含むようです。

のファイルシステムには、対応するUEFIブートローダを含むディレクトリがefiboot.img1つしかありません\EFI\BOOT。この場合、およびはBOOTX64.EFI両方ともBOOTIA32.EFIセキュアブートシムとして表示され、各GRUBバージョンに対応し、grubx64.efi必要なgrubia32.efi補助ファイルはMOKManagerです。 GRUB構成ファイル、GRUBフォントファイル、およびセキュアブートシム。

関連情報