15523003aSGlen Barber#!/bin/sh 25523003aSGlen Barber# 35523003aSGlen Barber# 45523003aSGlen Barber# This script is used by release/Makefile to build the (optional) ISO images 55523003aSGlen Barber# for a FreeBSD release. It is considered architecture dependent since each 65523003aSGlen Barber# platform has a slightly unique way of making bootable CDs. This script is 75523003aSGlen Barber# also allowed to generate any number of images since that is more of 85523003aSGlen Barber# publishing decision than anything else. 95523003aSGlen Barber# 105523003aSGlen Barber# Usage: 115523003aSGlen Barber# 125523003aSGlen Barber# mkisoimages.sh [-b] image-label image-name base-bits-dir [extra-bits-dir] 135523003aSGlen Barber# 145523003aSGlen Barber# Where -b is passed if the ISO image should be made "bootable" by 155523003aSGlen Barber# whatever standards this architecture supports (may be unsupported), 165523003aSGlen Barber# image-label is the ISO image label, image-name is the filename of the 175523003aSGlen Barber# resulting ISO image, base-bits-dir contains the image contents and 185523003aSGlen Barber# extra-bits-dir, if provided, contains additional files to be merged 195523003aSGlen Barber# into base-bits-dir as part of making the image. 205523003aSGlen Barber 215523003aSGlen Barberset -e 225523003aSGlen Barber 235523003aSGlen Barberscriptdir=$(dirname $(realpath $0)) 245523003aSGlen Barber. ${scriptdir}/../../tools/boot/install-boot.sh 255523003aSGlen Barber 265523003aSGlen Barberif [ -z $ETDUMP ]; then 275523003aSGlen Barber ETDUMP=etdump 285523003aSGlen Barberfi 295523003aSGlen Barber 305523003aSGlen Barberif [ -z $MAKEFS ]; then 315523003aSGlen Barber MAKEFS=makefs 325523003aSGlen Barberfi 335523003aSGlen Barber 345523003aSGlen Barberif [ -z $MKIMG ]; then 355523003aSGlen Barber MKIMG=mkimg 365523003aSGlen Barberfi 375523003aSGlen Barber 385523003aSGlen Barberif [ "$1" = "-b" ]; then 3913cb0041SJessica Clarke MAKEFSARG="$4" 4013cb0041SJessica Clarkeelse 4113cb0041SJessica Clarke MAKEFSARG="$3" 4213cb0041SJessica Clarkefi 435523003aSGlen Barber 4413cb0041SJessica Clarkeif [ -f ${MAKEFSARG} ]; then 4513cb0041SJessica Clarke BASEBITSDIR=`dirname ${MAKEFSARG}` 4613cb0041SJessica Clarke METALOG=${MAKEFSARG} 4713cb0041SJessica Clarkeelif [ -d ${MAKEFSARG} ]; then 4813cb0041SJessica Clarke BASEBITSDIR=${MAKEFSARG} 4913cb0041SJessica Clarke METALOG= 5013cb0041SJessica Clarkeelse 5113cb0041SJessica Clarke echo "${MAKEFSARG} must exist" 5213cb0041SJessica Clarke exit 1 5313cb0041SJessica Clarkefi 5413cb0041SJessica Clarke 5513cb0041SJessica Clarkeif [ "$1" = "-b" ]; then 565523003aSGlen Barber # Make an EFI system partition. 575523003aSGlen Barber espfilename=$(mktemp /tmp/efiboot.XXXXXX) 585523003aSGlen Barber # ESP file size in KB. 595523003aSGlen Barber espsize="2048" 605523003aSGlen Barber make_esp_file ${espfilename} ${espsize} ${BASEBITSDIR}/boot/loader.efi 615523003aSGlen Barber 625523003aSGlen Barber bootable="-o bootimage=efi;${espfilename} -o no-emul-boot -o platformid=efi" 635523003aSGlen Barber 645523003aSGlen Barber shift 655523003aSGlen Barberelse 665523003aSGlen Barber bootable="" 675523003aSGlen Barberfi 685523003aSGlen Barber 695523003aSGlen Barberif [ $# -lt 3 ]; then 705523003aSGlen Barber echo "Usage: $0 [-b] image-label image-name base-bits-dir [extra-bits-dir]" 715523003aSGlen Barber exit 1 725523003aSGlen Barberfi 735523003aSGlen Barber 745523003aSGlen BarberLABEL=`echo "$1" | tr '[:lower:]' '[:upper:]'`; shift 755523003aSGlen BarberNAME="$1"; shift 7613cb0041SJessica Clarke# MAKEFSARG extracted already 7713cb0041SJessica Clarkeshift 785523003aSGlen Barber 795523003aSGlen Barberpublisher="The FreeBSD Project. https://www.FreeBSD.org/" 805523003aSGlen Barberecho "/dev/iso9660/$LABEL / cd9660 ro 0 0" > "$BASEBITSDIR/etc/fstab" 8113cb0041SJessica Clarkeif [ -n "${METALOG}" ]; then 8213cb0041SJessica Clarke metalogfilename=$(mktemp /tmp/metalog.XXXXXX) 8313cb0041SJessica Clarke cat ${METALOG} > ${metalogfilename} 8413cb0041SJessica Clarke echo "./etc/fstab type=file uname=root gname=wheel mode=0644" >> ${metalogfilename} 8513cb0041SJessica Clarke MAKEFSARG=${metalogfilename} 8613cb0041SJessica Clarkefi 871a9b1c36SJessica Clarke$MAKEFS -D -N ${BASEBITSDIR}/etc -t cd9660 $bootable -o rockridge -o label="$LABEL" -o publisher="$publisher" "$NAME" "$MAKEFSARG" "$@" 885523003aSGlen Barberrm -f "$BASEBITSDIR/etc/fstab" 895523003aSGlen Barberrm -f ${espfilename} 9013cb0041SJessica Clarkeif [ -n "${METALOG}" ]; then 9113cb0041SJessica Clarke rm ${metalogfilename} 9213cb0041SJessica Clarkefi 935523003aSGlen Barber 945523003aSGlen Barberif [ "$bootable" != "" ]; then 955523003aSGlen Barber # Look for the EFI System Partition image we dropped in the ISO image. 965523003aSGlen Barber for entry in `$ETDUMP --format shell $NAME`; do 975523003aSGlen Barber eval $entry 985523003aSGlen Barber # XXX: etdump(8) returns "default" for the initial entry 995523003aSGlen Barber if [ "$et_platform" = "default" ]; then 1005523003aSGlen Barber espstart=`expr $et_lba \* 2048` 1015523003aSGlen Barber espsize=`expr $et_sectors \* 512` 1025523003aSGlen Barber espparam="-p efi::$espsize:$espstart" 1035523003aSGlen Barber break 1045523003aSGlen Barber fi 1055523003aSGlen Barber done 1065523003aSGlen Barber 1075523003aSGlen Barber # Create a GPT image containing the EFI partition. 108045c8f52SJessica Clarke efifilename=$(mktemp /tmp/efi.img.XXXXXX) 109*cefe5879SJessica Clarke if [ "$(uname -s)" = "Linux" ]; then 110*cefe5879SJessica Clarke imgsize=`stat -c %s "$NAME"` 111*cefe5879SJessica Clarke else 1125523003aSGlen Barber imgsize=`stat -f %z "$NAME"` 113*cefe5879SJessica Clarke fi 1145523003aSGlen Barber $MKIMG -s gpt \ 1155523003aSGlen Barber --capacity $imgsize \ 1165523003aSGlen Barber $espparam \ 117045c8f52SJessica Clarke -o $efifilename 1185523003aSGlen Barber 1195523003aSGlen Barber # Drop the GPT into the System Area of the ISO. 120045c8f52SJessica Clarke dd if=$efifilename of="$NAME" bs=32k count=1 conv=notrunc 121045c8f52SJessica Clarke rm -f $efifilename 1225523003aSGlen Barberfi 123