Linux von BIOS- auf UEFI-Boot umstellen: Unterschied zwischen den Versionen

Aus Knowledgebase
Zur Navigation springen Zur Suche springen
(Neu)
 
(Überarbeitet anhand Deb12)
 
(7 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 4: Zeile 4:
(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).
(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).


== Fallstricke ==
== 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.
* 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. [http://cdimage.debian.org/debian-cd/9.6.0-live/amd64/iso-hybrid/debian-live-9.6.0-amd64-xfce.iso debian-live-9.6.0-amd64-xfce.iso]. Ohne Boot im EFI-Modus sind die EFI-Hooks in der Firmware unsichtbar und Grub-EFI wird mit Fehlern um sich werfen.
* 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. [https://cdimage.debian.org/debian-cd/current-live/amd64/iso-hybrid/debian-live-12.2.0-amd64-standard.iso 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 ==
== Checkliste ==
Zeile 13: Zeile 13:
* Boot via EFI-Bootmenü von diesem Medium,
* Boot via EFI-Bootmenü von diesem Medium,
* Ggfs. manuelle Netzwerkkonfiguration,
* Ggfs. manuelle Netzwerkkonfiguration,
* Nachinstallation von benötigten Systemkomponenten (gdisk, mdadm, dosfstools),
* Nachinstallation von benötigten Systemkomponenten,
  apt-get install gdisk mdadm dosfstools dump
* Vorbereiten der Platten für das OS:
* Vorbereiten der Platten für das OS:
** Partitionieren (''gdisk''), dabei (eine) z.&thinsp;B. 100&thinsp;MB große EFI-Partition(en) anlegen, Typ EF00,<ref>Tatsächlich benötigt werden vom Grub-Loader einige 100&thinsp;KBytes.</ref>
** Partitionieren (''gdisk''), dabei (eine) z.&thinsp;B. 5&thinsp;MB große EFI-Partition(en) anlegen, Typ EF00,<ref>Tatsächlich benötigt werden vom Grub-Loader einige 100&thinsp;KBytes.</ref>
** Ggfs. Erzeugen der gewünschten Arrays mit ''mdadm'',
** Ggfs. Erzeugen der gewünschten Arrays mit ''mdadm'',
** Dateisysteme erzeugen, dabei die EFI-Partition(en) mit einem FAT32-Dateisystem versehen, z.&thinsp;B.: <code>mkfs.fat -F32 /dev/sda1</code>,
** Dateisysteme erzeugen, dabei die EFI-Partition(en) mit einem FAT32-Dateisystem versehen,
mkfs.fat /dev/sda1,
** Mounten des OS-Dateisystems nach z.&thinsp;B. ''/mnt'', <code>cd /mnt</code>,
** Mounten des OS-Dateisystems nach z.&thinsp;B. ''/mnt'', <code>cd /mnt</code>,
** Kopieren der Installation vom Quellsystem, wie gehabt mit z.&thinsp;B. <code>ssh ''srcsys'' "dump -0a -b 256 -f - /dev/sda1" |restore -r -b 256 -f -</code>,
** 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'': <code>mount -o bind /dev dev/</code>,
** Vorbereitungen für ''chroot'': <code>mount -o bind /dev dev/</code>,
* <code>chroot /mnt</code>,
* <code>chroot /mnt</code>,
* Nachmounten von Kernel-Pseudo-Dateisystemen: <code>mount -t proc none /proc; mount -t sysfs none /sys</code>,
* Nachmounten von Kernel-Pseudo-Dateisystemen: <code>mount -t proc none /proc; mount -t sysfs none /sys; mount -t devpts none /dev/pts</code>,
* Anpassen der ''/etc/fstab'', dabei Eintragen der EFI-Partition(en),
* 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),
* Mounten der EFI-Partition(en),
* Nachinstallation von benötigten Systemkomponenten (gdisk, mdadm, dosfstools),
mount -a
* Nachinstallation von auf dem später laufenden System benötigten Systemkomponenten (mdadm),
* Ggfs. schreiben der RAID-Konfiguration mit <code>/usr/share/mdadm/mkconf > /etc/mdadm/mdadm.conf; update-initramfs -u</code>,
* Ggfs. schreiben der RAID-Konfiguration mit <code>/usr/share/mdadm/mkconf > /etc/mdadm/mdadm.conf; update-initramfs -u</code>,
* Austauschen von Grub: <code>apt-get install grub-efi-amd64 grub-efi-amd64-bin</code>,
* Austauschen von Grub,
* Löschen von altem Grub-PC-Kram: <code>dpkg -P grub-pc grub-pc-bin</code>,
apt-get install grub-efi-amd64 grub-efi-amd64-bin
* Prüfen, ob ''/etc/default/grub'' existiert und falls nicht, nochmal vom Backup kopieren.
* 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. Statt dessen wird als (leider benötigter Parameter) ''dummy'' übergeben.
Grub-EFI erfordert keine Platte mehr als Parameter beim beim Grub-Install:
  grub-install dummy
  grub-install
update-grub


* Raus aus der chroot: <code>exit</code>,
* Raus aus der chroot: <code>exit</code>,
* Unmounten: <code>umount boot/efi* dev proc sys; cd ..; umount mnt</code>.
* Unmounten: <code>umount boot/efi* dev/pts dev proc sys; cd ..; umount mnt</code>.


Nach einem Reboot muss die Installation dann wieder sauber hochkommen. Weitere Schritte wie Netzwerkkonfigurationsanpassungen an die neue Hardware sind nicht beschrieben.
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 <code>grub-install</code> fehlerfrei.
==== Nach Reboot erscheint nur die Grub-Kommandozeile ====
Falls das alte BIOS-Grub-Paket mit <code>--purge</code> 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,
* <code>chroot</code>,
* Mounten der benötigten Partitionen,
* Grub-Konfiguration neu schreiben:
grub-install
update-grub
* <code>umount</code>,
* Reboot.


=== Redundanz ===
=== Redundanz ===

Aktuelle Version vom 18. Oktober 2023, 18:17 Uhr

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.