Arch-Linux

直接從 UEFI 啟動核心

  • April 17, 2020

我想直接從 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,我已經能夠恢復我的系統。我想在未來避免這種情況!


更新:

  1. 有或沒有/斜杠或反斜杠,之前initrd沒關係

  2. 都嘗試了UUIDand PARTUUID,沒有任何變化

  3. my/boot是 on/dev/sda1root/dev/sda3

  4. 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   "
  1. 根據您的評論,我嘗試了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 中像啟動設備一樣啟動它,cdfs0: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 通過 啟動 bzImage stub,核心被解壓並啟動,內置模組辨識 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 存根核心。

引用自:https://unix.stackexchange.com/questions/572921