Linux von BIOS- auf UEFI-Boot umstellen
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
- Mounten des OS-Dateisystems nach z. B. /mnt,
ssh srcsys "dump -0a -b 256 -f - /dev/sda1" |restore -r -b 256 -f -
- Vorbereitungen für chroot:
mount -o bind /dev dev/
,
- Vorbereitungen für chroot:
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
- UEFI booting and RAID1
- Was Linux-Anwender über UEFI wissen müssen
- Run your system from cd without need for disks[3]
- …it is possible to load the kernel directly, without any additional bootloader