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には、起動プロセスの次の手順を見つけるためにパッチ情報が必要です。)

おすすめ記事