#!/usr/bin/env bash # https://github.com/kraxel/imagefish ###################################################################### # defaults iso="" img="" cfg="" ###################################################################### # create work dir function msg() { local txt="$1" local bold="\x1b[1m" local normal="\x1b[0m" echo -e "${bold}### ${txt}${normal}" } function do_cleanup() { msg "cleaning up ..." if test "$GUESTFISH_PID" != ""; then guestfish --remote -- exit >/dev/null 2>&1 || true fi sudo rm -rf "$WORK" } WORK="${TMPDIR-/var/tmp}/${0##*/}-$$" mkdir "$WORK" || exit 1 trap 'do_cleanup' EXIT BASE="$(dirname $0)" ###################################################################### # parse args function print_help() { cat < --img --cfg EOF } while test "$1" != ""; do case "$1" in --iso) iso="$2" shift; shift ;; --img) img="$2" shift; shift ;; --cfg) cfg="$2" shift; shift ;; esac done ###################################################################### # guestfish script helpers function fish() { echo "#" "$@" guestfish --remote -- "$@" || exit 1 } function fish_init() { local format case "$img" in *.raw) format="raw" ;; *) format="qcow2";; esac msg "creating and adding disk image" fish disk-create $img $format 384M fish add $img fish run } function fish_fini() { fish umount-all } ###################################################################### # sanity checks if test ! -f "$cfg"; then echo "ERROR: cfg not found: $cfg" exit 1 fi if test -f "$img"; then if test "$allow_override" = "yes"; then rm -f "$img" else echo "ERROR: image exists: $img" exit 1 fi fi ###################################################################### # go! msg "copy files from local folder" BASE="$(dirname $0)" cp -a $BASE/EFI $WORK find "$WORK" #msg "[debug] list drivers in EFI/OC" #(cd $WORK/EFI/OC; find driver* -print) export LIBGUESTFS_BACKEND=direct eval $(guestfish --listen) if test "$GUESTFISH_PID" = ""; then echo "ERROR: starting guestfish failed" exit 1 fi fish_init msg "partition disk image" fish part-init /dev/sda gpt fish part-add /dev/sda p 2048 300000 fish part-add /dev/sda p 302048 -2048 fish part-set-gpt-type /dev/sda 1 C12A7328-F81F-11D2-BA4B-00A0C93EC93B fish part-set-bootable /dev/sda 1 true fish mkfs vfat /dev/sda1 label:EFI fish mkfs vfat /dev/sda2 label:OpenCoreBoot fish mount /dev/sda2 / fish mkdir /ESP fish mount /dev/sda1 /ESP msg "copy files to disk image" cp -v "$cfg" $WORK/config.plist fish mkdir /ESP/EFI fish mkdir /ESP/EFI/OC fish mkdir /ESP/EFI/OC/Kexts fish mkdir /ESP/EFI/OC/ACPI fish mkdir /ESP/EFI/OC/Resources fish mkdir /ESP/EFI/OC/Tools fish copy-in $WORK/EFI/BOOT /ESP/EFI fish copy-in $WORK/EFI/OC/OpenCore.efi /ESP/EFI/OC fish copy-in $WORK/EFI/OC/Drivers /ESP/EFI/OC/ fish copy-in $WORK/EFI/OC/Kexts /ESP/EFI/OC/ fish copy-in $WORK/EFI/OC/ACPI /ESP/EFI/OC/ fish copy-in $WORK/EFI/OC/Resources /ESP/EFI/OC/ fish copy-in $WORK/EFI/OC/Tools /ESP/EFI/OC/ # Note fish copy-in startup.nsh / BASE="$(dirname $0)" fish copy-in "$WORK/config.plist" /ESP/EFI/OC/ fish find /ESP/ fish_fini