#!/bin/sh set -e gen_efi_boot_img(){ local platform="$1" local efi_name="$2" local netboot_prefix="$3" local outdir="grub-efi-temp-${platform}" "${LIVE_BUILD_PATH}/efi-image" "/$outdir" "$platform" "$efi_name" "$netboot_prefix" mkdir -p /grub-efi-temp/EFI/boot mcopy -m -n -i /$outdir/efi.img '::efi/boot/boot*.efi' /grub-efi-temp/EFI/boot cp -a ""/$outdir/* "/grub-efi-temp/" # Secure Boot support: # - create the EFI directory in the ESP with uppercase letters to make # certain firmwares (eg: TianoCore) happy # - use shim as the boot.efi that gets loaded first by the firmware # - drop a grub.cfg (same reason as below) in the cfg directory as configured # by the signed grub efi binary creation. This is set dynamically when grub2 is # built with the ouput of dpkg-vendor, and can be overridden by the builder, so # we do the same here in live-build. # - the source paths are taken from shim-signed: # https://packages.debian.org/sid/amd64/shim-signed/filelist # and grub-efi-amd64-signed, currently in Ubuntu: # https://packages.ubuntu.com/xenial/amd64/grub-efi-amd64-signed/filelist # https://packages.ubuntu.com/bionic/arm64/grub-efi-arm64-signed/filelist # E.g., gcdx64.efi.signed is the boot loader for removable device, like CD or # USB flash drive, while grubx64.efi.signed is for hard drive. # Therefore here gcdx64.efi.signed is used for amd64 and gcdaa64.efi.signed is # for arm64. if [ -r /usr/lib/grub/$platform-signed/gcd$efi_name.efi.signed -a -r /usr/lib/shim/shim$efi_name.efi.signed -a "enable" != "disable" ]; then cp -a /usr/lib/grub/$platform-signed/gcd$efi_name.efi.signed /grub-efi-temp/EFI/boot/grub$efi_name.efi cp -a /usr/lib/shim/shim$efi_name.efi.signed /grub-efi-temp/EFI/boot/boot$efi_name.efi fi } PRE_EFI_IMAGE_PATH="/working_dir/tmp/amd64/local/bin:/working_dir/tmp/amd64/local/bin:/working_dir/tmp/amd64/local/bin:/working_dir/tmp/amd64/local/bin:/working_dir/tmp/amd64/local/bin:/working_dir/tmp/amd64/local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" if [ ! -e "" ] ; then LIVE_BUILD_PATH="/usr/lib/live/build" else LIVE_BUILD_PATH="/scripts/build" fi PATH="/working_dir/tmp/amd64/local/bin:/working_dir/tmp/amd64/local/bin:/working_dir/tmp/amd64/local/bin:/working_dir/tmp/amd64/local/bin:/working_dir/tmp/amd64/local/bin:/working_dir/tmp/amd64/local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:${LIVE_BUILD_PATH}" # Make sure grub-cpmodules is used as if it was installed in the system case "amd64" in amd64|i386) gen_efi_boot_img "x86_64-efi" "x64" "debian-live/amd64" gen_efi_boot_img "i386-efi" "ia32" "debian-live/i386" PATH="${PRE_EFI_IMAGE_PATH}" ;; arm64) gen_efi_boot_img "arm64-efi" "aa64" "debian-live/arm64" PATH="${PRE_EFI_IMAGE_PATH}" ;; armhf) gen_efi_boot_img "arm-efi" "arm" "debian-live/arm" PATH="${PRE_EFI_IMAGE_PATH}" ;; esac # On some platforms the EFI grub image will be loaded, so grub's root # variable will be set to the EFI partition. This means that grub will # look in that partition for a grub.cfg file, and even if it finds it # it will not be able to find the vmlinuz and initrd. # Drop a minimal grub.cfg in the EFI partition that sets the root and prefix # to whatever partition holds the /.disk/info file, and load the grub # config from that same partition. mkdir -p /grub-efi-temp-cfg cat >/grub-efi-temp-cfg/grub.cfg </dev/null mmd -i "/grub-efi-temp/boot/grub/efi.img" ::EFI mmd -i "/grub-efi-temp/boot/grub/efi.img" ::EFI/boot mcopy -m -o -i "/grub-efi-temp/boot/grub/efi.img" /grub-efi-temp/EFI/boot/*.efi "::EFI/boot" mmd -i "/grub-efi-temp/boot/grub/efi.img" ::boot mmd -i "/grub-efi-temp/boot/grub/efi.img" ::boot/grub mcopy -m -o -i "/grub-efi-temp/boot/grub/efi.img" /grub-efi-temp-cfg/grub.cfg "::boot/grub"