![Efibootmgr 报告 NVRAM 已满 - 如何添加新的 ESP?](https://linux22.com/image/195497/Efibootmgr%20%E6%8A%A5%E5%91%8A%20NVRAM%20%E5%B7%B2%E6%BB%A1%20-%20%E5%A6%82%E4%BD%95%E6%B7%BB%E5%8A%A0%E6%96%B0%E7%9A%84%20ESP%EF%BC%9F.png)
我相信我知道问题是什么,并且我知道还有一件事我可以尝试解决它,尽管我知道这可能很危险,所以我应该先在这里询问。我之前曾多次亲自安装过Linux,并将其作为我的主要操作系统运行,但我从未遇到过这样的问题。
问题
我正在帮助一位朋友在一台旧笔记本电脑上安装 Manjaro(与 Windows 7 一起作为双启动设置)(我相信它是一台三星笔记本 NP-R580H)。不过,这个问题并不是 Manjaro 独有的(我们也检查了普通的 Arch Linux,我认为这个问题适用于我们将尝试安装的任何操作系统)。
在我们第一次尝试时一切都很顺利,直到尝试安装 GRUB 时失败了。 GRUB 抱怨 ESP 看起来不像 EFI 分区,并说:/boot/efi doesn't look like an efi partition
。
这只是一个小问题,因为将 ESP 从 NTFS 格式化为 vFAT 后,GRUB 将其识别为有效的 ESP。我们在格式化 ESP 之前备份了 ESP 的内容(因此我们拥有原始的 Windows 7 EFI 文件),尽管我没有注意到 UUID(因为当时它看起来完全没有意义)。
不幸的是,GRUB 返回了一个新错误,这将我们带到了今天:Failed to create EFI Boot variable entry: No space left on device
。经过大量研究后,我发现 NVRAM 报告已满,因此 efibootmgr 无法创建新的启动项。
我假设我们能够使用 列出启动项efibootmgr -v
,但它抱怨说No BootOrder is set; firmware will attempt recovery
。经过更多研究后,似乎这些启动条目只有在可启动文件位于已知位置时才可见 - 当然有不是,因为 ESP 被重新格式化(这是根据https://wiki.archlinux.org/title/GRUB#Default/fallback_boot_path)。在这个发现之后,我们尝试直接使用 efibootmgr 添加 UEFI 启动项,但出现了同样的错误。
可能性
此时,如果我们无法正确读取 NVRAM,我可以想到 1 个选项:使用内核参数efi_no_storage_paranoia
,如建议的https://askubuntu.com/a/1073318,尽管我对此感到担心。如果笔记本电脑完全变砖怎么办?
在撰写本文的过程中,我发现该bcfg
工具可以提供帮助(https://wiki.archlinux.org/title/Unified_Extensible_Firmware_Interface#bcfg),尽管在做其他事情之前我会等待那些比我更有经验的人的意见。
此时我只是在寻找恢复原始ESP的方法。我想如果我可以从 NVRAM 读取旧值,我就会知道重新创建 ESP 所需的 UUID,尽管我还无法获取这些值。
如果需要更多信息,我会尽力提供。