UEFI Boot Konfiguration
Achtung dieser Artikel ist noch in Arbeit und dient vorläufig nur als Vorlage. Dieser Beitrag zu Linux oder der Abschnitt ist in Bearbeitung. Weitere Informationen findest du hier. Der Ersteller arbeitet an dem Beitrag oder Abschnitt und entsorgt den Wartungsbaustein spätestens 3 Tage nach der letzten Bearbeitung. Änderungen außer Rechtschreibkorrekturen ohne Absprache mit dem Urspungsautor sind möglichst zu vermeiden, solange dieser Baustein noch innerhalb der genannten Frist aktiviert ist. |
Inhaltsverzeichnis
UEFI Boot Konfiguration
UEFI Variablen allgemein
Die Bootkonfiguration wird bei UEFI wie vieles andere auch in Variablen gespeichert. Allerdings muss man sich hier etwas komplizierteres vorstellen, als nur einen Variablenname und einen Wert dazu. Die Variablen in UEFI haben neben Namen und Wert noch weitere Informationen wie zB. Attribute (Eigenschaften), GUID (einen eindeutigen 128 Bit Identifikations-Wert), eine Längenangabe des Variable-Wertes.
Damit man sich im Bedarfsfall zu mindestens grob orientieren kann, hier mal ein Beispiel wie so etwas aussehen könnte und was man daraus herauslesen kann.
Beispiel, Ausgabe einer UEFI Variable aus der EFI-Shell:
Variable NV+RT+BS '8BE4DF61-93CA-11D2-AA0D-00E098032B8C:Boot000A' DataSize = 0xB8 00000000: 01 00 00 00 66 00 6E 00-65 00 75 00 65 00 72 00 *....f.n.e.u.e.r.* 00000010: 6B 00 65 00 72 00 6E 00-00 00 04 01 2A 00 01 00 *k.e.r.n.....*...* 00000020: 00 00 00 08 00 00 00 00-00 00 00 E0 04 00 00 00 *................* 00000030: 00 00 77 C4 90 F8 D1 DE-69 4B BC 85 0C 1F 30 79 *..w.....iK....0y* 00000040: 40 F6 02 02 04 04 38 00-5C 00 45 00 46 00 49 00 *@.....8.\.E.F.I.* 00000050: 5C 00 6F 00 70 00 65 00-6E 00 73 00 75 00 73 00 *\.o.p.e.n.s.u.s.* 00000060: 65 00 5C 00 62 00 7A 00-49 00 6D 00 61 00 67 00 *e.\.b.z.I.m.a.g.* 00000070: 65 00 2E 00 65 00 66 00-69 00 00 00 7F FF 04 00 *e...e.f.i.......* 00000080: 69 00 6E 00 69 00 74 00-72 00 64 00 3D 00 5C 00 *i.n.i.t.r.d.=.\.* 00000090: 65 00 66 00 69 00 5C 00-6F 00 70 00 65 00 6E 00 *e.f.i.\.o.p.e.n.* 000000A0: 73 00 75 00 73 00 65 00-5C 00 69 00 6E 00 69 00 *s.u.s.e.\.i.n.i.* 000000B0: 74 00 72 00 64 00 00 00- *t.r.d...*
- NV+RT+BS entspricht den Attributen "NON_VOLATILE + BOOTSERVICE_ACCESS + RUNTIME_ACCESS"
Diese Variable wird im Nichtflüchtigen Speicher hinterlegt, ist währende des Bootvorganges und auch im laufenden Betriebssystem vorhanden
- 8BE4DF61-93CA-11D2-AA0D-00E098032B8C diese ist eine EFI-GUID und bedeutet in diesem Fall
es handelt sich um eine Globale Variable die in der EFI-Spezifikation definiert ist. die GUID wird meist in Verbindung mit dem Namen angezeigt und würde auch Variable mit dem gleichen Namen unterscheiden.
- Boot000A dieses ist der Name der Variable
- DataSize = 0xB8 dieses ist die hexadezimale Längenangabe für die Daten der Variable
- der Rest ist dann der Wert der Variable hier in der Ausgabe die uns auch "hexdump -C " in Linux liefern würde.
Aus dem Wert dieser Variable können und wollen wir auch gar nicht alles interpretieren, aber zu erkennen hier sind 2 Textabschnitte die mit UTF-16 abgelegt sind.
In diesem Fall handelst es sich um den Booteintrag (Label) "neuerkern" welcher auf einem Dateisystem das wir so aus den Werten nicht interpretieren können, eine Datei "\EFI\opensuse\bzImage.efi" mit den Optionen "initrd=\efi\opensuse\initrd" starten soll.
UEFI Boot Variablen
Die Bootkonfiguration bei UEFI besteht aus mehreren Variablen, Im Zusammenspiel dieser Variablen ist die Reihenfolge festgelegt mit der UEFI versucht das einen Bootvorgang einzuleiten.
Bootxxxx
xxxx ist hier ein hexadezimaler Wert, also zB eine Variabel mit dem Namen Boot0001 von diesen Variablen sind in aller Regel mehrere vorhanden, Typischer Weise sind meist 3 bis 8 solcher Variablen vorhanden beginnend mit Boot0000.
Der Inhalt besteht aus einem BootLabel (das ist das was als Name für diesen Booteintrag angezeigt wird, und mindestens aus einem Gerätepath. Zusätzlich können noch der Dateiname mit Path einer Datei mit dem Prefix ".efi". Dieses ist dann der Path und der Name des Bootloaders der gestartet werden soll. Und es können auch zusätzlich noch Optionen dort stehen mit denen der Bootloader gestartet werden kann.
Den Gerätepath können wir aus den rohen Daten in der Variabel selbst kaum interpretieren, aber zum Glück gibt es spezielle Tools zur Bootkonfiguration, die uns diesen Geräte Path in einer etwas verständlicheren Sprache übersetzen können, ganz durchsichtig oder gar einfach wird es damit dennoch nicht, da die Tools zur Interpretation des Gerätepath die Treiberhirachie mit einbeziehen müssen und es Unterschiede zwischen den benutzten Treibern des UEFI und des Betriebssystems git. Auch kann der Geratepath einmal in voller Länge und ein anderes mal mit verkürzter Länge dargestellt werde. Eindeutig wird er in all den Fällen aber immer wenn die Partitions-UUID mit im Gerätepath enthalten ist.
Im folgenden Beispiele die alle den selben Gerätepath beschreiben:
PciRoot(0x0)/Pci(0x1,0x1)/Ata(0x0)/HD(1,GPT,F890C477-DED1-4B69-BC85-0C1F307940F6,0x800,0x4E000) HD(1,GPT,F890C477-DED1-4B69-BC85-0C1F307940F6,0x800,0x4E000) ACPI(a0341d0,0)PCI(1,1)ATAPI(0,1,0)HD(1,800,4e000,f890c477-ded1-4b69-bc85-0c1f307940f6) HD(1,800,4e000,f890c477-ded1-4b69-bc85-0c1f307940f6)
BootOrder
BootOrder ist die Bootvariable die jetzt genau festlegt in welcher Reihenfolge die einzelnen Bootxxxx Variablen herangezogen werden sollen, um einen funktionieren Bootloader zum Start des Betriebssystems zu finden. Die Variable enthält dementsprechend mehrere mit Komma getrennte Einträge die dem xxxx aus den Bootxxxx Variablen entsprechen.
BootOrder: 0004,0001,0002,0000,0003
Hier im Beispiel wird die Bootvariable Boot0004 die erste sein mit deren Hilfe UEFI versucht das System zu booten.
weitere Bootvariablen
Es gibt eine Reihe weiterer Bootvariablen, die für die direkte Bootauswahl mehr oder weniger von Bedeutung sind.
- BootCurrent : hier enthalten ist der 4 stelliger Hexadezimalwert des letzten erfolgreichen Bootvorgangs
- BootNext : hier kann stehen ein 4 stelliger Hexadezimalwert für den nächsten Bootvorgang, überschreibt für einen Bootvorgang die Reihenfolge von BootCurrent.
- Timeout : eine Zeit in Sekunden die beim Start auf Eingaben gewartet wird bis BootOrder oder BootNext verwendet wird um einen Bootloader zu starten
- SecureBoot zeigt an ob derzeit bzw. für den nächsten Reboot Secure Boot aktiv ist.
- und weitere Variablen die zB genutzt werden, um default Werte zu speichern, die bei einem Set-to-default eingestellt werden
Bootkonfiguration aus dem Setup Menü
UEFI wird bei jedem Start oder mindestens nach dem hinzufügen und aktivieren es Bootfähigen Gerätes automatisch einen Default Booteintrag für jedes Gerät erzeugen. Der Default Eintrag sucht dann zB auf der ESP einen Bootloader \EFI\boot\bootx64.efi dieses ist zB auch der Bootloader den wir auf mit UEFI-bootbaren CD/DVDs finden werden. Auch der Windowsbootloader oder andere Bootloader (zB systemd-boot) könnten versuchen eine Kopie von sich selbst unter diesem Namen anzulegen. Damit sollte sicher gestellt sein, dass zB nach einem Reset oder Set-to-Default des UEFI ein automatischen booten möglich sein. Aber der User muss auch in der Lage sein, im Setup Menu manuell Änderungen an der Bootkonfiguration vorzunehmen.
Im Prinzip sollte auf jedem Rechner die Möglichkeit bestehen die Liste der Bootloader in der Variable BootOrder im UEFI Setup Menu umzusortieren, und auch einen speziellen Eintrag auszuwählen der "jetzt" booten soll. Dieses kann entweder im SetupMenu selbst, oder in einem externen BootMenu möglich sein. Wie, und mit welchen Tasten das im speziellen funktionieren soll, sollte in der dazugehörigen Hilfe bzw. in der Dokumentation des Systemboards zu finden sein, wenn man es denn mittels Eigenversuches nicht selbst leicht herausfinden könnte.
Des weiteren könnte es eventuell beim einen oder anderen Rechner auch Menüpunkte geben, neue Bootloader/Files in die Liste aufzunehmen oder zu ändern, also die Bootxxxx-Variablen zu ändern. Dieses scheint nicht auf jedem Board und in jedem UEFI-Setup-Menu möglich zu sein, eventuell muss man dazu ein einen Expertenmodus oder ähnlichen wechseln.
Spätestens im Expertenmodus sollte es jetzt auch ein Bootkonfiguratiosmenu geben, wo weiter Einstellungen möglich sind. Dort kann man zB. das booten von Netzwerkkarten aktivieren und konfigurieren.(LAN PXE Boot)
Dort sind auch 2 oder 3 wichtige weitere Dinge einzustellen.
- SecureBoot ein/aus : das versteckt sich eventuell unter der Bezeichnung "Windows 8 feature" oder ähnlichen
- CSM Boot ein/aus : das ermöglicht das Booten von Bootloadern aus dem MBR nach der legacy Methode
- und Einstellungen entweder nur UEFI-Boot oder nur CSM-BOOT oder auch Beides je nach dem welche Partitionstabelle und Bootloader auf dem Gerät gefunden wird, von dem aktuell gebootet werden soll.
- eventuell sind bei bestimmten Kombinationen dieser 3 Einstellungen dann auch noch weitere Menüpunkte im Menü zu finden, die mit Secureboot und dem UEFI-Keymanagement bzw. CustomMode/UserMode zu tun haben. siehe dazu auch die Erklärungen bei Secureboot hier im Wiki .
Konfiguration aus Linux
Die UEFI-Bootkonfiguration kann von Linux aus über das Tool efibootmgr gesteuert werden. Dabei können die gesetzten Eigenschaften ausgelesen und verändert werden. Das Tool efibootmgr wird automatisch mit Linux installiert wenn bei der Installation UEFI-Boot ausgewählt wurde.
efibootmgr ohne Angabe einer Option zeigt die aktuelle UEFI Bootkonfiguration.
BootNext: 0006 BootCurrent: 0006 Timeout: 0 seconds BootOrder: 0008,000F,000D,000C,000B,000A,0007,0000,0001,000E,0002,0003,0006,0009,0005,0004,0010,0011,0012 Boot0000* EFI DVD/CDROM Boot0001* EFI DVD/CDROM 1 Boot0002* EFI Floppy Boot0003* EFI Floppy 1 Boot0004* EFI Hard Drive Boot0005* Shim boot Boot0006* EFI Internal Shell Boot0007* opensuse Boot0008* opensuse-secureboot Boot0009* kernel Boot000A* neuerkern Boot000B* grublegacy Boot000C* SUSE Linux Enterprise Boot000D* rEFInd Boot Manager Boot000E* Linux Boot Manager Boot000F* grub1 boot Boot0010* EFI Network Boot0011* EFI Network 1 Boot0012* EFI Network 2
zusätzlich die Option "-v" zeigt weitere Details zu den Einträgen bis hin zu den genauen genauen Bootloadern und eventuell gesetzten Optionen für den Bootvorgang.
BootNext: 0006 BootCurrent: 0006 Timeout: 0 seconds BootOrder: 0008,000F,000D,000C,000B,000A,0007,0000,0001,000E,0002,0003,0006,0009,0005,0004,0010,0011,0012 Boot0000* EFI DVD/CDROM ACPI(a0341d0,0)PCI(1,1)ATAPI(1,0,0) Boot0001* EFI DVD/CDROM 1 ACPI(a0341d0,0)PCI(1,1)ATAPI(0,0,0) Boot0002* EFI Floppy ACPI(a0341d0,0)PCI(1,0)ACPI(60441d0,0) Boot0003* EFI Floppy 1 ACPI(a0341d0,0)PCI(1,0)ACPI(60441d0,1) Boot0004* EFI Hard Drive ACPI(a0341d0,0)PCI(1,1)ATAPI(0,1,0) Boot0005* Shim boot ACPI(a0341d0,0)PCI(1,1)ATAPI(0,1,0)HD(1,800,4e000,f890c477-ded1-4b69-bc85-0c1f307940f6)File(\EFI\opensuse\shim.efi) Boot0006* EFI Internal Shell MM(b,900000,10fffff) Boot0007* opensuse HD(1,800,4e000,f890c477-ded1-4b69-bc85-0c1f307940f6)File(\EFI\opensuse\grubx64.efi) Boot0008* opensuse-secureboot HD(1,800,4e000,f890c477-ded1-4b69-bc85-0c1f307940f6)File(\EFI\opensuse\shim.efi) Boot0009* kernel ACPI(a0341d0,0)PCI(1,1)ATAPI(0,1,0)HD(1,800,4e000,f890c477-ded1-4b69-bc85-0c1f307940f6)File(\EFI\opensuse\bzImage.efi)i.n.i.t.r.d.=.\ .e.f.i.\.o.p.e.n.s.u.s.e.\.i.n.i.t.r.d... Boot000A* neuerkern HD(1,800,4e000,f890c477-ded1-4b69-bc85-0c1f307940f6)File(\EFI\opensuse\bzImage.efi)i.n.i.t.r.d.=.\.e.f.i.\.o.p.e.n.s.u.s.e.\.i.n.i.t. r.d... Boot000B* grublegacy HD(1,800,4e000,f890c477-ded1-4b69-bc85-0c1f307940f6)File(\EFI\redhat\grub.efi) Boot000C* SUSE Linux Enterprise HD(1,800,4e000,f890c477-ded1-4b69-bc85-0c1f307940f6)File(\efi\SuSE\elilo.efi) Boot000D* rEFInd Boot Manager HD(1,800,4e000,f890c477-ded1-4b69-bc85-0c1f307940f6)File(\EFI\refind\refind_x64.efi) Boot000E* Linux Boot Manager HD(1,800,4e000,f890c477-ded1-4b69-bc85-0c1f307940f6)File(\EFI\gummiboot\gummibootx64.efi) Boot000F* grub1 boot ACPI(a0341d0,0)PCI(1,1)ATAPI(0,1,0)HD(1,800,4e000,f890c477-ded1-4b69-bc85-0c1f307940f6)File(\EFI\opensuse\grubx64.efi) Boot0010* EFI Network ACPI(a0341d0,0)PCI(3,0)MAC(00163e345786,1) Boot0011* EFI Network 1 ACPI(a0341d0,0)PCI(3,0)MAC(00163e345786,1)IPv4(0.0.0.0:0<->0.0.0.0:0,0, 0 Boot0012* EFI Network 2 ACPI(a0341d0,0)PCI(3,0)MAC(00163e345786,1)030d3c0000000000000000000000000000000000000000000000000000000000000000000000000000000040000 00000000000000000000000000000
Hilfe bekommt man mit der Option "-h" oder auch über die Manpage
usage: efibootmgr [options] -a | --active sets bootnum active -A | --inactive sets bootnum inactive -b | --bootnum XXXX modify BootXXXX (hex) -B | --delete-bootnum delete bootnum (hex) -c | --create create new variable bootnum and add to bootorder -d | --disk disk (defaults to /dev/sda) containing loader -e | --edd [1|3|-1] force EDD 1.0 or 3.0 creation variables, or guess -E | --device num EDD 1.0 device number (defaults to 0x80) -g | --gpt force disk with invalid PMBR to be treated as GPT -H | --acpi_hid XXXX set the ACPI HID (used with -i) -i | --iface name create a netboot entry for the named interface -l | --loader name (defaults to \elilo.efi) -L | --label label Boot manager display label (defaults to "Linux") -n | --bootnext XXXX set BootNext to XXXX (hex) -N | --delete-bootnext delete BootNext -o | --bootorder XXXX,YYYY,ZZZZ,... explicitly set BootOrder (hex) -O | --delete-bootorder delete BootOrder -p | --part part (defaults to 1) containing loader -q | --quiet be quiet | --test filename don't write to NVRAM, write to filename. -t | --timeout seconds set boot manager timeout waiting for user input. -T | --delete-timeout delete Timeout. -u | --unicode | --UCS-2 pass extra args as UCS-2 (default is ASCII) -U | --acpi_uid XXXX set the ACPI UID (used with -i) -v | --verbose print additional information -V | --version return version and exit -w | --write-signature write unique sig to MBR if needed -@ | --append-binary-args file append extra args from file (use "-" for stdin)
einfache Beispiele:
efibootmgr -n 5
würde dafür sorgen, dass der nächste Boot einmalig mit der Variable Boot0005 (in diesem Beispiel "shim boot") durchgeführt wird.
efibootmgr -o 5,6,9,0
würde die Bootorder dauerhaft umstellen auf "0005,0006,0009,0000"
efibootmgr -b 3 -B
würde den Eintrag Boot0003 löschen und wenn vorhanden aus der Bootorder entfernen
etwas schwieriger ist das anlegen eines neuen Eintrages
Meist reicht es aus nur den Bootloader einzutragen und man benötigt keine weiter zusätzlichen Bootoptionen
efibootmgr -c -d /dev/sda -p 1 -L "rEFInd Boot Manager" -l \\EFI\\refind\\refind_x64.efi
- -c - neu anlegen
- -d - die Linuxschreibweise der Platte auf der sich die EFI-Partition befindet
- -p 1 - (hier optional die Partitionsnummer der EFI-Partition, 1 ist sowieso default)
- -L - der Name des Booteintrages
- -l - der Path zum Bootloader auf der EFI-Partition, Achtung Schreibweise hier unbedingt beachten.
Der Booteintrag wird eingetragen und automatisch an erste Stelle in der Bootorder gesetzt.
Noch ein klein wenig komplizierter wenn auch noch Optionen mitgegeben werden sollen. Hier der Befehl mit dem der Booteintrag in Boot000A angelegt wurde, mit dem ein Kernel auf dem ESP direkt von UEFI gestartet wird.
efibootmgr -c -d /dev/sda -p 1 -L neuerkern -l \\EFI\\opensuse\\bzImage.efi -u initrd=\\efi\\opensuse\\initrd
- -u - setzt hier UNICODE Format für die Optionen die anschließend folgen. (Daran muss man sich gewöhnen, im UEFI selbst wird vieles nicht im ASCII Format abgelegt sondern wie unter Windows auch im UNICODE
Die meisten Bootloader bringen aber eigene Scripte mit, die automatisch bei der Installation das Kopieren des Bootloaders auf die EFI-Partition und das Anlegen eines Booteintrages übernehmen, damit muss man in den seltensten Fällen per Hand selbst UEFI-Booteinträge unter Linux erstellen.