UEFI Boot Konfiguration

Aus Linupedia
Wechseln zu: Navigation, Suche


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 z.B.:

  • 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 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ährend 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 Variablen mit dem gleichen Namen hierdurch 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 hier sind 2 Textabschnitte zu erkennen die in UTF-16 abgelegt sind.

In diesem Fall handelt 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 z.B. eine Variable mit dem Namen Boot0001. Von diesen Variablen sind in aller Regel mehrere vorhanden. Typischer Weise sind meist 3 bis 8 solcher Variablen vorhanden, die mit Boot0000 beginnen.
Der Inhalt besteht aus einem BootLabel (Das ist das was als Name für diesen Booteintrag angezeigt wird. Mindestens aus einem Gerätepfad heraus. Zusätzlich können noch der Dateiname mit Pfad zu einer Datei und dem Prefix ".efi" herausgelesen werden. Dieses ist dann der Pfad 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ätepfad können wir aus den rohen Daten in der Variable selbst kaum interpretieren. Zum Glück gibt es spezielle Tools zur Bootkonfiguration, die uns diesen Gerätepfad 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ätepfades die Treiberhierarchie mit einbeziehen müssen und es Unterschiede zwischen den benutzten Treibern des UEFI und des Betriebssystems gibt. Auch kann dieser Pfad einmal in voller Länge und ein anderes mal mit verkürzter Länge dargestellt werden. Eindeutig wird er in all den Fällen aber immer, wenn die Partitions-UUID mit im Gerätepfad enthalten ist.

Im folgenden Beispielen die alle den selben Gerätepfad 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 eine direkte Bootauswahl mehr oder weniger von Bedeutung sind:

  • BootCurrent : Hier ist der 4 stellige Hexadezimalwert des letzten erfolgreichen Bootvorgangs enthalten.
  • BootNext : Hier kann ein 4 stelliger Hexadezimalwert für den nächsten Bootvorgang stehen. Dieser ü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 z.B. genutzt werden, um vorgegebene Werte zu speichern, die bei einem Set-to-default (also Zurücksetzen auf Voreinstellungen.) 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.



UEFI Konfiguration aus Windows

Um an der UEFI Bootkonfiguration von Windows aus heranzugehen kann es nicht schaden, sich erst einmal ein wenig über das Bootkonzept von Windows zu informieren. Ein wenig Wissen darüber wird sich schnell auszahlen, wenn man mit diesen Erkenntnissen anschließend nicht versuchen muss tagelang mit den falschen Tools gewünschte Änderungen vorzunehmen.


Zugriff auf die EFI-Partition

ESP ist zwar ein Windowsdateisystem, doch als solches normalerweise von Windows aus nicht sichtbar. Das Dateisystem ist versteckt. Um dennoch von Windows aus die Dateien auf diesem Dateisystem zu sichten, und gegebenen falls Änderungen dort vorzunehmen muss es erst eingehängt werden. Dazu am Besten mittels "Eingabeaufforderung(als Administrator)" ein entsprechendes Commandline Eingabefenster öffnen. Wenn denn wirklich notwendig, kann man sich hier auch noch über die im System befindlichen Platten einen Überblick verschaffen.
Befehl: diskpart dort dann list disk, verlassen mit exit (doch vorsichtig mit dem Befehl "diskpart", damit kann man auch die Platten neu partitionieren und damit mehr kaputt machen wie einem lieb ist.)

 
ISKPART> list disk

  Datenträger ###  Status        Größe    Frei     Dyn  GPT
  ---------------  ------------  -------  -------  ---  ---
  Datenträger 0    Online         64 GB      0B          *

DISKPART> exit

Das einbinden des ESB als Laufwerk ähnelt dann der Vorgehensweise des mounten in Linux
Einhängen der ESP Partition als Laufwerk Z:

 mountvol Z: /s 

Nach dem die Arbeiten dorr abgeschlossen sind, dann das Laufwerk Z: wieder aushängen

 mountvol Z: /d 

Wenn das Laufwerk Z: eingehängt ist, kann man mit dem Dateibrowser oder mittels DOS Kommandos dort ganz normal arbeiten, um zB Dateien anzulegen, zu löschen, umzubenennen, verschieben usw. Hier ein kleines Beispiellog, welches dieses verdeutlicht.

C:\WINDOWS\system32>mountvol  Z: /s

C:\WINDOWS\system32>Z:

Z:\>dir
 Volume in Laufwerk Z: hat keine Bezeichnung.
 Volumeseriennummer: 4250-0537

 Verzeichnis von Z:\

21.03.2015  01:14    <DIR>          EFI
16.09.2015  16:54            12.193 NvVars
20.03.2015  02:51    <DIR>          KEY
20.03.2015  02:52    <DIR>          tools
10.09.2015  23:13             8.969 log.txt
               2 Datei(en),         21.162 Bytes
               3 Verzeichnis(se),     67.798.016 Bytes frei


Z:\>cd efi\opensuse

Z:\EFI\opensuse>dir
 Volume in Laufwerk Z: hat keine Bezeichnung.
 Volumeseriennummer: 4250-0537

 Verzeichnis von Z:\EFI\opensuse

21.03.2015  01:14    <DIR>          .
21.03.2015  01:14    <DIR>          ..
06.05.2015  21:14         1.380.424 shim.efi
06.05.2015  21:14         1.257.800 MokManager.efi
06.05.2015  21:14           887.416 grub.efi
06.05.2015  21:14               125 grub.cfg
21.03.2015  01:19           121.344 grubx64.efi
06.05.2015  21:14         1.380.424 myshim.efi
               6 Datei(en),      5.027.533 Bytes
               2 Verzeichnis(se),     67.798.016 Bytes frei

Z:\EFI\opensuse>c:

C:\Windows\System32>mountvol Z: /d

C:\Windows\System32>Z:
Das System kann das angegebene Laufwerk nicht finden.

Damit sollte es jetzt zB auch möglich sein, sich einen Linuxbootloader oder eine EFI-Shell von Windows aus auf die ESP zu kopieren, oder um nachzuschauen ob die betreffende Datei oder Verzeichnis dort überhaupt vorhanden ist. So etwas kann zB schon helfen bei einem weit verbreiteten BUG in der UEFI-FW [1], der auf einer Reihe von Systemboards zu finden ist. Es wird nicht die im EFI konfigurierte Bootreihenfolge zu booten herangezogen, sondern immer nur der Default Bootloader "\EFI\boot\bootx64.efi" zum Booten verwendet. Wenn man dort seinen "Shim" oder "Grub2" als "\EFI\boot\bootx64.efi" für einen funktionierenden Multiboot abgelegt hat, wird diese Datei eventuell bei jedem größerem Windowsupdate/Upgrade wieder mit dem Bootmanager von Windows überschrieben. Das hat dann zur Folge, das dann wieder nur noch Windows startet und default nicht mehr wie in den meisten MultibootSystemen gewünst, Grub2 gestartet. Mit ein paar wenigen DOS Kommandos könnte von Windows aus ziemlich einfach "Shim.efi" oder "Grubx64.efi" wieder als "bootx64.efi" dort hin kopieren werden.


BCD

Das aktuelle Bootsystem von Windows basiert auf BCD und wird seit Windows Vista benutzt. Als es entwickelt wurde war an eine allumfassende Einführung von EFI oder UEFI noch nicht zu denken. Dieser Umstand führt wahrscheinlich dazu, dass heute beim Gebrauch von Boardmitteln zur Bootkonfiguration von Windows und deren Doku schnell festgestellt wird, dass UEFI da irgendwo nachträglich davor geklemmt wurde und in der eigentlichen Windows Bootkonfiguration auch nur teilweise konfigurierbar ist. Das Tool für die Windows Boot Konfiguration ist "bcdedit"


bcdedit

bcdedit ist das Commandlinetool für die komplette Bootkonfiguration von Windows. Das Tool ist sehr mächtig und die vorhandene Dokumentation obwohl sehr umfangreich, irgendwo zwischen schaurig schlecht und extrem schwer verständlich. Im Vorfeld der Entstehung der UEFI Artikel in diesem Wiki wurde sich ausführlich mit diesem Tool und seinen Möglichkeiten in Bezug auf die UEFI Boot Konfiguration beschäftigt. Dieses Tool ist hauptsächlich und einzig und allein für die Windowsbootkonfiguration bestimmt, dafür ist es entwickelt und dort ist es durchaus hilfreich. Für die Konfiguration der reinen UEFI-Bootkonfiguration ist es nur sehr bedingt brauchbar. Windows geht in seiner Philosophie im Bootprozess davon aus, dass die Welt nur aus Windows besteht, und der Bootprozess von Windows hat ähnliche Aufgaben und Konfigurationsmöglichkeiten die auch "grub2" und zT. auch "systemd" im Linuxbootprozess haben. All diese sind mittels "bcdedit" konfigurierbar. Zum Teil sind die Kommandos hier nicht leicht zu erstellen, da oftmals hier die GUID oder schlecht dokumentierte vordefinierte Bezeichner verwendet werden müssen. UEFI spielt dabei nur am Rande eine Art Neben Rolle. Es sind einige Möglichkeiten vorhanden auch die UEFI-Bootkonfiguration zu ändern und anzupassen, aber Hauptaufgabe ist das nicht, das sollte uns bewusst sein.

Ein paar wenige Befehle die in einer Multibootkonfiguration Windows/Linux hin und wieder mal benötigt werden sollen hier dennoch vorgestellt werden, aber tiefer wollen wir hier in bcdedit nicht einsteigen. Voraussetzung auch hier, es werden ebenfalls Administrator Rechte benötigt.

Das Sichern des kompletten BCD-Store, also der gesamten Bootkonfiguration die Windows derzeit kennt. Dieses sollten wir zB vor dem Installieren von Linux als das 2. Betriebssystem ausführen, und auch danach noch einmal mit einem anderem Datei Namen, nachdem die Bootkonfiguration dann für Multiboot sauber funktioniert. Mit einer solchen Sicherung ist es dann möglich im Bedarfsfall mit bcdedit die ursprünglich funktionierende Bootkonfiguration gezielt wieder herzustellen.

bcdedit /export "C:\Data\sysdefault.uefi"

Ein zurückholen einer solchen Sicherung dann analog

bcdedit /import "C:\Data\sysdefault.uefi"

Gut geeignet ist bcdedit auch zum auslesen der aktuellen Konfiguration, einschließlich der UEFI-Bootkonfiguration. Dieses könnte zB hilfreich sein, um bei gravierenden Problemen die Konfiguration in ein Forum zwecks Hilfe zu posten. Diese macht aber nur Sinn wenn auch die Auflistung der Dateinamen der Linux-Bootloader aus der EFI-Partition auch mit dazu geliefert wird.

C:\WINDOWS\system32>bcdedit /enum all

Start-Manager für Firmware
--------------------------
Bezeichner              {fwbootmgr}
displayorder            {94e4b67b-ce8b-11e4-9e2b-b59e390c8fcd}
                        {bootmgr}
                        {94e4b67a-ce8b-11e4-9e2b-b59e390c8fcd}
                        {94e4b67e-ce8b-11e4-9e2b-b59e390c8fcd}
                        {94e4b679-ce8b-11e4-9e2b-b59e390c8fcd}
                        {94e4b67c-ce8b-11e4-9e2b-b59e390c8fcd}
                        {0a50b585-ce9d-11e4-ab31-00163e1c698d}
                        {2ce453f3-06c3-11e5-b220-806e6f6e6963}
                        {2ce453f4-06c3-11e5-b220-806e6f6e6963}
timeout                 0

Windows-Start-Manager
---------------------
Bezeichner              {bootmgr}
device                  partition=\Device\HarddiskVolume2
path                    \EFI\Microsoft\Boot\bootmgfw.efi
description             Windows Boot Manager
locale                  de-DE
inherit                 {globalsettings}
default                 {default}
resumeobject            {94e4b691-ce8b-11e4-9e2b-b59e390c8fcd}
displayorder            {current}
toolsdisplayorder       {memdiag}
timeout                 30

Firmwareanwendung (101fffff)
----------------------------
Bezeichner              {0a50b585-ce9d-11e4-ab31-00163e1c698d}
device                  partition=\Device\HarddiskVolume2
path                    \EFI\opensuse\shim.efi
description             EFI Floppy

Firmwareanwendung (101fffff)
----------------------------
Bezeichner              {2ce453f3-06c3-11e5-b220-806e6f6e6963}
description             EFI Floppy 1

Firmwareanwendung (101fffff)
----------------------------
Bezeichner              {2ce453f4-06c3-11e5-b220-806e6f6e6963}
description             EFI Hard Drive

Firmwareanwendung (101fffff)
----------------------------
Bezeichner              {4198755e-0700-11e5-b690-806e6f6e6963}
description             EFI Floppy

Firmwareanwendung (101fffff)
----------------------------
Bezeichner              {4198755f-0700-11e5-b690-806e6f6e6963}
description             EFI Floppy 1

Firmwareanwendung (101fffff)
----------------------------
Bezeichner              {94e4b679-ce8b-11e4-9e2b-b59e390c8fcd}
device                  partition=\Device\HarddiskVolume2
path                    \EFI\opensuse\grubx64.efi
description             Grub2 (kein Secureboot)

......                              

Die Ausgabe hier ist gekürzt, dort unten können noch jede Menge Windowseinträge (oftmals Duplikate) kommen, insbesondere wenn das Windowssystem schon mehrfach Upgrade hinter sich hat, sind dort eventuell viele OS-Loader, Recovery- und Hiperfil- Einträge. Diese sind für eine Multibootkonfiguration mit Linux meist nicht von Belang. Im UEFI Umfeld sind folgende Bereiche von Bedeutung.

  • Start-Manager für Firmware : hier befindet sich die UEFI-Startreihenfolge, Die Reihenfolge hier entspricht der BootOrder Variable, allerdings sind hier nicht direkt die Hexadezimalwerte der Bootxxxx Variablen, sondern bei den meisten Einträge ist hier nur die GUID der Bootxxxx Variablen angegeben.
  • Windows-Start-Manager : dieses ist {bootmgr}, das ist der Windows Boot Manager, der auch eine der Bootxxxx Variablen ist.
  • Firmwareanwendung (101fffff): dieses sind alle anderen (also alle außer dem "Windows-Boot-Manager") Bootxxxx Variablen die in der BootOrder stehen, bzw. derzeit im UEFI bekannt sind.

Damit ließe sich mit etwas Aufwand in der Kombination der GUIDs die aktuellen UEFI-Bootloader Konfiguration auslesen. Zu beachten hier, die UEFI-Bootloader von Linux und alle anderen vom UEFI selbst angelegte Bootxxxx sind als Firmwareanwendung zu erkennen. Windows kennt nur einen einzigen Bootmanager, (den eigenen) und OS_loader sind Loader die aus dem Menu des WindowsBootmanager heraus aufgerufen werden können.

Auf Befehle die hier aktiv eingreifen und etwas ändern, möchten wir ausdrücklich verzichten und auch dringend davor warnen hier etwas mit bcdedit im UEFI-Umfeld zu machen, (obwohl das eine oder andere durchaus möglich ist). Besser dieses wenn notwendig mit einem Grafischen Tool unter Windows machen. Dafür gibt es einige.


Links zur Doku von BCD und bcdedit

Wer sich näher mit BCD oder bcdedit beschäftigen will, oder irgendwie an der Windowsbootloaderkonfiguration etwas ändern oder reparieren muss, hier sind ein paar Links zu Doku dazu.


Grafische Tools zur Windows Bootkonfiguration
VisualBCD GUI zur Bearbeitung der WindowsBootkonfiguration

Beispielgebend für eine GUI zu BCD soll hier Visual BCD Editor vorgestellt werden, Ein (aber keinesfalls der Einzige) GUI-Editor für das Bearbeiten der BCD Daten. Dieses Tool kann wahrscheinlich alles was man mit bcdedit auch machen könnte. Auffällig hier, in der Gruppe Loaders sind die OS-Loader,(also die Loader die innerhalb des Windowsbootmanager alle auswählbar sind) mit den Firmwareloadern (also die UEFI-Bootvariablen) gemischt.
Mit diesem (oder ähnlichen) BCD GUI Tools hätte der NormalUser zu mindestens eine gute Chance das eine oder andere an der Bootkonfiguration "richtig" zu korregieren. Aber auch hier sei gewarnt, dieses ist nur ein Frontend für BCD und BCD hat nicht wirklich die richtigen Mittel und Methoden um die UEFI-Variablen alle zielgerecht zu bearbeiten. Zum Beispiel wird man feststellen, es lassen sich keine Firmwareanwendungen(101fffff) erzeugen. (also keine Bootxxxx Variablen) und die die existieren, lassen sich nicht immer wirklich ändern, auch wenn bcdedit oder die GUI sagt, es habe die Änderung erfolgreich geschrieben. ( Dieses liegt uA daran, dass die UEFI-Variablen innerhalb des BCD-Store noch einmal als Kopie vorliegen) Auch hier die Warnung, das Tool ist für die Windowsbootkonfiguration und nicht in erster Linie für die UEFI-Bootkonfiguration, (auch wenn natürlich auch hier einiges möglich ist)

UEFI Bootvariable bearbeiten

EasyUEFI GUI zum Konfigurieren der UEFI Bootvariablen

Nach dem wir feststellen durften, dass mit der normalen Bootkonfiguration von Windows die UEFI-Variablen nicht wirklich gut bis gar nicht zu ändern sind, hier jetzt ein Tool mit dem dieses unter Windows erledigt werden kann. Nach einem Commandline Tool haben wir gar nicht erst gesucht, sondern gleich nach einer GUI und wurden fündig mit EasyUEFI.
Mit dieser GUI ist es auch für einen Linuxuser ohne Windowskenntnisse möglich unter Windows relativ unkompliziert Bootvariablen neu anzulegen, zu sortieren und überflüssige zu deaktivieren oder zu löschen. Es ist möglich eine Bootvariable für den nächsten Bootvorgang festzulegen und einiges mehr. Auch ist es möglich hier gleich aus der GUI den Rechner zu rebooten. Dieses Tool scheint nach unseren Tests eine gute Ergänzung in einem Multibootsystem mit Linux zu sein. Es ist übersichtlicher, universeller und einfacher zu bedienen als so maches UEFI-BIOS-SETUP. Man kann hiermit ohne große Kenntnisse von UEFI die default Bootreihenfolge nach seinen Bedürfnissen einstellen, oder zB auch auswählen, das beim nächsten Reboot nicht Windows sondern Linux gestartet werden kann.




LINKS