Linux von BIOS- auf UEFI-Boot umstellen

Aus Knowledgebase
Zur Navigation springen Zur Suche springen
Die druckbare Version wird nicht mehr unterstützt und kann Darstellungsfehler aufweisen. Bitte aktualisiere deine Browser-Lesezeichen und verwende stattdessen die Standard-Druckfunktion des Browsers.

Ohne zu wissen, was es mit EFI auf sich hat, ist das Umstellen von Linux von BIOS- auf EFI-Boot auf echter Serverhardware (die meistens minutenlang in der internen Firmware rumhängt) zeitraubend und frustrierend. In Kürze Erklärung und Wichtiges:

Grundlagen

(U)EFI ((Unified) Extensible Firmware Interface) ist mit neuerer Hardware unvermeidbar. Eigentlich ist das Thema sehr einfach: Es gibt keinen binären Bootblock mehr, sondern eine kleine FAT32-Partition zu Beginn der Boot-Disk (ggfs. HW-RAID-Array). Die Bootloader der verschiedenen Betriebssysteme erzeugen eine Verzeichnisstruktur, in welcher dann das eigentliche Startprogramm hinterlegt wird. Die Firmware sammelt beim Systemstart eine Liste der gefundenen ausführbaren Binaries (PE32+ executable) und bietet diese dann zum Start an (bzw. der Standardeintrag wird gestartet).

Vorbereitungen

  • Ohne Repartitionieren geht es nicht. Da die Umstellung auf EFI durch einem Hardwaretausch mit anschließender Kopie der vorhandenen Installation durchgeführt wird, ist das aber kein Beinbruch.
  • Der initiale Boot (CD, ISO-Image, PXE, USB-Stick, usw.) muss zwingend im EFI-Modus mit einem dementsprechend EFI-fähigen Bootmedium durchgeführt werden. Das Debian-Live-Image von Debian 8 oder älter ist nicht geeignet! Erst ab 9 gibt es EFI-Support, z. B. debian-live-12.2.0-amd64-standard.iso. Ohne Boot im EFI-Modus sind die EFI-Hooks in der Firmware unsichtbar und Grub-EFI wird mit Fehlern um sich werfen.

Checkliste

  • Neues System vorbereiten (FW-Updates, BIOS-Settings, usw.),
  • Bootmedium vorbereiten (siehe oben),
  • Boot via EFI-Bootmenü von diesem Medium,
  • Ggfs. manuelle Netzwerkkonfiguration,
  • Nachinstallation von benötigten Systemkomponenten,
 apt-get install gdisk mdadm dosfstools dump
  • Vorbereiten der Platten für das OS:
    • Partitionieren (gdisk), dabei (eine) z. B. 5 MB große EFI-Partition(en) anlegen, Typ EF00,[1]
    • Ggfs. Erzeugen der gewünschten Arrays mit mdadm,
    • Dateisysteme erzeugen, dabei die EFI-Partition(en) mit einem FAT32-Dateisystem versehen,
mkfs.fat /dev/sda1,
    • Mounten des OS-Dateisystems nach z. B. /mnt, cd /mnt,
    • Kopieren der Installation vom Quellsystem, wie gehabt mit
ssh srcsys "dump -0a -b 256 -f - /dev/sda1" |restore -r -b 256 -f -
    • Vorbereitungen für chroot: mount -o bind /dev dev/,
  • chroot /mnt,
  • Nachmounten von Kernel-Pseudo-Dateisystemen: mount -t proc none /proc; mount -t sysfs none /sys; mount -t devpts none /dev/pts,
  • Anpassen der /etc/fstab, dabei Eintragen der EFI-Partition(en),
/dev/sda1	/boot/efi	vfat	defaults	0	0
  • Anlegen des EFI-Bootverzeichnisses,
mkdir /boot/efi
  • Anpassen der /etc/fstab, dabei Eintragen von efivars:
none	/sys/firmware/efi/efivars	efivarfs	defaults	0	0
  • Mounten der EFI-Partition(en),
mount -a
  • Nachinstallation von auf dem später laufenden System benötigten Systemkomponenten (mdadm),
  • Ggfs. schreiben der RAID-Konfiguration mit /usr/share/mdadm/mkconf > /etc/mdadm/mdadm.conf; update-initramfs -u,
  • Austauschen von Grub,
apt-get install grub-efi-amd64 grub-efi-amd64-bin
  • Sichern der Grub-Defaults,
cp -a /etc/default/grub /etc/default/grub~
  • Löschen von altem Grub-PC-Kram, die Frage nach Löschen vom alten Bootloader bejahen,
dpkg -P grub-pc grub-pc-bin
  • Restore der Grub-Defaults,
mv /etc/default/grub~ /etc/default/grub
  • Restore von gemeinsamen Grub-Dateien durch Reinstallation,
apt-get install --reinstall grub-efi-amd64 grub-efi-amd64-bin

Grub-EFI erfordert keine Platte mehr als Parameter beim beim Grub-Install:

grub-install
update-grub
  • Raus aus der chroot: exit,
  • Unmounten: umount boot/efi* dev/pts dev proc sys; cd ..; umount mnt.

Nach einem Reboot muss die Installation dann wieder sauber hochkommen. Weitere Schritte wie Netzwerkkonfigurationsanpassungen an die neue Hardware sind nicht beschrieben.

Mögliche Fehler

Aus der Praxis…

Meldung: EFI variables are not supported on this system

grub-install: warning: EFI variables are not supported on this system.

Dieser Fehler kann zum einen bedeuten, dass das System selbst im BIOS-Modus gestartet wurde. Allerdings scheint es ab Debian 11 notwendig zu sein, einen weiteren Mountpoint zu setzen:

none /sys/firmware/efi/efivars  efivarfs  defaults  0  0

Damit funktioniert dann auch ein grub-install fehlerfrei.

Nach Reboot erscheint nur die Grub-Kommandozeile

Falls das alte BIOS-Grub-Paket mit --purge gelöscht wurde, hätte unbedingt danach ein

grub-install
update-grub

abgesetzt werden müssen, da das Purge des BIOS-Paketes auch die Konfiguration und weitere Dateien löscht.

Lösung: Die Schritte von oben nochmal wiederholen:

  • Boot von externem Medium,
  • chroot,
  • Mounten der benötigten Partitionen,
  • Grub-Konfiguration neu schreiben:
grub-install
update-grub
  • umount,
  • Reboot.

Redundanz

Beim Booten kann dann statt einem möglicherweise wechselnden Gerät, eine Boot-Konfiguration aus dem genannten Verzeichnis eines beliebigen Gerätes gestartet werden. Vorbei sind die Tage, in denen in einem Software-RAID die erste Platte ausfällt, die zweite Platte dann an die erste Stelle rückt, der Bootblock ist aber nicht auf die erste Platte konfiguriert, sondern entweder überhaupt nicht[2] oder das BIOS kommt mit der neuen BIOS-ID (0x80 statt 0x81) nicht zurecht und verweigert den Boot.

EFI hat allerdings eine konzeptionelle Schwachstelle: Die Einfachhheit eine /boot-Partition per Software-RAID zu spiegeln ist nicht vorgesehen. Man kann sich was basteln über mdadm mit nicht persistentem Superblock (damit keine Daten überschrieben werden), aber das ist letztlich alles Gebastel.
Am Einfachsten ist es, manuell die Verzeichnisstruktur auf die zuvor manuell identisch partitionierten und in /boot/efi2, /boot/efi3, usw. gemounteten FAT32-Partitionen zu kopieren.

Für Debian muss eine Datei angelegt und als ausführbar markiert werden: /etc/grub.d/42_update-hook:

#!/bin/sh
# Dirty hack: If there are multiple FA32-mountpoints in /boot/efi, sync
#             contents manually to provide poor man's redundancy.
if mount -t vfat |awk '{print $3}' |grep -q '^/boot/efi$'; then
	cat /dev/null > /var/log/update-grub.log
	for MP in `mount -t vfat |awk '{print $3}' |grep -v '^/boot/efi$'`; do
		rsync -av --delete /boot/efi/ ${MP}/ >> /var/log/update-grub.log
	done
else
	echo "No EFI Mount Point detected." > /var/log/update-grub.log
fi

# --EOF--

Bei jedem Aufruf, der die Grub-Konfiguration neu erzeugt, wird somit auch die Struktur kopiert. Das beinhaltet auch Updates von Kernel und Grub selbst. Fire and forget.

Weblinks

Fußnoten

  1. Tatsächlich benötigt werden vom Grub-Loader einige 100 KBytes.
  2. Schlampiger Admin…
  3. Ob das EFI kompatible Images herstellt, ist derzeit nicht bekannt.