#!/bin/sh set -eu VERSION=$1 BOOTDIR=$(dirname "$2") label="Gentoo Linux" efiPart=/boot/efi efiDir="/EFI/Gentoo" mount "${efiPart}" || true mount -o remount,rw /sys/firmware/efi/efivars trap '{ umount ${efiPart}; mount -o remount,ro /sys/firmware/efi/efivars; }' EXIT efiKernel="vmlinuz-${VERSION}.efi" efiInitramfs="initramfs-${VERSION}.img" while read -r line; do id="${line:4:4}" path=$(egrep -o 'File\([^(]*\)' <<<"${line}") path="${path:5:-1}" path="${path//\\/\/}" path=$(basename "${path}") kernel=$path initramfs=${path//boot/initramfs} initramfs=${initramfs//efi/img} # cleanup old boot entries efibootmgr --delete-bootnum --bootnum "${id}" rm -v "${efiPart}${efiDir}/${kernel}" || true rm -v "${efiPart}${efiDir}/${initramfs}" || true done < <(efibootmgr -v | grep '^Boot0[^ ]*.*HD*' | grep "$label") cp -vf "${BOOTDIR}/vmlinuz-${VERSION}" "${efiPart}${efiDir}/${efiKernel}" cp -vf "${BOOTDIR}/initramfs-${VERSION}.img" "${efiPart}${efiDir}/${efiInitramfs}" cp -vf "${BOOTDIR}/vmlinuz-${VERSION}.old" "${efiPart}${efiDir}/${efiKernel}.old" cp -vf "${BOOTDIR}/initramfs-${VERSION}.img.old" "${efiPart}${efiDir}/${efiInitramfs}.old" efiDir="${efiDir,,}" # make lowercase efiDir="${efiDir//\//\\}" # map to backslash seperators # create in reverse order so new kernel ends up at the top efibootmgr --create --disk /dev/nvme0n1 --part 1 --label "$label (old)" --loader "${efiDir}\\${efiKernel}.old" -u "initrd=${efiDir}\\${efiInitramfs}.old" efibootmgr --create --disk /dev/nvme0n1 --part 1 --label "$label" --loader "${efiDir}\\${efiKernel}" -u "initrd=${efiDir}\\${efiInitramfs}" echo echo "done."