目标:我正在尝试将 Ubuntu 安装到戴尔 XPS 8900。
问题Unable to install Grub in /dev/sda
:如果安装不被 , 中断,我就无法完成 Ubuntu 安装Executing 'grub-install /dev/sda failed.' This is a fatal error.
。而且并boot-repair
不能解决问题。
安装人员:我使用的是带有 Ubuntu 22.04 LTS 安装程序的闪存驱动器。我尝试过使用之前安装过的闪存驱动器,并尝试在使用启动磁盘创建器应用程序创建的另一个闪存驱动器上进行全新安装。注意:我在 grub 命令中添加了 nomodeset 和 acpi=off 来启动 Ubuntu 安装程序操作系统。
尝试解决:
我尝试自己使用一些方法来完成 grub 安装答案在阿斯库本图。我做了前面提到的使固定通过退出安装程序提示符(失败后)并在终端中运行命令。我在这里成功完成了 grub 安装。然而,由于最初的错误发生在安装过程中,因此 Ubuntu 操作系统出现了多个问题。我的服务会失败或无法启动(包括但不限于:networkd-dispatcher.service、NetworkManager.service、fwupd-refresh.service、apparmor.service、caspermd5.services(?)),并且我留下了剩余的内容从安装(例如,名为 Install RELEASE 的应用程序仍在我的应用程序中)。
- 注意:
chroot
ing into/mnt
并运行grub-install /dev/sda
结果为unable to allocate pty: No such device
- 注意:
[这里的最佳答案](https://askubuntu.com/questions/143678/i-receive-the-error-grub-install-dev-sda-failed-while-attempting-to-install-u)建议单击尝试 Ubuntu,然后使用安装 Ubuntu 24.04 LTS 应用程序,但这对我不起作用。
[这里的最佳答案](https://askubuntu.com/questions/459620/unable-to-install-grub-in-dev-sda-when-installing-grub)表明 grub-install 安装到了错误的设备,这对我来说不是这样。
我现在很绝望,所以我将 BIOS 更新到了最新的更新。那没有做任何事情。
我尝试在运行尝试安装应用程序之前运行 grub-install。
- 注:运行
sudo grub-install --root-directory /mnt /dev/sda
结果为grub-instal: error: failed to register the EFI boot entry: Operation not permitted.
- 另外,我担心即使我可以在运行 Ubuntu 安装程序之前成功运行 grub-install,Ubuntu 安装程序仍然会失败,因为 Ubuntu 安装程序可能会在没有选项的情况下运行 grub-install。
- 注:运行
boot-repair
说NVram被锁定了。我看见清除 NVRAM 的建议经过重置 CMOS。重置 CMOS 后,我在安装过程中仍然收到相同的错误消息。
问题:为什么 Ubuntu 22.04 LTS 安装继续失败并出现“grub-install /dev/sda failed”错误?
的结果boot-info
:
的结果boot-repair
:
答案1
我偶然发现了同样的问题 - 无法安装 20.04LTS 和 22.04LTS。
我最终解决了这个问题:在 Ubuntu 安装程序失败后,重新启动到 USB live Ubuntu 并重新运行启动修复。效果非常好。
更具体地说:
我有 2 个 Nvidia 3090 显卡。
在 GRUB 菜单中选择“安装 Ubuntu”后,出现黑屏。所以我必须
e
按 GRUB 菜单添加acpi=off
(nomodeset
或者选择“安全图形”对我来说没有帮助)才能进入 USB live Ubuntu 进行安装。然后我遇到了这个“无法将 GRUB 安装到 NVMe”,并运行引导修复结果为“NVRAM 已锁定”。
我假设在之前的安装过程中,我的 SSD 以某种方式添加了锁,因此启动修复无法进行任何更改,而是我得到“NVRAM 已锁定”。如果你跑
cd /target
,你就会直接进入其中。重新启动后,运行
cd /target
,您将收到一条not a directory
错误消息。然后运行启动修复。问题解决了。
我还尝试按照 AskUbuntu 帖子手动安装 GRUB。但我的母语不是英语,所以我想我搞砸了哪个是哪个,我应该安装哪个驱动器。无法真正弄清楚“设备/硬件/驱动器”这个词是指 USB 记忆棒还是 SSD。
答案2
NVram Locked
听起来写入 UEFI NVRAM 变量可能存在一些问题,这些变量可以在 Linux 中通过/sys/firmware/efivars
或使用该efibootmgr
工具进行访问。
/mnt/chrootdir
如果您按照问题答案中的建议通过将其安装在下面并chroot
插入来访问失败的安装询问您链接的 Ubuntu 问题,我建议使用mount --rbind
而不是mount --bind
同时使用/dev
和/sys
,因为两者都包含单独的子文件系统,这对于grub-install
功能来说可能很重要:
- 如果
/dev/pts
在 chroot 环境中不可用,则会导致unable to allocate pty: No such device
错误 - 如果
/sys/firmware/efi/efivars
在 chroot 环境中不可用,则会导致尝试写入 UEFI NVRAM 变量失败...这正是您的主要问题。
但如果这没有帮助,你可能想阅读Roderick W. Smith 的这个优秀网页,它解释了其他操作系统或有缺陷的 UEFI 固件实现可能导致的某些问题,并提供了解决这些问题的方法。
在您的sda1
磁盘上,显然有一个efi/ubuntu/grub.cfg
文件,其内容如下:
search.fs_uuid 2D07-0F0A root hd0,gpt1
set prefix=($root)'/boot/grub'
configfile $prefix/grub.cfg
这似乎不正确:它通过文件系统 UUID 查找 ESP 分区 ( sda1
),然后假设它应该是包含/boot/grub
...的 Linux 根文件系统,但事实并非如此,sda1
UEFI ESP 也是如此,而不是 Linux 根文件系统。
该文件应包含以下内容:
search.fs_uuid 25f0e88-f20a-4350-9df0-ee8c57ecc455 root hd0,gpt2
set prefix=($root)'/boot/grub'
configfile $prefix/grub.cfg
您可能也想将其复制efi/ubuntu/grub.cfg
到efi/BOOT/grub.cfg
(也在sda1
),以允许 GRUB 找到有效的配置,即使以efi/BOOT/BOOTx64.efi
.
此配置文件将导致grubx64.efi
ESP 通过文件系统 UUID 查找真正的 Ubuntu 根分区 ( sda2
),然后从那里加载任何必要的 GRUB 模块,并从/boot/grub/grub.cfg
ESP 上加载真正的 GRUB 配置sda2
。
您可能还需要复制efi/ubuntu/grubx64.efi
到efi/BOOT/grubx64.efi
on sda1
,以确保 UEFI 后备/可移动媒体启动路径上也提供完整的启动文件集。
这部分引导修复输出实际上是由以下内容产生的efibootmgr -v
:
BootCurrent: 0003
Timeout: 1 seconds
BootOrder: 0003,0004
Boot0003* UEFI: TOSHIBA TransMemory 1.00 PciRoot(0x0)/Pci(0x14,0x0)/USB(1,0)/HD(2,GPT,9240a165-d190-4ab6-8a12-46dc207b42ee,0x71e8a0,0x2130)..BO
Boot0004* UEFI: ST2000DM001-1ER164 HD(1,GPT,22c1dbaf-a26e-4408-a6f9-d1fc06b0d615,0x800,0x100000)/File(EFI\boot\bootx64.efi)..BO
它表示虽然您当前已从 USB 启动,但您的系统固件已准备好从(使用文件回退/可移动媒体启动路径sda1
由 PARTUUID 标识)启动(ESP 上的文件系统为,因此它2c1dbaf-a26e-4408-a6f9-d1fc06b0d615
EFI/boot/bootx64.efi
vfat
应该不区分大小写...但某些 UEFI 固件实现不区分大小写)。因此,如果您可以对 ESP 执行上述更改,系统可能能够从sda1
.
如果您可以让常规 Ubuntu 系统在 UEFI 模式下运行,您可以重试sudo grub-install /dev/sda
重写引导加载程序并自动重写 Ubuntu 的 NVRAM 引导变量。或者,您可以使用以下efibootmgr
命令尝试自行精确修复引导变量问题:
sudo efibootmgr -c -d /dev/sda -p 1 -l \\EFI\\ubuntu\\grubx64.efi -L Ubuntu
(此命令要求 被/dev/sda1
挂载为/boot/efi
且efivarfs
文件系统被挂载于/sys/firmware/efi/efivars
。这两个条件都应该由正常的 Ubuntu 引导过程自动处理。)
如果仍然因“NVram Locked”或类似情况而失败,则您的 UEFI 实现可能有错误,但至少它允许您使用后备/可移动媒体路径启动到 Ubuntu。