Ich möchte Arch Linux direkt von UEFI booten.
Meine Idee ist, mit dem Tool einen Boot-Eintrag zu erstellen efibootmgr
. Ich habe diesen Befehl verwendet:
efibootmgr --create --label "arch-test" --loader /vmlinuz-linux --unicode 'root=PARTUUID=f2083749-8bbc-570b-ab3b-e79d72fa08ac rw initrd=\initramfs-linux.img' --verbose
ich folgtedie Arch Wiki-Seite auf EFISTUBund ich habe den Eintrag erstellt, aber beim Versuch, davon zu booten, bleibt das System in einem sehr frühen Boot-Stadium mit dieser Meldung hängen:
VFS: unable to mount root fs on unknown-block(0,0)
PS: Ich möchte, dass dies als Notfall-/Rettungstool funktioniert. Das letzte systemd
Upgrade hat den Bootmanager (systemd-boot) zerstört und meine Maschine unbrauchbar gemacht. Ich konnte mein System dank eines externen Live-USB wiederherstellen. Ich möchte dies in Zukunft VERMEIDEN!
Aktualisierung:
1. mit oder ohne/Schrägstrich oder Backslash, davor initrd
ist egal
2. mit sowohl UUID
als auch versucht PARTUUID
, nichts ändert sich
3. mein /boot
ist an, /dev/sda1
währendWurzelzu /dev/sda3
4. und /boot
ist ESP, sowie
# fdisk -l /dev/sda
[...]
Disklabel type: gpt
[...]
Device Start End Sectors Size Type
/dev/sda1 2048 2099199 2097152 1G EFI System
/dev/sda2 2099200 18874367 16775168 8G Linux swap
/dev/sda3 18874368 104857599 85983232 41G Linux filesystem
[...]
# minfo -i /dev/sda1 :: | grep 'disk type'
disk type="FAT32 "
nach Ihren Kommentaren habe ich versucht,UEFI-Shell. Ich habe diese Option auf dem neuesten Stand belassen, da mein Rechner keine interne UEFI-Shell hat (Ist es möglich?). Wie auch immer, ich habe:
- heruntergeladen vonAbonnieren
- platziert
Shell.efi
in/boot/EFI/Boot/
hat einen Eintrag hinzugefügt mit
efibootmgr --create --label "TIANO-0" --loader /EFI/Boot/Shell.efi --verbose
neu gestartet in diese Shell, ich tippte
fs0:
undvmlinuz-linux root=/dev/sda3
was zum selben Fehler führt:
VFS: unable to mount root fs on unknown-block(0,0)
es sieht so aus, als ob
initrd
es obligatorisch ist (zumindest für Arch Linux);
der Befehlvmlinuz-linux initrd=initramfs-linux.img root=/dev/sda3
macht die Magiemein System ist ein Dell XPS 9343 Laptop und ich habe festgestellt, dass es an einem Fehler leidet: EFISTUB kann nicht gebootet werden, gemeldet auf ArchWikiHier.
Ich denke, das erklärt dieVersagender (erstgenannten) richtigen Vorgehensweise!
Die ArchWiki-Seite schlägt auch einen Workaround vor, aber im Moment habe ich es selbst ausprobiert.
Antwort1
-l | --loader NAME
Specify a loader (defaults to \\elilo.efi)
Ein Kernel mit EFI-Stub ist noch immer keinLader. Um vom BIOS zu booten, muss es ein EFI-Anwendung. Alle Bootloader haben die Endung .EFI. Ich denke, es ist möglich, einen Kernel in ein solches direkt bootfähiges Objekt umzuwandeln, aber normalerweise wird einer der Bootloader gestartet (mit oder ohne Auswahlmöglichkeit).
Aber Sie könnenUEFI-Shell(auf modernen Systemen) als interaktiver Bootloader. Das ist perfekt zum Testen. Sie aktivieren es wie ein Boot-Gerät im BIOS, cd
auf fs0:
, das ist das ESP, und dann können Sie
fs0:> bzImage root=/dev/sda3
Ich habe vor ein paar Tagen gerade ein erstes bzImage kompiliert. Zuerst vergaß ich CONFIG_EFI_STUB und die UEFI-Shell behandelte den Kernel wie eine Nicht-Binärdatei. Eine zweite Version bootete, ohne initrd=. Außer EFI_STUB=y habe ich einfach ein paar Optionen ausgeschaltet und die Standardeinstellungen beibehalten.
Aber es stimmt, dass die meisten Distributionen Kernel haben, dienichthaben die grundlegenden Blockgerätetreiber – sie benötigen die initrd=IMAGE
Option.
Als Bootloader verwende ich die Uefi Shell. Das ist zwar nicht super elegant, aber sehr simpel und flexibel. Und als Notfalllösung halte ich das für perfekt, da die Uefi Shell fest eingebaut ist, während ein Bootloader auf einer Partition gelöscht werden kann.
Das ist vonDokumentation/efi-stub.txt
> Passing kernel parameters from the EFI shell > -------------------------------------------- > > Arguments to the kernel can be passed after bzImage.efi, e.g.:: > > fs0:> bzImage.efi console=ttyS0 root=/dev/sda4
Ich habe dieselbe Uefi Shell-Eingabeaufforderung fs0:>
, habe aber festgestellt, dass alle üblichen Distributionen EFI_STUB-Kernel haben und der Name überhaupt keine Rolle spielt. Am gebräuchlichsten ist „vmlinuz“ (= Loader für ein komprimiertes vmlinux).
Wenn Sie die Optionen ".efi" und "console=" weglassen, bleibt Folgendes übrig:
fs0:> bzImage root=/dev/sda4
Das ist derselbe minimale Boot-Befehl, außer dass ich Folgendes habe sda3
: Uefi Shell startet das bzImage über stub
, der Kernel wird entpackt und gestartet und die integrierten Module erkennen die SATA-Festplatte. Wenn das root=
Gerät nicht gültig ist, kommt es zu dieser VFS: unable to mount
Panik.
Ich konnte ein bzImage (oder vmlinuz oder ...) nicht direkt vom BIOS aus starten, wie ein grub64.EFI.
UEFI - Anwendungen (Wikipedia):
Neben dem Laden eines Betriebssystems kann UEFI auch UEFI-Anwendungen ausführen, die als Dateien auf der EFI-Systempartition liegen. Sie können über die UEFI-Befehlsshell ausgeführt werden.durch den Bootmanager der Firmwareoder durch andere UEFI-Anwendungen. UEFI-Anwendungen können unabhängig vom Systemhersteller entwickelt und installiert werden.
Ein Typ einer UEFI-Anwendung ist ein Betriebssystemlader wie GRUB, rEFInd, Gummiboot und Windows Boot Manager, der eine Betriebssystemdatei in den Speicher lädt und ausführt. Ein Betriebssystemlader kann auch eine Benutzeroberfläche bereitstellen, über die eine andere auszuführende UEFI-Anwendung ausgewählt werden kann. Dienstprogramme wie die UEFI-Shell sind ebenfalls UEFI-Anwendungen.
Dies bestätigt meine Ansicht, dass sich die UEFI-Shell zwischen dem Firmware-Bootloader und dem Kernel befindet.
Gentoo hat ähnliche Beispiele; sie bestehen darauf, den Kernel mit der Endung .EFI zu benennen.
Wenn aus irgendeinem Grund ein Initramfs benötigt wird, kann es entweder in den Kernel eingebettet oder als separate Datei verwendet werden.
...
Einige UEFI-Implementierungen jedochscheint die Übergabe von Parametern nicht zu unterstützenvom NVRAM zum EFI-Stub-Kernel.
Antwort2
Es scheint, dass einige ältere Maschinen mit älterer UEFI-Firmware keine Befehlszeilenargumente an EFI-Binärdateien übergeben (wie etwa ein EFISTUB-fähiger Linux-Kernel). Dies macht es unmöglich, wichtige Parameter wie root=
und initrd=
beim Booten an den Kernel zu übergeben.
Ich habe genau das gleiche Verfahren verwendet, um den Kernel direkt von UEFI zu booten (genauer gesagt das unterhttps://wiki.debian.org/EFIStub, aber ich habe es tatsächlich auf Ubuntu gemacht) auf zwei verschiedenen Maschinen. Auf meinem drei Jahre alten ASrock-Motherboard funktionierte es einwandfrei. Auf meinem elf Jahre alten Dell-Laptop ignoriert es einfach die Kernel-Befehlszeilenargumente.
Wenn Ihre Firmware also keine Befehlszeilenargumente unterstützt, haben Sie möglicherweise Pech gehabt. Ich werde es weiter versuchen und einen Folgebeitrag posten, wenn ich eine Problemumgehung finde.