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