我尝试直接从 EFI/BIOS 启动系统(Kubuntu 20.04),以实现更快的启动速度,而无需启动加载程序。
我编译了Linux-内核-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驱动程序构建在内核中 (*)。据我所知,只需输入分区路径和根目录,但是在哪里?
----编辑----
错误消息显示,选择正确的分区。
我在这里输入了正确的分区:
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实际上是一个帕图UID(可以通过命令查看:黑子),所以我尝试了 PARTUUID,没有任何改变,同样的错误。
无论我在其中输入什么,Built-in kernel command string
我总是会遇到相同的错误。
答案1
一种方法是使用以下命令-@
的选项将引导选项添加到 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 固件支持可能存在错误和特定于供应商的怪癖(某些系统可能需要全部大写的绝对路径,其他路径是大小写准确的相对路径,等等)。
它还不允许通过编辑内核启动选项来启动到紧急/单用户模式,因为您没有允许在启动时编辑它们的启动加载程序。因此,您需要预测任何可能的启动选项要求,并生成多个 UEFI 启动变量以提前涵盖任何可能的情况,或者在早期启动过程出现任何问题时从外部介质重新启动系统。
但是,如果您正在构建用户不易篡改的设备或信息亭式系统,那么这些限制可能很适合您。
(在古代版本的 Linux 中,曾经有一种方法可以直接操作 bzImage 文件,通过次要/主要设备编号预先设置默认根设备;但我不确定这是否适用于现代内核,并且似乎不记得用于执行操作的命令的名称。)
答案2
我解决了。
正确的命令是:fs0:> Kubuntu.efi root=/dev/nvme0n1p5
解决方案位于:Linux-kernel ---> ~/Documentation/admin-guide/efi-stub.rst
非常感谢您的帮助。