1. Index
  2. Debian
  3. Desktop
  4. Heimserver
  5. Webserver

System starten

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.

Schritte beim Start des Rechners

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-…)
…

GRUB

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/grub
GRUB_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

EFI

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-boot

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

SecureBoot

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:

  1. Boot-Optionen
  2. SecureBoot Menu suchen
  3. Setup Mode aktivieren
  4. Eigene Schlüssel hinterlegen
  5. SecureBoot aktivieren

Jetzt führt der Rechner nur noch korrekt signierte EFI-Programme aus.

Literatur

  1. Debian Wiki: EFIStub
  2. Systemd: The Boot Loader Specification
  3. Roderick W. Smith: The rEFInd Boot Manager
  4. Roderick W. Smith: Controlling Secure Boot
  5. Matthew Bentley: Secure Boot on Arch Linux