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