Dienstag, 2. August 2022

UEFI Start manipulieren

Mal eben von einem externen Laufwerk ein anderes System starten: USB Laufwerk einstecken, Restart ausführen - Mist - wie war die Taste für das Bootmenü? Ach ja: F7 - Mist zu langsam gedrückt - neuer Versuch.

Dieses Vorgehen ist doch echt nervig!? 

Es geht eventuell auch anders: Mit BCDEdit (Windows) und efibootmgr (Linux) hat man Tools um per Kommandozeile den (nächsten) Start des Rechners zu beeinflussen. Also neuer Versuch: USB Laufwerk einstecken, Script für den Restart ausführen und entspannt zuschauen wie präzise das gewünschte System ausgeführt wird. So könnte es gehen - mal schauen wie weit ich komme. Das wird erstmal ein Arbeitsdokument.

Nächster Start: einen EFI Eintrag starten

Erster Versuch für Windows

Zunächst muss man die aktuelle Konfiguration ermitteln (CMD oder Powershell im Admin Kontext):

bcdedit /enum firmware

Was man hier sieht ist wieder stark vom BIOS abhängig. Ein gesteckter bootfähiger USB Stick wird erst nach einem Neustart gelistet. Manches BIOS enthält aber funktionierende "Platzhalter" für UEFI: USB Stick, UEFI: DVD Laufwerk usw. die können auch ohne extra Neustart sofort funktionieren. 

Mann braucht im Folgenden die UID aus dem Bezeichner (ist lokalisiert), die description (ist immer english) verrät einem eventuell Details. Mit Powershell könnte man einen exakt bekannten Eintrag auslesen (Idee)

bcdedit /enum firmware|Select-String "UEFI: JetFlashTranscend 16GB 1.00" -Context 1,1|%{ $_.context.Precontext[0]}
Das folgende Script prüft am Anfang ob es erhöhte Rechte besitzt und startet sich selbst neu. Der Befehl erzeugt einen neuen Eintrag bootsequence, der beim nächsten Start wieder gelöscht wird.

Achtung: Für bcdedit in PS muss man die Parameter in den Klammern {} in Anführungszeichen setzen "{}".

if (!([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)) {
    Start-Process PowerShell -Verb RunAs "-NoProfile -ExecutionPolicy Bypass -Command `"cd '$pwd'; & '$PSCommandPath';`"";
    exit;
}

bcdedit /set "{fwbootmgr}" bootsequence "{4bfeac0b-4770-11ea-a143-806e6f6e6963}"
shutdown /r /t 01

Hilfe: bekommt man mit bcdedit /? und weitere z.B. bcdedit /? set, bcdedit /? types, bcdedit /? formats

Zweiter Versuch für Linux 

Mit dem Tool efibootmgr erhält man die Liste der Einträge und der aktuellen Reihenfolge. Mit efibootmgr -n <Eintrag in HEX> kann man die Reihenfolge für den nächsten Start ändern. Man bekommt dies auch einfach angezeigt. Mit bcdedit /enum firmware wird sie auch angezeigt allerdings in UIDs und damit schwierig lesbar.

efibootmgr -n 0000

Die EFI Bootreihenfolge statisch ändern

efibootmgr -o 5,2,3,4,1,0 

bcdedit /set {fwbootmgr} displayorder {bootmgr/oder UID} /addfirst

Fazit

Leider hat jedes UEFI - sehr Herstellerspezifisch - ein gewisses "Eigenleben". Oder sind das Bugs in der Firmware? Wenn man die obigen Befehle in einer Hyper-V Gen2 Maschine testet funktioniert alles nachvollziehbar. Auf einer Hardware mit EFI Bios lief es unklar... 

Ich bin noch nicht sicher ob man dies wirklich präzise beherrschen kann. 

Noch ein paar Links

http://www.mistyprojects.co.uk/documents/BCDEdit/files/examples4.htm

https://github.com/mmseng/bcdedit-revert-uefi-gpt-boot-order

https://oofhours.com/2022/02/15/windows-11-includes-new-bcd-powershell-cmdlets/

https://stackoverflow.com/questions/16903460/bcdedit-bcdstore-and-powershell

https://aps2.support.emea.dynabook.com/kb0/TSB1203QJ0000R01.htm

noch zu tun?

Code Block

Das ist mein Platzhalter für Erweiterungen.

Keine Kommentare:

Kommentar veröffentlichen