EFI 引導錯誤:請附加正確的設備“root=”引導選項
我嘗試在沒有引導載入程序的情況下直接從 EFI/BIOS 啟動系統(Kubuntu 20.04)以加快啟動速度。
我編譯了**Linux-kernel-5.8.5
/usr/src/linux-5.8.5/arch/x86/boot/bzImage
,將文件複製並重命名為/boot/efi/EFI/ubuntu.efi
. 重新啟動進入 BIOS,選擇ubuntu.efi並添加到安全啟動**。系統啟動但我收到以下錯誤:
Please append a correct device "root=" boot option; here are the available partitions: (driver?) 103:00001 123456 nvme0n1p1 ...UUID.... 103:00002 123456 nvme0n1p2 ...UUID.... 103:00003 123456 nvme0n1p3 ...UUID.... kernel panic - not syncing: VFS: unable to mount root fs on unknown-block(0,0)
pci、fs和nvme驅動程序建構在核心 (*) 中。據我所知,只需要輸入分區的路徑和根目錄,但是在哪裡呢?
—-EDIT—-
錯誤資訊說,要選擇正確的分區。
我在這裡輸入了正確的分區:
make menuconfig
Processor type and features ---> [*] Built-in kernel command line (root=/dev/nvme0n1p5) Built-in kernel command string [*] Built-in command line overrides boot loader arguments
我犯了同樣的錯誤。
然後我嘗試用 替換路徑
root=/dev/nvme0n1p5
並UUID
得到相同的錯誤。我仔細查看了 UUID 並發現,列出的 UUID 實際上是一個PARTUUID(您可以使用命令:blkid找到),所以我嘗試了 PARTUUID,沒有任何改變相同的錯誤。
無論我輸入什麼,
Built-in kernel command string
我總是得到同樣的錯誤。
一種方法是將引導選項添加到 NVRAM 中的 UEFI 引導變數,使用命令
-@
選項efibootmgr
:echo "root=/dev/nvme0n1pX" | efibootmgr -c -d /dev/nvme0n1 -L "Kubuntu with kernel UEFI stub" -l \\EFI\\ubuntu.efi -@ -
…
/dev/nvme0n1pX
包含您的實際根文件系統的 NVME 設備分區在哪裡,/dev/nvme0n1
是包含您的 ESP 分區的 NVME 設備,並且\\EFI\\ubuntu.efi
是相對於 ESP 分區的根目錄的 Windows 樣式路徑名,帶有雙反斜杠,因為反斜杠是一個特殊字元為殼。您可以設置任何您想要的標籤文本(-L
選項參數)。請注意,這根本不包括 initramfs,除非您已將其嵌入到核心文件中。可以通過添加核心引導參數來讓 UEFI 存根載入 initramfs,
initrd=\\EFI\\initrd.img
但支持不確定,因為這方面的文件非常差,並且取決於 UEFI 韌體支持,可能存在錯誤和特定於供應商的怪癖(某些系統可能需要全部大寫的絕對路徑,其他具有準確大小寫的相對路徑等)。它也不允許通過編輯核心引導選項來引導進入緊急/單使用者模式,因為您沒有允許在引導時編輯它們的引導載入程序。因此,您需要預測任何可能的啟動選項要求並生成多個 UEFI 啟動變數以提前涵蓋任何可能的情況,或者在早期啟動過程出現任何問題時從外部媒體重新啟動系統。
但是,如果您正在建構一個不易被使用者篡改的設備或資訊亭式系統,那麼這些限制可能非常適合您。
(在古代版本的 Linux 中,曾經有一種方法可以直接操作 bzImage 文件以通過次要/主要設備號預先設置預設根設備;但我不確定這是否適用於現代核心,並且似乎不記得用於執行操作的命令的名稱。)