UEFI Boot Konfiguration

Aus Linupedia.org
Version vom 13. September 2015, 20:38 Uhr von Robi (Diskussion | Beiträge) (Überarbeitung)
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

Die Konfiguration der Bootvariablen mittels der EFI-Shell ist sicherlich für den Normaluser die allerletzte Möglichkeit die überhaupt in Betracht gezogen werden sollte. Dazu ist auch hier die Hindernislatte ziemlich hoch gehängt und wahrscheinlich muss da vorher auch eine ganze Menge an Fehlern und Ungereimtheiten passieren, bevor dieses einmal notwendig werden würde und die EFI-Shell als der einzige noch gangbare Weg übrig bleibt.

Zuerst müsste der User wahrscheinlich eine EFI-Shell Version 2.x downloaden, die dann auch noch auf seinem Rechner funktioniert. Dann müsste er diese Shell irgendwohin abspeichern, dass sie mittels UEFI-Setup oder Default-Booteinträge gestartet werden kann. Und nicht zuletzt, müsste der User auch noch einige Grundkenntnisse über die EFI-Shell mitbringen oder zu mindestens schonmal einiges darüber gelesen haben, damit er diese überhaupt einigermaßen bedienen kann. In diesem Beitrag werden wir auf die meisten Grundlagen der EFI-Shell nicht eingehen, sondern uns nur um die reine Bootkonfigurationsmöglichkeiten beschränken.

Prinzipiell einmal auf der EFI-Shell angekommen, ist es ein leichtes von dort aus einen der hoffentlich noch vorhanden Bootloader zu starten und damit wieder ein Betriebssystem zu haben von dem man dann mit einfacheren Mitteln die Bootkonfiguration wieder richten könnte.

Darauf gehen wir hier aber nicht ein, wir wollen uns gezielt auf der EFI-Shell anschauen wie die Bootkonfiguration dort aussieht und wie wir sie dort ändern könnten. Wir würden für einige der weiteren Befehle hier eine EFI-Shell Version 2.x benötigen, diese ist üblicherweise Weise erst ab UEFI-2.3.1 lauffähig.

Die Bootvariablen anschauen geht mit dem Befehl "dumpstore"

Shell> dmpstore Boot*
Variable NV+RT+BS '8BE4DF61-93CA-11D2-AA0D-00E098032B8C:BootOrder' DataSize = 0x08
  00000000: 0A 00 02 00 05 00 01 00-                         *........*
Variable NV+RT+BS '8BE4DF61-93CA-11D2-AA0D-00E098032B8C:Boot0002' DataSize = 0xA2
  00000000: 01 00 00 00 7A 00 47 00-72 00 75 00 62 00 20 00  *....z.G.r.u.b. .*
  00000010: 53 00 65 00 63 00 75 00-72 00 65 00 20 00 42 00  *S.e.c.u.r.e. .B.*
  00000020: 6F 00 6F 00 74 00 00 00-02 01 0C 00 D0 41 03 0A  *o.o.t........A..*
  00000030: 00 00 00 00 01 01 06 00-01 01 03 01 08 00 00 01  *................*
  00000040: 00 00 04 01 2A 00 02 00-00 00 00 68 09 00 00 00  *....*......h....*
  00000050: 00 00 00 18 03 00 00 00-00 00 0A 22 3A 66 4E 5B  *...........":fN[*
  00000060: 4D 47 83 2F A9 69 D8 33-4C B4 02 02 04 04 32 00  *MG./.i.3L.....2.*
  00000070: 5C 00 45 00 46 00 49 00-5C 00 6F 00 70 00 65 00  *\.E.F.I.\.o.p.e.*
  00000080: 6E 00 73 00 75 00 73 00-65 00 5C 00 73 00 68 00  *n.s.u.s.e.\.s.h.*
  00000090: 69 00 6D 00 2E 00 65 00-66 00 69 00 00 00 7F FF  *i.m...e.f.i.....*
  000000A0: 04 00                                            *..*
Variable NV+RT+BS '8BE4DF61-93CA-11D2-AA0D-00E098032B8C:Boot000C' DataSize = 0x42
  00000000: 01 00 00 00 22 00 45 00-46 00 49 00 20 00 46 00  *....".E.F.I. .F.*
  00000010: 6C 00 6F 00 70 00 70 00-79 00 20 00 31 00 00 00  *l.o.p.p.y. .1...*
  00000020: 02 01 0C 00 D0 41 03 0A-00 00 00 00 01 01 06 00  *.....A..........*
  00000030: 00 01 02 01 0C 00 D0 41-04 06 01 00 00 00 7F FF  *.......A........*
  00000040: 04 00                                            *..*
Variable NV+RT+BS '8BE4DF61-93CA-11D2-AA0D-00E098032B8C:Boot000B' DataSize = 0x3E
  00000000: 01 00 00 00 22 00 45 00-46 00 49 00 20 00 46 00  *....".E.F.I. .F.*
  00000010: 6C 00 6F 00 70 00 70 00-79 00 00 00 02 01 0C 00  *l.o.p.p.y.......*
  00000020: D0 41 03 0A 00 00 00 00-01 01 06 00 00 01 02 01  *.A..............*
  00000030: 0C 00 D0 41 04 06 00 00-00 00 7F FF 04 00        *...A..........*
Variable NV+RT+BS '8BE4DF61-93CA-11D2-AA0D-00E098032B8C:Boot000A' DataSize = 0x12C
  00000000: 01 00 00 00 74 00 57 00-69 00 6E 00 64 00 6F 00  *....t.W.i.n.d.o.*
  00000010: 77 00 73 00 20 00 42 00-6F 00 6F 00 74 00 20 00  *w.s. .B.o.o.t. .*
  00000020: 4D 00 61 00 6E 00 61 00-67 00 65 00 72 00 00 00  *M.a.n.a.g.e.r...*
  00000030: 04 01 2A 00 02 00 00 00-00 68 09 00 00 00 00 00  *..*......h......*
  00000040: 00 18 03 00 00 00 00 00-0A 22 3A 66 4E 5B 4D 47  *.........":fN[MG*
  00000050: 83 2F A9 69 D8 33 4C B4-02 02 04 04 46 00 5C 00  *./.i.3L.....F.\.*
  00000060: 45 00 46 00 49 00 5C 00-4D 00 69 00 63 00 72 00  *E.F.I.\.M.i.c.r.*
  00000070: 6F 00 73 00 6F 00 66 00-74 00 5C 00 42 00 6F 00  *o.s.o.f.t.\.B.o.*
  00000080: 6F 00 74 00 5C 00 62 00-6F 00 6F 00 74 00 6D 00  *o.t.\.b.o.o.t.m.*
  00000090: 67 00 66 00 77 00 2E 00-65 00 66 00 69 00 00 00  *g.f.w...e.f.i...*
  000000A0: 7F FF 04 00 57 49 4E 44-4F 57 53 00 01 00 00 00  *....WINDOWS.....*
  000000B0: 88 00 00 00 78 00 00 00-42 00 43 00 44 00 4F 00  *....x...B.C.D.O.*                                                                                                     
  000000C0: 42 00 4A 00 45 00 43 00-54 00 3D 00 7B 00 39 00  *B.J.E.C.T.=...9.*                                                                                                     
  000000D0: 64 00 65 00 61 00 38 00-36 00 32 00 63 00 2D 00  *d.e.a.8.6.2.c.-.*                                                                                                     
  000000E0: 35 00 63 00 64 00 64 00-2D 00 34 00 65 00 37 00  *5.c.d.d.-.4.e.7.*                                                                                                     
  000000F0: 30 00 2D 00 61 00 63 00-63 00 31 00 2D 00 66 00  *0.-.a.c.c.1.-.f.*                                                                                                     
  00000100: 33 00 32 00 62 00 33 00-34 00 34 00 64 00 34 00  *3.2.b.3.4.4.d.4.*                                                                                                     
  00000110: 37 00 39 00 35 00 7D 00-00 00 00 00 01 00 00 00  *7.9.5...........*                                                                                                     
  00000120: 10 00 00 00 04 00 00 00-7F FF 04 00              *............*                                                                                                         
Variable NV+RT+BS '8BE4DF61-93CA-11D2-AA0D-00E098032B8C:Boot0001' DataSize = 0x44                                                                                                   
  00000000: 01 00 00 00 1E 00 45 00-46 00 49 00 20 00 44 00  *......E.F.I. .D.*                                                                                                     
  00000010: 56 00 44 00 2F 00 43 00-44 00 52 00 4F 00 4D 00  *V.D./.C.D.R.O.M.*                                                                                                     
  00000020: 20 00 31 00 00 00 02 01-0C 00 D0 41 03 0A 00 00  * .1........A....*                                                                                                     
  00000030: 00 00 01 01 06 00 01 01-03 01 08 00 00 00 00 00  *................*                                                                                                     
  00000040: 7F FF 04 00                                      *....*                                                                                                                 
Variable NV+RT+BS '8BE4DF61-93CA-11D2-AA0D-00E098032B8C:Boot0004' DataSize = 0x40                                                                                                   
  00000000: 01 00 00 00 1E 00 45 00-46 00 49 00 20 00 44 00  *......E.F.I. .D.*                                                                                                     
  00000010: 56 00 44 00 2F 00 43 00-44 00 52 00 4F 00 4D 00  *V.D./.C.D.R.O.M.*                                                                                                     
  00000020: 00 00 02 01 0C 00 D0 41-03 0A 00 00 00 00 01 01  *.......A........*                                                                                                     
  00000030: 06 00 01 01 03 01 08 00-01 00 00 00 7F FF 04 00  *................*                                                                                                     
Variable NV+RT+BS '8BE4DF61-93CA-11D2-AA0D-00E098032B8C:Boot0000' DataSize = 0x42                                                                                                   
  00000000: 01 00 00 00 1E 00 45 00-46 00 49 00 20 00 48 00  *......E.F.I. .H.*                                                                                                     
  00000010: 61 00 72 00 64 00 20 00-44 00 72 00 69 00 76 00  *a.r.d. .D.r.i.v.*                                                                                                     
  00000020: 65 00 00 00 02 01 0C 00-D0 41 03 0A 00 00 00 00  *e........A......*                                                                                                     
  00000030: 01 01 06 00 01 01 03 01-08 00 00 01 00 00 7F FF  *................*                                                                                                     
  00000040: 04 00                                            *..*                                                                                                                   
Variable NV+RT+BS '8BE4DF61-93CA-11D2-AA0D-00E098032B8C:Boot0005' DataSize = 0x5C                                                                                                   
  00000000: 01 00 00 00 30 00 45 00-46 00 49 00 20 00 49 00  *....0.E.F.I. .I.*
  00000010: 6E 00 74 00 65 00 72 00-6E 00 61 00 6C 00 20 00  *n.t.e.r.n.a.l. .*
  00000020: 53 00 68 00 65 00 6C 00-6C 00 00 00 01 03 18 00  *S.h.e.l.l.......*
  00000030: 0B 00 00 00 00 00 90 00-00 00 00 00 FF FF 0F 01  *................*
  00000040: 00 00 00 00 04 06 14 00-83 A5 04 7C 3E 9E 1C 4F  *............>..O*
  00000050: AD 65 E0 52 68 D0 B4 D1-7F FF 04 00              *.e.Rh.......*
Variable RT+BS '8BE4DF61-93CA-11D2-AA0D-00E098032B8C:BootCurrent' DataSize = 0x02
  00000000: 05 00                                            *..*
Variable RT+BS '8BE4DF61-93CA-11D2-AA0D-00E098032B8C:BootOptionSupport' DataSize = 0x04
  00000000: 03 03 00 00                                      *....*

zu sehen hier die komplette Ausgabe der mit "Boot" beginnenden NVRAM Variablen im RAW-Format. Die Bootvariablen. Bootxxxx sind die Booteinträge in der die Konfiguration der einzelnen Bootloader hinterlegt ist. (Dieses können durchaus auch mal mehr sein, als in der Bootreihenfolge berücksichtigt ist, und die einzelnen Hexadezimal-Nummern müssen nicht aufeinander folgend sein. UEFI verwaltet diese Variablen selbst, und vergibt auch die Nummern selbständig)
In der Efi Variable BootOrder ist die Reihenfolge hinterlegt.

Variable NV+RT+BS '8BE4DF61-93CA-11D2-AA0D-00E098032B8C:BootOrder' DataSize = 0x08
  00000000: 0A 00 02 00 05 00 01 00-                         *........*

Weitere NVRAM Variablen die hier angezeigt werden sind zB. BootCurrent BootNext ....


die eigentliche Bootkonfiguration und die aktuelle Reihenfolge sehen wir mit

Shell> bcfg boot dump
Option: 00. Variable: Boot000A   
  Desc    - Windows Boot Manager
  DevPath - HD(2,GPT,663A220A-5B4E-474D-832F-A969D8334CB4,0x96800,0x31800)/\EFI\Microsoft\Boot\bootmgfw.efi
  Optional- N
Option: 01. Variable: Boot0002   
  Desc    - Grub Secure Boot
  DevPath - PciRoot(0x0)/Pci(0x1,0x1)/Ata(0x0)/HD(2,GPT,663A220A-5B4E-474D-832F-A969D8334CB4,0x96800,0x31800)/\EFI\opensuse\shim.efi
  Optional- N
Option: 02. Variable: Boot0005   
  Desc    - EFI Internal Shell
  DevPath - MemoryMapped(0xB,0x900000,0x10FFFFF)/FvFile(7C04A583-9E3E-4F1C-AD65-E05268D0B4D1)
  Optional- N
Option: 03. Variable: Boot0001   
  Desc    - EFI DVD/CDROM 1
  DevPath - PciRoot(0x0)/Pci(0x1,0x1)/Ata(0x0)
  Optional- N

Wir sehen hier bei Optionen die Startreihenfolge von 0 bis 3 (hinter Option) und dahinter die entsprechenden Bootvariable auf die dabei zugegriffen wird. Darunter wird dann jeweils noch ausgegeben der Name der für diese Bootoption gewählt wurde, und der Devicepath aus der Bootvariablen, der auf einen Bootloader oder eine andere UEFI-Applikation zeigen sollte. Die Ausgabe hier ist ein Kombination aus der BootOrder und den Bootxxxx Variablen und entspricht auch der Reihenfolge die im Bootmenü des UEFI-Setups angezeigt wird.

Soweit die Bootxxxx Variablen noch vorhanden sind und auch entsprechend auf die richtigen Bootloader Dateien verweisen, reicht es eventuell aus nur die Bootreihenfolge zu ändern, damit das System wieder booten kann.

Shell> bcfg boot mv 1 0

vertauscht in unserem Fall den 2.Eintrag, (shim) und setzt ihn an erste Stelle, also vor Windows, Dieses sollten wir selbstverständlich anschließend auch kontrollieren.

Shell> bcfg boot dump
Option: 00. Variable: Boot0002   
  Desc    - Grub Secure Boot
  DevPath - PciRoot(0x0)/Pci(0x1,0x1)/Ata(0x0)/HD(2,GPT,663A220A-5B4E-474D-832F-A969D8334CB4,0x96800,0x31800)/\EFI\opensuse\shim.efi
  Optional- N
Option: 01. Variable: Boot000A   
  Desc    - Windows Boot Manager
  DevPath - HD(2,GPT,663A220A-5B4E-474D-832F-A969D8334CB4,0x96800,0x31800)/\EFI\Microsoft\Boot\bootmgfw.efi
  Optional- N
Option: 02. Variable: Boot0005   
  Desc    - EFI Internal Shell
  DevPath - MemoryMapped(0xB,0x900000,0x10FFFFF)/FvFile(7C04A583-9E3E-4F1C-AD65-E05268D0B4D1)
  Optional- N
Option: 03. Variable: Boot0001   
  Desc    - EFI DVD/CDROM 1
  DevPath - PciRoot(0x0)/Pci(0x1,0x1)/Ata(0x0)
  Optional- N


Mit dem Löschen eines Booteintrages hier sollten wir sehr sehr vorsichtig sein, (bei den Tests hierzu wurde zwar die Bootvariable gelöscht, aber nicht aus der BootOrder entfernt, was dann dazu geführt hatte das die Bootreihenfolge nur noch bis zu der Stelle angezeigt werden konnte, an der sich der gelöschte Booteintrag befunden hatte. Anschließend wurde dann ein Fehler ausgegeben, dass dieser Booteintrag nicht gefunden werden konnte) Am besten wenn ein Booteintrag gar nicht funktioniert, dann hier nur ganz an das Ende der Liste verschieben, dort stört es nicht und erst später vom Betriebssystem aus diesen Eintrag dann löschen.

Löschen eines Eintrages mit der EFI-Shell würde hier wie folgt funktionieren (zB eine hier nicht vorhandenen) Bootoption 06 löschen

Shell> bcfg boot rm 6

Bei unseren Tests ist mit diesem Löschen dann der oben beschriebene Fehler aufgetreten. Die Bootreihenfolge wurde dann nachträglich mittels der BootOrder Variable selbst wieder korrigiert, ( auch hier Warnung, am besten die Finger davon lassen.)

Beispiel:

Shell> dmpstore BootOrder
Variable NV+RT+BS '8BE4DF61-93CA-11D2-AA0D-00E098032B8C:BootOrder' DataSize = 0x08
  00000000: 0A 00 02 00 05 00 01 00-

und auch setvar

Shell> 8BE4DF61-93CA-11D2-AA0D-00E098032B8C - BootOrder - 0008 Bytes
02 00 0A 00 05 00 01 00  

zeigen uns die Reihenfolge 02 0A 05 01 (wobei die Hexdumpwerte hierbei Hexwerte der Bootxxxx Variablen bedeutet),
wir verändern diese jetzt auf 02 0A 01 05

Shell> setvar BootOrder =02000A0001000500

und erhalten danach

Shell> setvar BootOrder
8BE4DF61-93CA-11D2-AA0D-00E098032B8C - BootOrder - 0008 Bytes
02 00 0A 00 01 00 05 00

und auch "bcfg boot dump" sollte jetzt und die geänderte Boot-Reihenfolge anzeigen.


Einzelne nicht mehr benötigte Bootvariablen könnte wir auch mit "setvar" Löschen, (Auch hier die Warnung, am Besten die Finger davon lassen)

Shell> setvar Boot0012 =

würde die Variabel "Boot0012" löschen.



Wenn wir jetzt hier gar keinen brauchbaren Booteintrag finden der sich zum Booten eignet würde und den wir an erste Stelle schieben könnten, oder sonst warum ein neuen Booteintrag anlegen wollen, geht auch dieses mit "bcfg". Dazu wechseln wir zuerst einmal in das Dateisystem in dem sich Bootloader befindet, den wir konfigurieren wollen.

Shell> f0:
FS0:\> 

dort dann mittels "cd" und "ls" dann das Dateisystem untersuchen, bis wir den Bootloader sehen, den wir als Booteintrag anlegen möchten. Den Path bis zu dieser Datei benötigen wir ebenfalls, und wir sollten uns derzeit in mit der EFI-Shell auf diesem Dateisystem befinden.

FS0:\> ls \efi\opensuse\
Directory of: FS1:\efi\opensuse\
03/21/2015  01:14 <DIR>         1,024  .
03/21/2015  01:14 <DIR>         1,024  ..
05/06/2015  21:14           1,380,424  shim.efi
05/06/2015  21:14           1,257,800  MokManager.efi
05/06/2015  21:14             887,416  grub.efi
05/06/2015  21:14                 125  grub.cfg
03/21/2015  01:19             121,344  grubx64.efi
          5 File(s)   3,647,109 bytes
          2 Dir(s)

Zu erkennen dort grubx64.efi, dieses ist der normale Grub2 Bootloader, der bei ausgeschalteten Secure Boot starten sollte. Diesen tragen wir jetzt hier als weiteren Bootloader unten (als Option 04) in der Liste ein. Der Name dieser Bootoption so sein, "Grub2 (kein Secureboot)"

FS0:\> bcfg boot add 4 \efi\opensuse\grubx64.efi "Grub2 (kein Secureboot)"

wir sehen dabei auch eine Erfolgsmeldung, in diesem Fall wurde Boot0000 erzeugt und wie beabsichtigt an die letzte Stelle (04) gesetzt (welche Bootxxxx Variable dabei angelegt wird, darauf haben wir hier keinen Einfluss. Bei genauer Betrachtung der Logausgaben hier würde man sogar erkennen, hier wurde die Boot0000 Variable (oben bei dmpstore noch zu sehen als Bootoption "EFI HardDriv") überschrieben, diese Variable war zwar angelegt und auch Korrekt, aber keiner der Werte in "BootOrder" hat darauf verwiesen.)

Ergebnis:

FS0:\> bcfg boot dump
Option: 00. Variable: Boot0002   
  Desc    - Grub Secure Boot
  DevPath - PciRoot(0x0)/Pci(0x1,0x1)/Ata(0x0)/HD(2,GPT,663A220A-5B4E-474D-832F-A969D8334CB4,0x96800,0x31800)/\EFI\opensuse\shim.efi
  Optional- N
Option: 01. Variable: Boot000A   
  Desc    - Windows Boot Manager
  DevPath - HD(2,GPT,663A220A-5B4E-474D-832F-A969D8334CB4,0x96800,0x31800)/\EFI\Microsoft\Boot\bootmgfw.efi
  Optional- N
Option: 02. Variable: Boot0001   
  Desc    - EFI DVD/CDROM 1
  DevPath - PciRoot(0x0)/Pci(0x1,0x1)/Ata(0x0)
  Optional- N
Option: 03. Variable: Boot0005   
  Desc    - EFI Internal Shell
  DevPath - MemoryMapped(0xB,0x900000,0x10FFFFF)/FvFile(7C04A583-9E3E-4F1C-AD65-E05268D0B4D1)
  Optional- N
Option: 04. Variable: Boot0000   
  Desc    - Grub2 (kein Secureboot)
  DevPath - PciRoot(0x0)/Pci(0x1,0x1)/Ata(0x0)/HD(2,GPT,663A220A-5B4E-474D-832F-A969D8334CB4,0x96800,0x31800)/\EFI\opensuse\grubx64.efi
  Optional- N

Damit wollen wir unsere kleine Exkursion in die EFI-Shell auch schon wieder beenden, Verlassen mit "exit" oder mit "reset" .

Nochmal zur Warnung: Die EFI-Shell ist nicht unbedingt für Otto-den-Normal-User gedacht. Ziel sollte es im Bedarfsfall maximal sein, hier einen funktionierenden Bootloader im Dateisystem zu finden und zu starten, maximal noch die Bootreihenfolge ändern und gegebenenfalls auch wenn notwendig mal einen neuen Booteintrag anzulegen. Man kann in der EFI-Shell durchaus auch die Unterstützung von Geräten im UEFI unterbinden oder anderweitig das Booten komplett abschalten wenn man hier leichtsinnig irgendwelche Dinge umbiegt oder löscht, das Ding ist sehr mächtig, aber auch sehr gewöhnungsbedürftig. Also sicherheitshalber ist hier Weniger oftmals Mehr.

Konfiguration aus Windows