Beim Einschalten des Rechners führt dieser zuerst die auf einem EEPROM gespeicherte Firmware aus. Diese startet einen Bootloader, der den Kernel des Betriebssystems lädt, welcher die initiale Ramdisk entpackt und schließlich die Kontrolle an den Init-Prozess (PID 1) übergibt.
Auf moderner Hardware ist der Bootloader ein EFI-Programm, das auf der ESP liegt. Theoretisch lassen sich alle in diesem Kapitel beschriebenen Varianten parallel betreiben. Einsicht über den oder die installierten Bootloader und die Reihenfolge erhält man mit:
efibootmgr -v BootCurrent: 0000 Timeout: 2 seconds BootOrder: 0000,… Boot0000* Debian (EFI stub) HD(1,GPT,de4fb3a7-…) …
Standardmäßig installiert Debian den komplexen GRUB Bootloader. Da er die meisten Dateisysteme unterstützt, kann er den Kernel von einem (unverschlüsselten) Wurzeldateisystem laden.
/etc/default/grubGRUB_DEFAULT=0 GRUB_TIMEOUT=5 GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian` GRUB_CMDLINE_LINUX_DEFAULT="quiet" GRUB_CMDLINE_LINUX=""
Nach Änderungen an der Konfiguration müssen diverse
Skripte und Konfigurationsdateien unter
/boot/grub
neu erzeugt werden.
update-grub
Der Bootloader selbst liegt unter
/boot/efi/EFI/debian/grubx64.efi
und wird installiert mit:
grub-install /dev/sda
Der standardmäßig installierte Kernel verfügt über einen
EFI-Header.
Damit kann die Firmware den Kernel direkt ausführen,
ohne den Umweg über einen Bootloader zu gehen.
Da die Paketverwaltung keine Pakete auf
VFAT-Partitionen
entpacken kann, wird die
ESP
nach /boot/efi
montiert.
Folgendes Skript kopiert den Kernel bei der Aktualisierung
dorthin und verankert ihn in der Bootliste.
/etc/kernel/postinst.d/zz-update-efistub#!/bin/sh -e vers=${1:-$(uname -r)} root=$(sed 's/#.*//g' /etc/fstab | awk '($2 == "/") {print $1}') flag=$(sed 's/#.*//g' /etc/fstab | awk '($2 == "/") {print $4}') # install image install -D /boot/vmlinuz-$vers /boot/efi/linux install -D /boot/initrd.img-$vers /boot/efi/initrd . /etc/os-release efibootmgr -c -g \ -L "$PRETTY_NAME" \ -l '\linux' \ -u "initrd=\\initrd add_efi_memmap root=$root rootflags=$flag ro quiet splash"
Systemd enthält einen einfachen Bootloader für
EFI-Systeme,
den man mit
bootctl
verwalten kann. Das Skript
/etc/kernel/postinst.d/zz-update-bootctl
kopiert den Kernel und die initiale Ramdisk nach jedem Update dorthin.
curl htps://illusioni.de/~phrank/debian/bootctl_0.1_all.deb dpkg -i bootctl_0.1_all.deb
Um zu verhindern, dass ein Bösewicht heimlich den Kernel
austauscht, kann man diesen kryptografisch signieren und mittels
SecureBoot verifizieren.
Da flexible Bootoptionen das Konzept eines sicheren Starts
unterlaufen, werden die Kernel-Parameter fest in ein sogenanntes
Unified Kernel Image
eingebaut. Es enthält Metadaten, den Kernel, die Ramdisk und einen
EFI-Header.
Das Skript
/etc/kernel/postinst.d/zz-update-secureboot
erzeugt beim ersten Aufruf Schlüssel und kopiert diese auf die
ESP.
curl https://illusioni.de/~phrank/debian/secureboot_0.1_all.deb dpkg -i secureboot_0.1_all.deb Generating a RSA private key … Signing Unsigned original image
Die Gültigkeit der Signatur lässt sich prüfen mit:
sbverify --cert /etc/ssl/efi/DB.crt /boot/efi/linux Signature verification OK
Nun ist es an der Zeit, das System neu zu starten und das Setup des Rechners aufzurufen. Die Schritte hängen stark vom Hersteller ab. Meistens sind es in etwa Folgende:
PK.esl
KEK.esl
DB.esl
Jetzt führt der Rechner nur noch korrekt signierte EFI-Programme aus.