| ## @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}" |