UEFI Boot Konfiguration

Aus Linupedia.org
Version vom 5. September 2015, 23:05 Uhr von Robi (Diskussion | Beiträge) (ein bisschen mehr Text)
Wechseln zu: Navigation, Suche
Höhe=24px
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.


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.

Umschalten Standard Mode / Custom Mode

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.


Konfiguration aus der EFI-SHELL

Konfiguration aus Windows