From a32aa179fa4f5d914da176aa0ccceb9b5cd13535 Mon Sep 17 00:00:00 2001 From: Christian Kellner Date: Mon, 22 Feb 2021 16:53:39 +0100 Subject: [PATCH] Transition existing installations to unified GRUB configuration The previous commits, especially b14117, unified the grub config locations across all platforms. In brief, this means that in the case of EFI, the config file in the EFI System Partition (ESP) is now meant to be a small stub config file that will in turn load the main configuration in /boot/grub2, which is used on all other platforms as well. For new installations all this is done by the Anaconda installer. But existing installations also need to be adapted. Add a %posttrans script to the grub2-common package that will, if a non-unified installation is detected, transition it into a unified one. This is done by moving the main grub.cfg file from the ESP to /boot/grub2, creating minimal stub on the ESP instead. Additionally, the grubenv file is also moved from the ESP to /boot/grub2. The detection of the non-unified installation is done by checking if the grub.cfg on the ESP contains the 'configfile' directive. If so, it is assumed the system has a unified grub configuration. Signed-off-by: Christian Kellner --- grub2.spec | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/grub2.spec b/grub2.spec index df3a43b..f518ee4 100644 --- a/grub2.spec +++ b/grub2.spec @@ -344,6 +344,35 @@ mv -f /boot/grub2.tmp/*.mod \ /boot/grub2/ && rm -r /boot/grub2.tmp/ || : +%posttrans common +set -eu + +EFI_HOME=/boot/efi/EFI/fedora +GRUB_HOME=/boot/grub2 + +if grep -q "configfile" ${EFI_HOME}/grub.cfg; then + exit 0 # already unified, nothing to do +fi + +# create a stub grub2 config in EFI +BOOT_DEVICE=$(df -P /boot | awk 'END{print $1}') +BOOT_UUID=$(blkid -s UUID -o value "${BOOT_DEVICE}") +GRUB_DIR=$(grub2-mkrelpath ${GRUB_HOME}) + +cat << EOF > ${EFI_HOME}/grub.cfg.stb +search --no-floppy --fs-uuid --set=dev ${BOOT_UUID} +set prefix=(\$dev)${GRUB_DIR} +export \$prefix +configfile \$prefix/grub.cfg +EOF + +cp -av ${EFI_HOME}/grubenv ${EFI_HOME}/grubenv.rpmsave +mv --force ${EFI_HOME}/grubenv ${GRUB_HOME}/grubenv + +cp -av ${EFI_HOME}/grub.cfg ${EFI_HOME}/grub.cfg.rpmsave +cp -av ${EFI_HOME}/grub.cfg ${GRUB_HOME}/ +mv ${EFI_HOME}/grub.cfg.stb ${EFI_HOME}/grub.cfg + %files common -f grub.lang %dir %{_libdir}/grub/ %dir %{_datarootdir}/grub/