直接從 UEFI 啟動核心
我想直接從 UEFI 啟動 Arch Linux。
我的想法是使用該工具創建一個啟動項
efibootmgr
;我使用了這個命令:efibootmgr --create --label "arch-test" --loader /vmlinuz-linux --unicode 'root=PARTUUID=f2083749-8bbc-570b-ab3b-e79d72fa08ac rw initrd=\initramfs-linux.img' --verbose
我關注了 EFISTUB 上的 Arch Wiki 頁面並創建了條目,但是當我嘗試從該條目啟動時,系統在很早的階段就卡在了啟動狀態,並顯示以下消息:
VFS: unable to mount root fs on unknown-block(0,0)
PS:我想讓它作為緊急/救援工具;即最新
systemd
的升級破壞了啟動管理器(systemd-boot),使我的機器無法使用;借助外部實時 USB,我已經能夠恢復我的系統。我想在未來避免這種情況!更新:
有或沒有/斜杠或反斜杠,之前
initrd
沒關係都嘗試了
UUID
andPARTUUID
,沒有任何變化my
/boot
是 on/dev/sda1
而root是/dev/sda3
and
/boot
也是 ESP# 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 "
- 根據您的評論,我嘗試了UEFI Shell。由於我的機器沒有內部 UEFI Shell(可能嗎?),因此我將此選項保留為最新選項。無論如何,我有:
- 從tianocore下載了一個
- 放入
Shell.efi
_/boot/EFI/Boot/
- 添加了一個條目
efibootmgr --create --label "TIANO-0" --loader /EFI/Boot/Shell.efi --verbose
重新啟動到這個外殼,我輸入`fs0:`並`vmlinuz-linux root=/dev/sda3` 導致相同的錯誤:
S: unable to mount root fs on unknown-block(0,0)
6. 看起來`initrd`是強制性的(*至少對於 Arch Linux 而言*); 該命令`vmlinuz-linux initrd=initramfs-linux.img root=/dev/sda3`使魔術 7. 我的系統是戴爾 XPS 9343 筆記型電腦,我發現它存在一個錯誤:無法啟動 EFISTUB,在 ArchWiki 上報告[過](https://wiki.archlinux.org/index.php/Dell_XPS_13_(9343)#EFISTUB_does_not_boot)。 **我認為它解釋了(第一次提到的)正確程序的*失敗!*** ArchWiki 頁面也建議了一種解決方法,但目前我已經嘗試過了。 ---
-l | --loader NAME Specify a loader (defaults to \\elilo.efi)
帶有 EFI-stub 的核心仍然不是loader。要從 BIOS 啟動,它必須是 EFI應用程序。所有引導載入程序都有 .EFI 後綴。我認為可以將核心變成這樣一個直接可引導的對象,但通常它是啟動的引導載入程序之一(有或沒有提供選擇)。
但是您可以使用UEFI shell(在現代系統上)作為互動式引導載入程序。這非常適合測試。你在 BIOS 中像啟動設備一樣啟動它,
cd
到fs0:
ESP,然後你可以fs0:> bzImage root=/dev/sda3
幾天前我剛剛編譯了第一個 bzImage。首先我忘記了 CONFIG_EFI_STUB 並且 UEFI shell 將核心視為非二進製文件。第二個版本確實啟動了,沒有任何 initrd=。除了 EFI_STUB=y 我剛剛關閉了一些選項並保留了預設值。
但確實大多數發行版都有沒有基本塊設備驅動程序的核心——他們需要這個
initrd=IMAGE
選項。我使用 Uefi Shell 作為我的引導載入程序。這不是超級優雅,但非常簡單和靈活。作為緊急選項,我認為它是完美的,因為 Uefi Shell 是內置的,而分區上的引導載入程序可以刪除。
這是來自文件/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
我有相同的 Uefi Shell 提示符
fs0:>
,但我發現所有常見的發行版都有 EFI_STUB 核心,名稱根本不重要。最常見的是“vmlinuz”(= 圍繞壓縮 vmlinux 的載入器)。如果您不使用 “.efi” 和 “console=” 選項,則會留下:
fs0:> bzImage root=/dev/sda4
這是相同的最小啟動命令,除了我有
sda3
:Uefi Shell 通過 啟動 bzImagestub
,核心被解壓並啟動,內置模組辨識 SATA 磁碟。如果root=
設備無效,您會感到VFS: unable to mount
恐慌。我無法直接從 BIOS 啟動 bzImage(或 vmlinuz,或…),例如 grub64.EFI。
UEFI - 應用程序(維基百科):
除了載入作業系統之外,UEFI 還可以執行 UEFI 應用程序,這些應用程序作為文件駐留在 EFI 系統分區上。它們可以從 UEFI 命令外殼、韌體的引導管理器或其他 UEFI 應用程序執行。UEFI 應用程序可以獨立於系統製造商進行開發和安裝。
UEFI 應用程序的一種類型是作業系統載入程序,例如 GRUB、rEFInd、Gummiboot 和 Windows Boot Manager;它將作業系統文件載入到記憶體中並執行它。此外,OS 載入程序可以提供使用者界面以允許選擇另一個 UEFI 應用程序來執行。 UEFI shell 等實用程序也是 UEFI 應用程序。
這證實了我的觀點,即 UEFI Shell 位於韌體引導載入程序和核心之間。
Gentoo 也有類似的例子;他們堅持用 .EFI 後綴命名核心。
如果由於某種原因需要一個 initramfs,它可以嵌入到核心中或用作單獨的文件。
…
然而,一些 UEFI 實現似乎不支持將參數從 NVRAM 傳遞到 EFI 存根核心。