为什么大多数发行版都将UEFI和grub链接在一起?


31

大多数发行版在UEFI系统上安装了额外的引导加载程序。UEFI本身是一个引导程序,它提供菜单来选择不同的操作系统或单个内核。此外,UEFI设置可以使用诸如的用户空间工具轻松更改efibootmgr

从3.3开始,内核支持EFI_STUB,这意味着可以直接从UEFI加载内核。发行版本决定使用其他引导加载程序的原因是什么?关于Linux / UEFI的大多数教程主要关注如何设置附加的引导加载程序(rEFInd,grub2,ELILO等),而不是使用EFI_STUB引导Linux。

发行版中唯一缺少的是支持。由于大多数发行版都链接了第二个引导加载程序,因此不会将内核添加到UEFI引导菜单,也不会将其复制到EFI系统分区。

三个脚本足以完成所有任务。将initramfs复制到ESP的一种。第二个将内核复制到ESP,并在UEFI引导菜单中创建一个新条目。第三个脚本从ESP中删除了旧内核和initramfs,并删除了UEFI引导菜单项。这允许完全自动化的内核/ initramfs更新/清除,而无需用户交互。我使用这种方法已经有一年多了,而且效果一直很好。

为什么大多数发行版都使用grub而不是EFI_STUB?

链接:

编辑:我并不是在说完全删除grub支持,而是为出于各种原因想要使用它的人提供选择。发行版可以为grub-efi想要链接UEFI和grub的用户提供一个程序包,以及一个efistub-boot包含我上面提到的脚本的程序包。


4
他们为什么要这样?他们已经建立了处理/生成grub配置文件的方法。此外,如果所有系统(非UEFI和UEFI)的行为相同,则也有帮助。
Ulrich Dangel 2013年

听起来不错。但是由于根据该链接,您可以根据需要进行操作,因此发行人可能会为自动为您做这件事。Betcha一些将最终给您选择。
goldilocks

1
@Bakuriu例如,一个更易于理解的系统,一个更简单的启动顺序,更少的执行代码和稍微更快的启动时间。
Marco Marco

4
由于给出的保留原因是错误的,因此应该搁置该问题。这个问题确实有一个简单的无可争辩的答案:UEFI不提供启动菜单。一些实现。有些人没有,因为为了达到Windows 8的目标启动时间,BIOS 甚至没有初始化输入设备。更不用说等待用户是否按下按键了。因此,您必须通过Windows才能进入Linux,反之亦然。前者可以在某些系统上运行,但是我怀疑规范是否可以保证。后者不起作用(您可以从GRUB输入UEFI设置,但不能从Linux输入)。
sourcejedi

1
@sourcejedi您声明与您的来源不匹配。UEFI确实提供了启动菜单(尽管各供应商的UI不一致)。mjg59意味着您无法在没有哲学妥协的情况下进入启动菜单(接受W8 EULA)。但是对于使用非EFISTUB grub引导加载程序的安装程序,此问题将相同。因此,它也无法回答为什么我们也更喜欢grub而不是EFISTUB。
Lingzhu Xiang

Answers:


10

鉴于UEFI只是在2005年定义的,所以有很多不支持该规范的旧设备。要将UEFI添加到标准发行版中,将需要测试两个代码路径而不是一个,并且众所周知,引导代码不仅挑剔,而且是测试代码中最耗时的代码之一。


5
测试不仅费时费力,而且是最容易出错的代码。考虑:您希望在系统正常启动和正常运行时,还是无法启动系统时出现某种问题?引导加载程序绝对是我最感动的软件之一,除非有必要,否则不要触摸它。
CVn

@MichaelKjörling的上述评论应该在答案中。切换到新的引导加载程序非常冒险。发行人希望他们的用户拥有良好的体验,但不仅如此,他们还希望Everey潜在的新用户能够拥有无暇的首次体验。抱歉,我称发行为“发行版”,但与创作者一起感觉还不错。
约翰,

@Johan msw可以自由地将该点编辑为答案,我不介意。(仅靠海事组织一个人的回答是不够的。)东武金洛克也都涉及这个问题。
CVn

3

发行版的资源有限,除此之外可能没有任何其他原因。它可能相当简单和安全,但是无论它需要进行哪些维护工作,因为grub选项必须维护(如果仅适用于非UEFI系统)。

我确信每个人都有他们希望看到发行版采用的功能和选项的列表(大声笑,我会给你几页),毫无疑问,其中许多都是“坦率地说,完全没有麻烦。 ..”。但是,没有无数的工时来实施它们。当面对这样的决策时(“我们是否将功能投入到此功能中,还是其他功能?”),主要问题应该是:

  • 有必要吗?(这里的答案是否定的)。
  • 多少人将从中受益,多少?(IMO:几个,但不多)
  • 有没有一种合理的选择,用户无需我们做任何事情就能适应他/她的自我?(显然有。)

人们完全使用发行版的原因是因为每个人都受到资源限制(否则,只需雇用一个团队,为他们购买一些空间和设备,然后让他们按照自己的意愿为您做所有事情)。因此现实是发行版反映了用户的普遍需求。

就是说,我确实认为这将及时被采纳为一种选择,我对此问题表示赞同。


2

除grub之外,针对UEFI引导程序也将使质量控制和支持复杂化。发行版的目标是grub而不是UEFI规范,因为grub是免费软件,可入侵,更灵活且质量更高。您仍然可以通过遵循教程并在上挂载UEFI分区来获得纯UEFI引导/boot,因为如果这样做,维护工作就在您身上。


您的质量主张尚有争议,但我认为它的针对性与它无关。他们已经有成千上万行写得不好的shell脚本来处理它,那么为什么他们要20个好脚本呢?
mikeserv 2015年

1

真正的问题是人们不了解它是如何工作的。例如,在您的问题中,您提到三个脚本是必需的,而这里的大多数答案都是关于使其工作所需的全部/任何其他维护的,但是事实是您不需要这些脚本或任何其他工作。

您所需/boot要做的就是绑定挂载ESP或在希望保留内核的任何地方进行绑定,您只需在其中输入一行即可/etc/fstab。这样做,所有当前的内核更新脚本将继续正常工作。

我的`/ etc / fstab'看起来像:

LABEL=ESP /esp vfat defaults 0 2
#
#^ i like a separate mount point - not necessary though
#
/esp/EFI/arch_root /boot none bind,defaults 0 2
#
#^ i keep separate installations in separate directories
#

不过,这里有一个关于制造商特定设置的要点。UEFI 明确不能指定一个启动菜单界面。这是要争夺的机会,并且机器之间的不一致。这很烦人,但事实如此。

因此,而装载机grub实际只为让更多的工作,一个菜单应用程序-如rEFInd -均衡的差异,并简化了一切。


1
我不知道这怎么工作。请注意,内核和initramfs的文件名都包含版本。如果没有脚本,则在安装新脚本后将引导旧内核。或用不同的措辞:如何更改默认内核以指向新内核?(我的脚本用于efobootmgr更新引导顺序并更改默认内核)。
马可(Marco)

@Marco-好的默认引导路径是\EFI\BOOT\BOOTX64.efi,因此可以为此命名。UEFI不能(按规范)首先处理内核的参数 -因此,在这种情况下,initramfs /内核映像需要绑定在一起。但是我不知道您对版本命名的意思-我认为只有debians可以做到,而且我认为它毫无用处。内核的常规名称是vmlinuz。无论如何,正确的方法是使用引导管理器而不是加载器。使用一个找到您的内核并将其名称传递给EFI进行引导的EFI应用程序,就像rEFInd一样。
mikeserv

我使用Debian,内核的名称例如vmlinuz-4.2.0-1-amd64是我保持原样的名称,然后将efibootmgr其添加到引导列表中并使其默认。我看到命名内核BOOTX64.efi可能是一个解决方案。但是无论如何,我都需要有一个脚本才能做到这一点,此外,如果它们都被命名为相同的内核,那么就很难轻易地保留多个内核。
马可(Marco)2015年

@Marco-您不需要一个完整的单独脚本-您的软件包管理器-可能是apt-在安装内核以构建initramfs时仍将运行某些脚本。它可能已经执行了一百项操作来确定内核的名称,但是只需一行额外的行就可以将其重命名为您想要的名称。如果保留引导树,则可以轻松保留任意数量的内核。rEFInd通过使默认启动映像成为其搜索路径中最近修改的内核映像来进行处理。
mikeserv

修改由程序包管理器安装的库存脚本不是一个好主意。它们可能会被更新,从而抹去您的更改,在这种情况下,甚至可能导致系统无法启动。在内核/ initramfs安装之后,会存在用于用户脚本的目录,这些目录旨在完全用于此类目的。顺便说一句:您建议在评论中编辑脚本。但是,您在回答中指出“您不需要那些脚本或任何其他工作”,这是不正确的(至少对于Debian)。
马可(Marco)2015年

0

他们将UEFI和GRUB链接为一个临时实施解决方案。

随着UEFI支持和随之而来的问题(例如安全启动)得到解决,越来越多的发行版将直接使用它。同时,这仍然是很新的:Google趋势的采用率非常有限:http : //www.google.com/trends/explore? q=cannot+boot+uefi#q=uefi%2C%20%20efi% 2C %20%20bios&cmpt = q

其他人都提到了寻求纯UEFI解决方案和/或同时支持非UEFI和纯UEFI系统的潜在陷阱。UEFI内核可能在非UEFY系统上工作,但是内核更新工具需要更新GRUB菜单或UEFI引导菜单,或者两者都更新,等等。

确实涉及到如上所述的质量控制:重要的是,此代码的问题会产生很大的影响:当计算机无法引导新用户时,即潜在的Linux转换,将其丢弃为垃圾并返回“安全”状态。

但是正如我所说,随着技术的广泛采用,它将成为标准。


我希望不会-但这主要是因为我对UEFI的锁定模式和Microsoft的“承诺”存在严重担忧,以确保始终有一个供Linux使用的签名映像...
Shadur

0

要解决固件错误,需要额外的代码

如果不链接grub,则发行版将更多地依赖固件来正确引导。由于任何软件都会出现问题,因此固件也很容易出现此问题。现在,Linux发行版也必须编写解决这些固件错误的方法。

以现实生活中的案例为例。Asrock H81 pro BTC P1.80主板允许使用来创建启动菜单项efibootmgr。可以创建多个引导菜单项,并且可以使用更改引导顺序,efibootmgr --bootorder XXXX,YYYY,ZZZZ或者可以使用设置下一个临时引导选项efibootmgr --bootnext XXXX。这两个命令都返回输出,例如,它们使您知道引导顺序已更改或下次引导将运行BootNext: XXXX。但是,在重新引导时,顽固的固件只会忽略新请求的引导选项,并重新引导至先前的BootCurrent:值。永久启动顺序更改只能通过固件设置实用程序进行。非永久性更改根本不可用。


-2

我认为,如果仅由EFI进行引导,而我们删除了引导加载程序,则对于硬件供应商和操作系统制造商都将很困难。硬件供应商将有更多内核要测试,而对于制造操作系统的公司来说,这就像他们的内核是否由不同的固件加载一样。

此外,通过从EFI直接启动内核,安全启动在堆栈中的哪个位置合适?在当前情况下,一旦控制权交给OS引导加载程序,则引导加载程序将检查内核是否正确签名。如果我们直接从EFI加载内核,那么我认为它只会造成混乱,因为整个堆栈都会受到干扰。从我的理解来看只是一个意见。


真傻 引导加载程序检查密钥的原因是因为UEFI不会。连锁载入是多余的安全引导的签署内核,你只是检查固件中的关键-它的方式应该工作。
mikeserv
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.