直接从 UEFI 启动时内核崩溃

直接从 UEFI 启动时内核崩溃

我最近使用 debootstrap(没有 ubiquity)安装了 Ubuntu 16.04。我希望能够直接从 UEFI 启动菜单启动它,而无需 GRUB。

我有:

  • 确认内核(4.13.0-32-generic)是使用 EFI 存根构建的
  • 将内核和 initrd 复制到 ESP
  • 使用 efibootmgr 和 EFI shell 创建 UEFI 启动菜单条目
  • 对所有路径进行再三检查
  • 尝试使用 4.4.0-113 内核
  • 尝试root=通过设备名称和 UUID 提供选项
  • 跑了update-initramfs

每次我最终都会遇到内核恐慌:

md: Waiting for all devices to be available before autodetect
md: If you don't use raid, use raid=noautodetect
md: Autodetecting RAID arrays.
md: autorun ...
md: ... autorun DONE.
VFS: Cannot open root device "(null)" or unknown-block(0,0): error -6
Please append a correct "root=" boot option; here are the available partitions:
Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0)

(是的,没有列出分区。ESP 应该是 /dev/sda2,/在 /dev/sda5 上)

系统使用 GRUB 启动正常(由另一个分区上的另一个 Ubuntu 实例安装)。令人惊讶的是,它也能从 EFI shell 正常启动!

Shell> fs1:\path\vmlinuz.efi root=/dev/sda5 rw initrd=\path\initrd.img

以下是创建失败条目的 efibootmgr 命令:

efibootmgr -p 2 -c -g -L "Ubuntu Rescue" -l \\EFI\\ubuntu-rescue\\vmlinuz.efi -u "root=/dev/sda5 rw initrd=\\EFI\\ubuntu-rescue\\initrd.img"

我错过了什么?

更新:我创建了一个带有虚拟 ESP 的 VirtualBox VM,并将物理分区附加到它。然后我按照在实际 ESP 上设置的方式设置了 ESP。

使用 efibootmgr 配置启动项后,Ubuntu 从 UEFI 启动菜单成功启动。因此,问题似乎与系统有关。

内核是否可能缺少我的笔记本电脑存储控制器的驱动程序?这是基于英特尔第五代平台的戴尔 Latitude E5450 笔记本电脑。

更新 2:我已经在该分区上安装了常规 Ubuntu Server(使用 VM)以排除与 debootstrap 相关的问题。问题仍然存在。系统在 VM 中仍可完全启动,但不能直接从裸机 UEFI 启动(但可以从 EFI shell 启动)。

答案1

我了解到这是戴尔 UEFI 的一个常见问题 - 它们似乎没有将参数传递给 EFI 加载程序。因此 UEFI 使用其 EFI 存根启动内核,但缺少 initrd 并且无法启动。

我目前手头没有任何资料,但这似乎是一个常见的问题,感兴趣的人可以谷歌搜索。

解决方法包括:

  • 使用 EFI shell 脚本,该脚本将在 shell 启动时自动运行。(还有一个超时,因此如果需要 shell 仍然可用)
  • 使用 systemd-boot,这是一个 EFI 感知的引导加载程序,可以使用其 EFI 存根引导内核。Pop_OS 将其与内核存根在其默认配置中,完全消除了对 GRUB2 的需要。
  • 可能可以将参数甚至整个 initrd 嵌入到内核映像中,但这听起来很麻烦。

相关内容