GRUB naar systemd-boot en UKI conversie

Geschreven op en bijgewerkt op

Inhoudsopgave

Inleiding.

Deze handleiding helpt je met het omzetten van een bestaande Fedora installatie van GRUB naar systemd-boot.

Dit is niet iets wat je zomaar eventjes doet. Neem dus goed de tijd voor deze handleiding en zorg voor backups van al je gegevens.

GRUB verwijderbaar maken.

Fedora is geconfigureerd dat het pakket GRUB beschermd is en dus niet zomaar verwijderd kan worden. Om ervoor te zorgen dat je het tóch kunt verwijderen moet je de configuratiebestanden in /etc/dnf/protected.d/ van grub verwijderen. Dat doe je als volgt:

sudo find /etc/dnf/protected.d/ -type f -iname "grub2*" -delete

Shim verwijderbaar maken.

Wat voor het pakket grub geld geld ook voor het pakket shim in Fedora. Dit pakket zorgt ervoor dat Fedora met GRUB werkt op systemen met Secure Boot en de standaard Microsoft sleutel(s), wat dus zo’n 80%+ van de markt is.

Voordat shim verwijderd kan worden moet eerst het beschermende configuratiebestand verwijderd worden:

sudo rm /etc/dnf/protected.d/shim.conf

GRUB en shim verwijderen.

Na het verwijderbaar maken van deze dingen nu het ook echt verwijderen ervan. Dat kan met dit commando.

sudo dnf remove grub2 shim mactel-boot

Systemd-boot, systemd-ukify en sdubby installeren.

Nu grub en shim weg zijn is het tijd om software te gaan installeren.

sudo dnf install systemd-boot-unsigned systemd-ukify sdubby

Ook is het een goed idee om systemd-boot-unsigned en systemd-ukify te beschermen zodat dit niet per ongeluk verwijderd kan worden, net als met grub en shim. Om dat te doen moet je twee nieuwe configuratiebestanden, /etc/dnf/protected.d/systemd-boot-unsigned.conf en /etc/dnf/protected.d/systemd-ukify.conf, aanmaken met als inhoud de naam van de pakketten (dus systemd-boot-unsigned en systemd-ukify). Dat kan gelukkig met de volgende oneliners:

sudo echo systemd-boot-unsigned > /etc/dnf/protected.d/systemd-boot-unsigned.conf
sudo echo systemd-ukify > /etc/dnf/protected.d/systemd-ukify.conf
sudo echo sdubby > /etc/dnf/protected.d/sdubby.conf

SELinux context.

Omdat het configuratiebestand vat je net hebt aangemaakt niet standaard aanwezig is heeft dit ook niet de juiste SELinux label(s). Dit kun je rechttrekken met

sudo restorecon -RvF /etc/dnf/protected.d/*.conf

Opruimen mappen en bestanden van /boot.

Nu grub verwijderd is zijn er aantal mappen en bestanden in de /boot map die niet meer nodig zijn en verwijderd kunnen worden.

Let op dat dit mogelijk een gevaarlijk iets is. Eventueel kun je deze stap ook overslaan als je dat verstandiger lijkt.

De volgende mappen (en structuur) is nodig om je computer te kunnen blijven gebruiken. Al het andere kan weg.

/boot/
- efi/
- - EFI/
- - - BOOT/
- - - - BOOTX64.EFI
- - - Linux/
- - - systemd/
- - - - systemd-bootx64.efi
- - loader/
- - - entries/
- - - loader.conf
- - - random-seed

Maak je geen zorgen als je niet alle bestanden hebt zoals BOOTX64.EFI en systemd-bootx64.efi, die worden automatisch hersteld in een volgende stap van deze handleiding.

Aanmaken (configuratie)bestanden in /boot.

Nu dat de /boot map (ver) leeg is kun je beginnen met het aanmaken van de benodige (configuratie)bestanden. Bij veel van deze bestanden gebeurt dit ook automatisch, maar dan moet je deze achteraf aanpassen.

/boot/efi/loader/loader.conf

Plaats het volgende in /boot/efi/loader/loader.conf:

timeout 5
auto-firmware no
console-mode keep
secure-boot-enroll mannual

Kernel configuratie.

Dit klinkt een stuk serieuzer dan het is. Met deze stap configureer je hoe Fedora omgaat met de kernel bij een (systeem)update, waardoor je een werkend systeem houd zonder dat je hier naar om hoeft te kijken.

Opties toevoegen aan /etc/kernel/install.conf

Voeg de volgende drie regels toe aan het einde van /etc/kernel/install.conf. Let op: dit bestand bestaat al, zorg ervoor dat je de regels toevoegt!

layout=uki
initrd_generator=dracut
uki_generator=ukify

Plugins uitschakelen die niet nodig zijn.

Het systeem om updates te doen voor de kernel heeft een aantal plugins die niet meer nodig zijn. Gelukkig zijn deze vrij simpel uit te schakelen.

for CONF in $(find /usr/lib/kernel/install.d/*.install -type f); do
	sudo ln -sv /dev/null /etc/kernel/install.d/$(basename $CONF)
done

Dit schakelt alle plugins uit, ook de drie die je nodig hebt. Schakel deze weer in als volgt:

sudo rm /etc/kernel/install.d/{50-dracut,60-ukify,90-uki-copy}.install

Verder is het nodig dat je zelf één plugin schrijft om oude bestanden op te schonen na een upgrade/update. Plaats het volgende in /etc/kernel/install.d/95-kernel-cleanup.install:

#!/bin/bash

COMMAND="${1:?}"
KERNEL_VERSION="${2:?}"
UKI_DIR=$(bootctl -p)/EFI/Linux
ENTRY_TOKEN=$(< /etc/kernel/entry-token)
LOG_LABEL=kernel-cleanup

case "$COMMAND" in
	remove)
		if [[ -f "$UKI_DIR/$ENTRY_TOKEN-$KERNEL_VERSION.efi" ]]; then
			systemd-cat -t $LOG_LABEL -- echo 'Removing $ENTRY_TOKEN-KERNEL_VERSION.efi from $UKI_DIR"
			exec rm -rf "$UKI_DIR/$ENTRY_TOKEN-$KERNEL_VERSION.efi"
		fi
		
		if [[ -f "/boot/symvers-$KERNEL_VERSION.xz" ]]; then
			systemd-cat -t $LOG_LABEL -- echo "Removing /boot/symvers-$KERNEL_VERSION.xz"
			exec rm -rf "/boot/symvers-$KERNEL_VERSION.xz"
		fi
	;;
esac

exit 0

Maak deze plugin hierna uitvoerbaar en herstel daana de SELinux context van alle plugin bestanden in de map:

sudo chmod +x /etc/kernel/install.d/95-kernel-cleanup.install
sudo restorecon -RvF /etc/kernel/

Configuratie dracut.

Het volgende is dracut. Dit houd zich in deze situatie bezig met het daadwerkelijk maken (bouwen) van de UKI images die je systeem gebruikt om vanaf op te starten.

Plaats de volgende regels in een nieuw configuratiebestand /etc/dracut.conf.d/ukify.conf:

show_modules=no
hostonly=yes
kernel_cmdline="$(< /etc/kernel/cmdline)"
do_strip=yes
agressive_strip=yes
compress=zstd
squash_compress=zstd

Om ervoor te zorgen dat Fedora het ook echt gebruikt moet je het SELinux label goed zetten met

sudo restorecon -RvF /etc/dracut.conf.d/ukify.conf

Herschrijven van /etc/kernel/cmdline.

Standaard komt Fedora met een configuratiebestand /etc/kernel/cmdline. Voor een UKI is dit niet voldoende en moet dit herschreven worden.

Om te beginnen is het een heel verstandig idee om een kopie te maken van het bestaande bestand:

sudo cp /etc/kernel/cmdline /etc/kernel/cmdline.old

En dan het volgende om een nieuww versie te maken:

DEVICE=$(findmnt -n -o SOURCE -v /)
PARTUUID=$(blkid $DEVICE -o value -s PARTUUID)
SUBVOLID=$(findmnt -n -o OPTIONS / | grep -E "subvolid=([0-9])*)" -o | cut -d "=" -f2)
echo "ro rhgb quiet root=PARTUUID=$PARTUUID rootflags=subvolid=$SUBVOLID" > /etc/kernel/cmdline

Lees goed het nieuwe bestand na of er geen tikfouten inzitten.

Genereer UKI image(s).

Nu alles zover is kun je de images gaan maken. Dat is te doen met

sudo kernel-install -v add-all

Installeren systemd-boot bestanden.

Als laatste moeten de bestanden van systemd-boot geïnstalleerd worden. Dat doe je met:

sudo bootctl install

Klaar!

Na het succesvol installeren van bootctl heb je de conversie met succes (als alles goed is gegaan) gedaan. Om het zeker te weten is het een slim idee om nu je computer te herstarten. Als je gewoon weer Fedora voor je neus krijgt is alles goed gegaan.

Geen timeout voor booten inschakelen.

Standaard heeft het systemd-boot menu een wachttijd van 5 seconden. Wil je dit niet? Pas dan de regel timeout 5 aan naar timeout 0 in het configuratiebestand /boot/efi/loader/loader.conf.