Sinds een paar jaar ben ik bekend met systemd-boot als vervanger voor GRUB. De werking ervan was tot een paar maanden geleden niet helemaal duidelijk, maar daar is met een recent aangekondigde wijziging in Fedora verandering in gekomen.

Werking

Onderhuids word systemd-boot al gebruikt in Fedora (Workstation). GRUB maakt hier op zijn beurt weer gebruik van, hier is de instelling GRUB_ENABLE_BLSCFG=true in het configuratiebestand /etc/default/grub voor. Bij een kernel update word de configuratie voor GRUB gedaan via configuratiebestanden in /boot/loader/entries/*.conf. Deze configuratiebestanden zijn 1:1 compatible met systemd-boot, omdat ze gegenereerd worden door de kernel-install (zie man -k kernel-install) tool die ook het zware werk doet in een systeem met systemd-boot.

TL;DR: GRUB leest alleen de configuratie in die door een andere tool is gemaakt en gebruikt deze. De tijd dat GRUB zelf zijn boot opties genereerde is over.

Onderzoek werking en conversie

Toen dit eenmaal duidelijk was kwam bij mij de vraag naar boven of het dan ook mogelijk was om GRUB geheel te verwijderen en systemd-boot te (her)installeren en zo te configureren dat dit het booten van het systeem helemaal voor zijn rekening nam.

Het zoeken naar informatie hierover online was veelbelovend. Er zijn Linuxdistributies die standaard systemd-boot gebruiken, bijvoorbeeld Pop!_OS. De spreekwoordelijke duivel zit hier in de details, want de installatie van systemd-boot is zo spannend niet, maar het correct configureren van alle onderdelen bleek achteraf meer werk te zjn dan ik gedacht had.

Configuratie

Het configureren van systemd-boot zodat het zijn werk doet op Fedora leek mij in eerste instantie niet heel lastig, immers worden delen van systemd-boot en andere tools die er gebruik van maken al gebruikt in het huidige bootproces van Fedora met GRUB (en de GRUB_ENABLE_BLSCFG instelling).

Dat bleek achteraf toch niet helemaal te kloppen. Het boot proces op een moderne machine is wat complexer dan je zou verwachten, zeker als je zaken als offline updaten en offline upgraden mee neemt. Sites als Geeks for Geeks hebben een vrij duidelijke beschrijving hoe het booten van een systeem met systemd-boot werkt gepubliceerd, waar ik zeker in het begin goed gebruik van gemaakt heb.

Schone configuratie

Een van de configuratiezaken die op een standaard geïnstalleerd Fedora (Workstation) systeem aan de hand is is het bestaan van de map /boot/loader/. Hierin bevinden zich, zoals hierboven kort beschreven, alle configuratiebestanden voor de bootloader die tijdens een kernel installatie aangemaakt worden door kernel-install.

Het probleem met deze locatie is dat het zich niet op de ESP van het systeem bevind. De reden dat deze map zich daar bevind is zodat, in een standaard installatie, zowel GRUB als systemd-boot (en de tools die in de keten zitten) de benodigde bestanden kunnen lezen en schrijven zonder problemen.

Als GRUB verwijderd word is deze map hier niet handig, want systemd-boot zoekt namelijk eerst op andere plaatsen. Dus, die map moest weg.

De rest van de (her)configuratie van systemd-boot was eigelijk vrij simpel. Een groot deel van het werk is door de ontwikkelaars achter Fedora al gedaan, het is alleen een kwestie van een aantal (kleine) zaken aanpassen.

Het uitschakelen van bepaalde stappen

Tijdens het installeren van een nieuwe kernel word de tool kernel-install gebruikt. Deze voert de inhoud van de mappen /usr/lib/kernel/install.d/* en /etc/kernel/install.d/* uit, in volgorde. Als er twee gelijke bestanden (met dezelfde naam) bestaan in /usr/lib/kernel/install.d/ en /etc/kernel/install.d dan heeft het bestand in /etc/kernel/install.d meer prioriteit.

Dit feitje kan dus ook gebruikt worden om bepaalde (ongeweste) delen van dit proces uit te schakelen. Als het bestand in /etc/kernel/install.d/ een symlink is naar /dev/null zal die code niet uitgevoerd worden, en ook het bestand met dezelfde naam in /usr/lib/kernel/install.d/ zal worden genegeerd.

De twee zaken die in mijn onderzoek en experimenten naar boven kwamen die uitgeschakeld moeten worden zijn 51-dracut-rescue.install en 92-crashkernel.install. De eerste maakt een ‘recovery’ kernel en bijbehorende bootloader optie aan zodat je in geval van nood je systeem kunt redden. De manier waarop dit gebeurt is (momenteel) niet compatible met systemd-boot, en zorgt voor een kernel die weigert op te starten. Dat heeft dus geen zin, en vandaar de uitschakeling.

Update juni 2023

Met een kleine aanpassingen is het wel mogelijk een werkende recovery kernel te maken. Hier ben ik naar aan het kijken, als ik daar meer duidelijkheid over heb pas ik deze post waar nodig aan.

De tweede is zodat als er een kernel crash is eventuele fouten opgeslagen worden op schijf of naar het netwerk. Ook dit is door de manier waarop systemd-boot werkt (en hoe de kernels worden gemaakt, meer hierover later) niet werkbaar.

Het uitschakelen hiervan gebeurt door een symlink te maken met de naam van de twee bestanden naar /dev/null, als volgt

sudo ln -sv /dev/null /etc/kernel/install.d/51-dracut-rescue.install
sudo ln -sv /dev/null /etc/kernel/install.d/92-crashkernel.install

Overzicht

In een vorige versie van dit document stonden alle stappen en aanpassingen en code netjes hier met uitleg. Aangezien er vier (4) hoofdstromingen zijn om dit te regelen en te doen was dat niet echt te beheren meer. Vandaar dat ik alle code gebundeld heb en in een project op mijn GitHub geplaatst heb. Daar vind je alle code overzichtelijk op één plaats met tekst, uitleg en andere handige zaken.

Neem eens een kijkje zou ik zeggen, probeer het uit. Als je ergens tegenaan loopt kun je een nieuw issue openen zodat ik (of iemand anders) ernaar kan kijken!

Update juni 2023

De ontwikkelaars achter Fedora zijn van plan om systemd-boot standaard te ondersteunen. Voorlopig is er halve ondersteuning voor in Fedora Everything Rawhide, als je de optie inst.sdboot meegeeft zal de installatie proberen systemd-boot te installeren in plaats van GRUB. Momenteel gaat dit fout omdat het pakket wat gevraagd word (sdubby) momenteel nog niet in de softwarerepo’s van Fedora zit.