我最近使用 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 嵌入到内核映像中,但这听起来很麻烦。