blob: 99807d7291b6ae41044f0616720dbde417c63573 [file] [log] [blame]
## @file
# Build a version of grub capable of decrypting a luks volume with a SEV
# Supplied secret
#
# Copyright (C) 2020 James Bottomley, IBM Corporation.
#
# SPDX-License-Identifier: BSD-2-Clause-Patent
#
##
set -e
remove_efi=1
cleanup() {
# remove the intermediates
for f in disk.fat grub-bootstrap.cfg; do
rm -f -- "${basedir}/$f"
done
if [ $remove_efi -eq 1 ]; then
rm -f -- "${basedir}/grub.efi"
fi
}
trap cleanup EXIT
GRUB_MODULES="
part_msdos
part_gpt
cryptodisk
luks
gcry_rijndael
gcry_sha256
ext2
btrfs
xfs
fat
configfile
memdisk
sleep
normal
echo
test
regexp
linux
linuxefi
reboot
sevsecret
"
basedir=$(dirname -- "$0")
# don't run a build if grub.efi exists and is newer than the config files
if [ -e "${basedir}/grub.efi" ] && \
[ "${basedir}/grub.efi" -nt "${basedir}/grub.cfg" ] && \
[ "${basedir}/grub.efi" -nt "${basedir}/grub.sh" ]; then
remove_efi=0
echo "preserving existing grub.efi" >&2
exit 0
fi
##
# different distributions have different names for grub-mkimage, so
# search all the known ones
##
mkimage=
for b in grub2-mkimage grub-mkimage; do
if which "$b" > /dev/null 2>&1; then
mkimage="$b"
break
fi
done
if [ -z "$mkimage" ]; then
echo "Can't find grub mkimage" >&2
exit 1
fi
# GRUB's rescue parser doesn't understand 'if'.
echo 'normal (memdisk)/grub.cfg' > "${basedir}/grub-bootstrap.cfg"
# Now build a memdisk with the correct grub.cfg
rm -f -- "${basedir}/disk.fat"
mkfs.msdos -C -- "${basedir}/disk.fat" 64
mcopy -i "${basedir}/disk.fat" -- "${basedir}/grub.cfg" ::grub.cfg
${mkimage} -O x86_64-efi \
-p '(crypto0)' \
-c "${basedir}/grub-bootstrap.cfg" \
-m "${basedir}/disk.fat" \
-o "${basedir}/grub.efi" \
${GRUB_MODULES}
remove_efi=0
echo "grub.efi generated in ${basedir}"