#!/bin/sh set -e # for debugging [ -n "$DEBUG" ] && set -x IMGFILE=$PWD/disk.img # we want everything except the final result to stderr ( exec 1>&2; ESP_FILE=$PWD/boot.img # get the GRUB2 boot file name ARCH=${TARGETARCH:-`uname -m`} case $ARCH in x86_64) BOOTFILE=BOOTX64.EFI ;; aarch64) BOOTFILE=BOOTAA64.EFI ;; esac mkdir -p /tmp/efi cd /tmp/efi # input is a tarball on stdin with kernel and cmdline in /boot # output is an iso on stdout # extract. BSD tar auto recognises compression, unlike GNU tar # only if stdin is a tty, if so need files volume mounted... [ -t 0 ] || bsdtar xzf - INITRD="$(find . -name '*.img')" KERNEL="./kernel" CMDLINE_FILE="$(find . -name cmdline)" CMDLINE="$(cat $CMDLINE_FILE )" # PARTUUID for root PARTUUID=$(cat /proc/sys/kernel/random/uuid) cp /usr/local/share/$BOOTFILE . mkdir -p EFI/BOOT cat >> EFI/BOOT/grub.cfg < /dev/null echo "mtools_skip_check=1" >> /etc/mtools.conf && \ mmd -i $ESP_FILE ::/EFI mmd -i $ESP_FILE ::/EFI/BOOT mcopy -i $ESP_FILE $BOOTFILE ::/EFI/BOOT/ mcopy -i $ESP_FILE EFI/BOOT/grub.cfg ::/EFI/BOOT/ mcopy -i $ESP_FILE $KERNEL ::/ mcopy -i $ESP_FILE $INITRD ::/ # now make our actual filesystem image # how big an image do we want? # it should be the size of our ESP file+1MB for BIOS boot + 1MB for MBR + 1MB for GPT ONEMB=$(( 1024 * 1024 )) SIZE_IN_BYTES=$(( $(stat -c %s "$ESP_FILE") + 4*$ONEMB )) # and make sure the ESP is bootable for BIOS mode # settings BLKSIZE=512 MB_BLOCKS=$(( $SIZE_IN_BYTES / $ONEMB )) # make the image dd if=/dev/zero of=$IMGFILE bs=1M count=$MB_BLOCKS ESP_SECTOR_START=2048 ESP_SECTOR_END=$(( $ESP_SECTOR_START + $ESP_FILE_SIZE_SECTORS - 1 )) # create the partitions - size of the ESP must match our image # and make sure the ESP is bootable for BIOS mode sgdisk --clear \ --new 1:$ESP_SECTOR_START:$ESP_SECTOR_END --typecode=1:ef00 --change-name=1:'EFI System' --partition-guid=1:$PARTUUID \ --attributes 1:set:2 \ $IMGFILE # copy in our EFI System Partition image dd if=$ESP_FILE of=$IMGFILE bs=$BLKSIZE count=$ESP_FILE_SIZE_SECTORS conv=notrunc seek=$ESP_SECTOR_START ) cat $IMGFILE