Conversie Fedora van GRUB naar systemd-boot: deel 2

In de eerste revisie van deze blog stond een vrij ernstige tikfout (het verwijderen van /boot/efi/EFI/ in zijn geheel). Dat is bij deze opgelost.

In het eerste deel van dit verhaal is de eerste (ruwe) versie van dit proces te zien. Deze eerste stap is inmiddels ongeveer 3 jaar geleden en de techniek is inmiddels een stuk verder.

Het is vanaf nu niet meer nodig om zelf (bash)scripts te schrijven om de kernzaken te regelen. Dat kan met een paar aanpassingen in een configuratiebestand.

Het hele proces komt nu neer op het volgende:

  1. Software installeren die nodig is voor de conversie
  2. De configuratie voor systemd-boot aanpassen voor de conversie
  3. De plugins voor systemd-boot aanpassen voor de conversie
  4. Dracut configureren voor de conversie
  5. De ESP (EFI System Partition) opschonen
  6. De al bestaande kernels genereren met kernel-install

Software installeren die nodig is voor de conversie

In tegenstelling tot de eerste versie van deze conversie is het enige pakket wat nodig is is systemd-ukify, wat op Fedora vanaf de commandline te installeren is als volgt:

sudo dnf install systemd-ukify

De configuratie voor systemd-boot aanpassen voor de conversie

In een standaard Fedora installatie is systemd-boot al geïnstalleerd en doet gedeeltelijk zijn werk, in combinatie met GRUB in een hybride opstelling. Om dit “recht” te trekken moet je de configuratie voor systemd-boot in /etc/kernel/install.conf aanpassen. Voeg het volgende toe aan het einde van het bestand:

layout=uki
initrd_generator=dracut
uki_generator=ukify

Als laatste om ervoor te zorgen dat er een nette titel in het bootmenu komt, maak een nieuw bestand /etc/kernel/entry-token aan met fedora als inhoud:

echo fedora | tee /etc/kernel/entry-token

De plugins voor systemd-boot aanpassen voor de conversie

In een standaard Fedora installatie voert het systeem bij het installeren van een nieuwe kernel de bestanden uit in /usr/lib/kernel/install.d/ en in /etc/kernel/install.d/. Die laatste map is standaard leeg, en is er voor lokale aanpassingen.

De standaard bestanden in /usr/lib/kernel/install.d/ zijn bijna allemaal niet nodig of geschikt, dus kies ik ervoor om ze allemaal uit te schakelen om mee te beginnen, en daarna de bestanden die wél nodig zijn weer geschikt te maken.

Voor het allemaal uitschakelen doe ik het volgende:

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

De bestanden die wél nodig zijn:

Om deze drie dus weer in te schakelen:

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

Als laatste is er nog één bestand nodig om wat zaken op te schonen bij het updaten van een kernel: /etc/kernel/install.d/95-clean-symvers.install met het volgende erin:

#!/usr/bin/env bash

COMMAND="${1:?}"
KERNEL_VERSION="${2:?}"

case "$COMMAND" in
	remove)
		rm -f -- /boot/symvers-$KERNEL_VERSION.xz
	;;
esac

exit 0

Maak dit bestand uitvoerbaar, anders word er niks mee gedaan, met sudo chmod +x /etc/kernel/install.d/95-clean-symvers.install.

Dracut configureren voor de conversie

Dracut zal in principe werken, maar heeft een paar opties die het leven wat makkelijker maken. Maak een nieuw bestand /etc/dracut.conf.d/ukify.conf aan met de volgende inhoud:

hostonly=yes
kernel_cmdline="$(< /etc/kernel/cmdline)"
do_strip=yes

De ESP (EFI System Partition) opschonen

In een standaard Fedora installatie worden de kernel en initrd bestanden geschreven naar /boot/efi/EFI/(map met je machine id)/, wat niet de bedoeling is. Dit is opgelost met de configuratieaanpassingen in stap 2, dus kun je de zaken die niet meer nodig zijn in /boot/efi/EFI weghalen:

MACHINE_ID="$(< /etc/machine-id)"
sudo rm -ri /boot/EFI/
sudo rm -ri /boot/loader/
sudo rm -ri /boot/efi/EFI/$MACHINE_ID/
sudo rm -ri /boot/efi/EFI/loader/entries/*

sudo mkdir /boot/efi/EFI/Linux/

De al bestaande kernels genereren met kernel-install

En als laatste alle al geïnstalleerde kernels (opnieuw) genereren met kernel-install:

sudo kernel-install -v add-all

Dat was alles. Als alles goed is gegaan heb je nu (maximaal) 3 efi bestanden in de map /boot/efi/EFI/Linux.