在安装 grub 时,"--no-nvram" 是什么作用?

我过去一周一直在尝试将grub安装到efi分区,但一直遇到以下问题:
Could not prepare Boot variable: No space left on device
grub-install: error: efibootmgr failed to register the boot entry: Input/output error.

但是我发现使用--no-vram时,安装grub没有出现错误。我是一个Linux新手,想知道是什么导致了这个错误。

2个回答

使用BIOS,主板会将物理设备的启动顺序存储在非易失性存储器(NVRAM)中,以便在重新启动时保留。这确保当您打开计算机时,主板仍按照您(或工厂)配置的顺序引导设备。然后,BIOS将尝试执行每个设备的第一个逻辑块地址(LBA)中的MBR,直到其中一个正常工作。如果您在启动过程中手动选择要引导的设备,它将按您的要求尝试从该设备的第一个LBA引导。

假设一个磁盘使用GPT格式化,当主板使用UEFI引导时,MBR不需要包含引导加载程序(或其他任何内容)。相反,磁盘中包含一个EFI系统分区(ESP),它实质上是一个包含引导加载程序代码的FAT格式化分区中的文件。FAT文件系统还可以包含引导加载程序所需的其他文件(例如,在引导过程中使用的闪屏的标志和背景)。
对于在UEFI主板上进行UEFI引导,假设磁盘是系统的一部分,因此当您执行grub-install时,安装过程的一部分应该是将一个条目放入主板的NVRAM中,该条目包含ESP中引导加载程序的路径(请参阅UEFI规范3.5.1通过简单文件协议引导部分)。然后可以将此条目设置为默认值,或者仅作为选项呈现。有关EFI引导加载程序的更多信息,我强烈建议阅读Rod Smith的Managing EFI Boot Loaders for Linux
对于一个通常不连接到主板上的设备(例如USB硬盘),将此条目存储在主板的NVRAM中是没有意义的,因为在大多数启动过程中该设备可能不存在。我相信--no-nvram选项告诉grub-installer不要为此目的修改主板的NVRAM。
此外,如果主板被指示从一个没有在其NVRAM中具有引导条目的可移动设备启动,UEFI定义了一个默认路径供其尝试引导(请参阅UEFI规范的第3.5.1.1节“可移动介质引导行为”)。相对于ESP根目录的路径为\EFI\BOOT\BOOT{architecture}.EFI,其中{architecture}如下所示:
  • 32位 → IA32
  • x64 → x64
  • Itanium架构 → IA64
  • AArch32架构 → ARM
  • AArch64架构 → AA64
我相信--removable选项告诉grub-installer使用这个路径,而不是它的首选路径。如果不修改主板的NVRAM,否则在手动选择可移动设备后,就需要手动指定引导加载程序。
注意:上面我说“相信”,因为我还没有测试过。
编辑:
我意识到这些都没有解释为什么您的主板不允许GRUB修改其条目。但希望这能解释为什么这个开关有帮助。您提供的错误消息表明所有主板的启动条目都已填充,并且合理地说,grub-install不能决定要覆盖哪个启动条目。您可以尝试使用efibootmgr显示您的启动条目,并删除一些不需要的条目。Rod Smith's answer to this question应该会向您展示如何操作。

我费尽心思地寻找一个真正好的解释。到目前为止,我能找到的最好的解释是通过man grub-install命令来解释:
   --no-nvram
          don't update the `boot-device'/`Boot*' NVRAM variables. This option is only
          available on EFI and IEEE1275 targets.
"非易失性RAM(NVRAM)变量"的定义在谷歌搜索中的第一个结果是奇怪的维基解密,因为CIA用来进行间谍活动。
NVRAM是一种用于EFI中存储需要在启动之间保留的变量的非易失性RAM。其中许多NVRAM变量在架构上有定义,并且将无效选项设置为NVRAM可能导致机器无法启动。
在启动过程中,多个驱动程序和应用程序可以依赖NVRAM值来帮助完成它们的工作。下面是来自UEFI 2.56规范的图表,展示了这个过程的发生。

1请不要在回答中涉及政治。 - Thomas Ward