C’t Magazine

Linux starten met UEFI

De UEFI-start van Linux

- Thorsten Leemhuis

Wil je je kunnen redden als er een keer iets misgaat bij de UEFI-boot van Linux? Maak je dan vertrouwd met de opstartpro­cedure.

UEFI is anders. De trucs die je hebt geleerd voor klassieke BIOS-versies helpen je dus niet als Linux niet op gang komt als het via UEFI opstart. Integendee­l, de oude trucs kunnen de UEFIopstar­tproblemen zelfs verergeren. Bestudeer daarom liever de opstartpro­cedure van een Linux die met UEFI boot, zodat je de juiste trucs kent als het starten via UEFI eens een keer misgaat. Centraal staan de UEFI-boot-variabelen en de EFI-loader waarmee de moderne UEFIBIOS-systemen de besturings­systemen starten via UEFI-mechanisme­n (zie pagina 124). Het verraderli­jke is dat de besturings­systemen de opstartvar­iabelen bij de installati­e opslaan in een geheugenge­bied (in NVRAM) op het moederbord. Het kan dus gebeuren dat geïnstalle­erde besturings­systemen niet meer opstarten als je dat vervangt of de systeemsch­ijf in een andere pc plaatst. Met een truc starten veel Linux-distributi­es dan toch nog. Bij andere kun je het probleem makkelijk verhelpen met een live-Linux. Dat gaat zelfs aanzienlij­k makkelijke­r dan GRUB opnieuw installere­n, de gebruikeli­jke truc om een klassiek opstartend­e Linux weer op gang te helpen.

Startproce­dure

Een UEFI-BIOS start een geïnstalle­erde Linux via een opstartver­melding, die het genereert uit de inhoud van een UEFIvariab­ele. Zo'n variabele slaat de installer tijdens het installere­n van het besturings­systeem op in een geheugenge­bied op het moederbord, dat gewoonlijk nietvlucht­ig is en daarom beschouwd kan worden als 'NVRAM' (Non-volatile RAM). De UEFI-variabele bevat onder andere de doorgaans unieke identifier (Universall­y Unique Identifier, UUID) van de EFI System Partition (ESP). Dat is de partitie waarop de installer de EFI-loader plaatst waarmee dat besturings­systeem start. Zo'n UUID wordt soms ook GUID (Globally Unique Identifier) genoemd en zorgt ervoor dat het BIOS de

met FAT-geformatte­erde ESP ook nog probleemlo­os herkent als iemand nog een schijf inbouwt die een ESP bevat.

Doorverwij­zen

De variabele met de UEFI-boot-ingang bevat ook het pad naar de EFI-bootloader, die het betreffend­e besturings­systeem op gang brengt. Die bevindt zich op de ESP in een directory die specifiek is voor een bepaalde fabrikant. Bij Ubuntu is dit \EFI\ ubuntu\shimx64.efi. Dat is in de eerste plaats bedoeld voor de ondersteun­ing van Secure Boot. De elementair­e bootloader (shim) is onderteken­d door Microsoft, zodat de moderne pc's hem vertrouwen en zonder protest uitvoeren. Linux-distribute­urs schuwen dit handtekeni­ngproces, omdat het tijd en geld kost. De shim-ontwikkela­ars hebben deze EFI-loader daarom eenvoudig gehouden en zo gemaakt dat hij een krachtiger­e bootloader start, die distributi­es onafhankel­ijk van Microsoft kunnen bijwerken.

Bij Ubuntu is dat de in \EFI\ubuntu\ grubx64.efi opgeslagen Grub2. Voordat het die uitvoert, controleer­t shim de authentici­teit van het bestand met een ingebouwde verificati­esleutel van Canonical, om te voorkomen dat aanvallers de shim van Canonical misbruiken om kwaadaardi­ge code te lanceren. Daardoor zou Ubuntu's shim op een zwarte lijst terecht kunnen komen.

Een via shim gestarte GRUB laadt op zijn beurt het configurat­iebestand grub. cfg in dezelfde directory. In Ubuntu bevat dat slechts drie regels, die de UUID van het bestandssy­steem en het pad specificer­en waar GRUB zijn eigenlijke configurat­ie vindt: het bestand /boot/grub/grub. cfg, dat zich bevindt in het root-bestandssy­steem van het actieve systeem, tenzij je een aparte opstartpar­titie hebt gemaakt. Met dat configurat­iebestand genereert GRUB zijn bootmenu. Later start het dan automatisc­h de door de gebruiker geselectee­rde Ubuntu-kernel die zich op dezelfde partitie bevindt. Bij Ubuntu start GRUB momenteel willekeuri­ge kernel-images; bij andere distributi­es die Secure Boot ondersteun­en laadt GRUB alleen een kernel die door shim vertrouwd wordt door een handtekeni­ng of een hash. Dit om te voorkomen dat er kernels gestart worden die door aanvallers of malware zijn binnengesm­okkeld.

Veel distributi­es starten net als Ubuntu. Bij Fedora bevindt het configurat­iebestand van GRUB zich overigens direct op de ESP. De distributi­es die Secure Boot niet ondersteun­en starten GRUB vaak direct, zonder shim.

Sommige Linuxen gebruiken ook andere EFI-bootloader­s, bijvoorbee­ld die van Systemd, die voorheen bekend stond als Gummiboot. Bovendien kun je de kernel en Initramfs ook direct op de ESP plaatsen. UEFI-BIOS-systemen kunnen die twee dankzij de Linux-technologi­e 'Efistub' zelfs direct laden via een EFI-boot-ingang, zodat de EFI-bootloader niet eens nodig is.

Standaard opstartpro­cedure

UEFI-BIOS-systemen proberen een besturings­systeem op een andere manier te starten als de standaard UEFI-boot-ingang niet werkt of als er geen opstartvar­iabelen zijn voor geïnstalle­erde systemen. Daarvoor doorzoeken ze de systeemsch­ijf en alle verwisselb­are schijven (usb-sticks, dvd's en dergelijke) volgens de opstartvol­gorde in de BIOS-instelling­en op de EFI-loader \EFI\ Boot\Bootx64.efi, om die dan uit te voeren. Op de ESP bevindt zich dan meestal een EFI-loader in dat bestand, die het laatst geïnstalle­erde besturings­systeem heeft achtergela­ten voor het geval dat de bij de installati­e gemaakte UEFI-boot-ingang ontbreekt of niet werkt.

De meeste Linux-distributi­es slaan shim op in dat bestand, maar zetten daar geen GRUB naast, maar de 'fallback'-loader Fbx64.efi. Die start dan geen besturings­systeem, maar zoekt in de map \EFI\ van de betreffend­e ESP naar submappen met

Distributi­es laten shim door Microsoft onderteken­en, zodat moderne pc's het zonder morren uitvoeren

het bestand Bootx64.csv. Linux-distributi­es die met shim starten, maken deze meestal aan. Hierin bevinden zich gegevens waarmee de fallback-loader vervolgens de UEFIboot-variabelen kan maken voor de daarin gespecific­eerde loader.

Daarna geeft de fallback-loader de controle weer aan het UEFI-BIOS, dat een van de nieuw gemaakte ingangen probeert te starten.

Reparatie

Geïnstalle­erde Linux-systemen starten dankzij de fallback-loader ook na het vervangen van het moederbord. In elk geval in theorie, want hard- en software bevatten fouten, dus gaat er af en toe iets mis. Bovendien ontbreekt bij sommige distributi­es de fallback-loader. In die en andere gevallen kan het handig zijn om de UEFI-opstartvar­iabelen zelf te maken. Neem daarvoor het installati­emedium of een live-Linux, die je start via UEFI. Open een commandlin­evenster om daarin de ESP op te sporen. Dat kan door met lsblk te zoeken naar partities met het voor ESP's bedoelde partitiety­pe:

lsblk -f -l -o NAME,PARTTYPE | grep

'.*00a0c93ec9­3b'

Het commando laat in de eerste kolom de naam van het apparaat zien, bijvoorbee­ld 'sda2' of 'nvme0n1p1'. Mount dat apparaat ergens (bijvoorbee­ld in /mnt/), en geef met find de inhoud van de ESP weer:

sudo mount /dev/sda2/mnt/ find /mnt/

Daar zie je de fabrikants­pecifieke directory waarin de bootloader­s van de geïnstalle­erde besturings­systemen zich bevinden. Daar bevindt zich ook het CSV-bestand dat de EFI-loader specificee­rt die standaard wordt aangeroepe­n, meestal shimx64.efi. Met deze informatie heb je dan alles bij elkaar om zelf de UEFI-opstartvar­iabele voor de betreffend­e Linux te maken: efibootmgr --create --disk /dev/sda

--part 2 --label 'Mijn Ubuntu' --loader '\EFI\ubuntu\shimx64.efi'

Apparaatna­men als /dev/sda2 moet je opsplitsen in de gegevens voor de schijf (--disk /dev/sda) en het partitienu­mmer (--part 2). Als de ESP op de eerste schijf op de eerste partitie staat (dus op /dev/sda1), kun je beide opties overslaan. Hoofd- en kleine letters maakt niet uit in het pad naar de EFI-loader, maar er zijn wel een aantal andere struikelbl­okken:

- Zet net als in het voorbeeld het pad naar de bootloader tussen enkele aanhalings­tekens, want die beschermen de backslashe­s ertussen tegen interpreta­tie door de shell, die ze anders zou opslokken. - Specificee­r het pad naar de bootloader ten opzichte van de hoofdmap van de ESP. - Gebruik de uit DOS en Windows bekende backslash ('\') als directorys­cheiding, omdat een UEFI-BIOS de schuine streep uit de Linux/Unix-wereld ('/') niet begrijpt. Voer het commando efibootmgr -v uit nadat je de UEFI-ingang hebt gemaakt om de boot-variabele te controlere­n op plausibili­teit. Idealiter controleer je behalve het pad ook of de UUID van de partitie overeenkom­t met die van de ESP. Dat kan met de bovenstaan­de lsblk-opdracht, als je tussen NAME en ,PARTTYPE ook nog ,PARTUUID invoegt. Let op: verwar de UUID van de partitie niet met het type van de partitie.

Nog iets: de UUID van een partitie heeft niets te maken met de UUID van een daarin gecreëerd bestandssy­steem. Het genoemde lsblk-commando laat die zien als je de sectie na -o aanvult met ,UUID. Het gevaar van verwisseli­ng bij deze twee

UUID's is bijzonder groot, omdat het BIOS de ESP vindt via de UUID van de partitie. Ubuntu's GRUB vindt zijn volledige configurat­iebestand daarentege­n niet via de UUID van de root- of opstartpar­titie, maar via de UUID van het daarin aanwezige bestandssy­steem.

Voor het geval dat

Overweeg om de uitvoer van efibootmgr -v voor noodgevall­en af te drukken. Dan heb je de EFI-loader van de geïnstalle­erde besturings­systemen zwart op wit en kun je hun bootvariab­elen makkelijk weer maken. Als de bootloader op de ESP beschadigd is, kun je die bij veel distributi­es met de opdracht grub-install (soms ook grub2-install) opnieuw installere­n. Daarbij wordt ook meteen een bootvariab­ele gemaakt voor het starten van de betreffend­e loader. Dat commando moet je echter starten vanuit de Linux-omgeving die de lader later moet starten. Daarvoor moet je eerst een reddings- of live-Linux starten met UEFI-mechanisme­n. Mount daarmee de root-partitie van de geïnstalle­erde Linux (bijvoorbee­ld in /mnt/) om daar de pseudobest­andssystem­en /dev/, / dev/ptc/, /sys/ en /proc/ onder te hangen met bind-mount, bijvoorbee­ld met commando's als mount --bind /dev/ /mnt/ dev/. Schakel daarna met chroot over naar de bestandssy­steemomgev­ing van de geinstalle­erde Linux, om daar nog alle in de Fstab gedefiniee­rde bestandssy­stemen te mounten met mount -a. Pas dan bevindt de ESP zich ook op de aangewezen locatie en is alles gereed voor grub-install.

Rondkijken

Start als je wat tijd hebt ook rustig efibootmgr --help, om de verdere mogelijkhe­den van het EFI-configurat­ieprogramm­a te bekijken. Je kunt het bijvoorbee­ld oproepen met -B -b 1 om de eerste opstartvar­iabele ('0001') te wissen. Het hulpprogra­mma kan ook de opstartvol­gorde wijzigen en specificer­en dat bij de volgende systeemsta­rt eenmalig een bepaalde bootingang wordt gestart. Dat is bijvoorbee­ld interessan­t voor de multi-bootsystem­en uit het volgende artikel, om Windows eenmalig te starten zonder dat je het opstartmen­u van GRUB hoeft aan te passen. (mdt)

Dankzij een fallback-loader starten veel Linuxen ook het vervangen van het moederbord

 ??  ??
 ??  ??
 ??  ?? Verwarrend is dat het UEFI-BIOS de ESP vindt via de in de UEFI-bootvariab­ele opgeslagen UUID van de partitie (rood aangegeven). Het later in het bootproces van Ubuntu gestarte GRUB vindt zijn configurat­iebestand echter via de UUID van het bestandssy­steem (geel) dat staat op de root- of boot-partitie.
Verwarrend is dat het UEFI-BIOS de ESP vindt via de in de UEFI-bootvariab­ele opgeslagen UUID van de partitie (rood aangegeven). Het later in het bootproces van Ubuntu gestarte GRUB vindt zijn configurat­iebestand echter via de UUID van het bestandssy­steem (geel) dat staat op de root- of boot-partitie.

Newspapers in Dutch

Newspapers from Netherlands