summary refs log tree commit diff
path: root/os/etc/kernel/postinst.d/efi.sh.bak
blob: 5d63729e4a6198f609d24be2fe8608559d261e27 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#!/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."