首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何创建任意UEFI引导存根?

如何创建任意UEFI引导存根?
EN

Unix & Linux用户
提问于 2018-03-22 07:27:22
回答 2查看 2.2K关注 0票数 2

我安装了TinyCore作为我的维护操作系统。我给了那个GRUB2。但是TinyCore安装说明告诉您使用MBR方法添加GRUB2。(这是可行的,但这只是因为EFI向后兼容MBR。)理想情况下,我希望将其链接起来,以便EFI引导存根向量转移到TinyCore的/ boot /grub,这样我就可以从TinyCore的GRUB2启动我想要的任何其他操作系统。或者第二种选择,我想把它链接起来,以便EFI引导存根向量到TinyCore的vmlinuz。

TinyCore没有efibootmgr。efibootmgr是给我“系统不支持efivars”,当我从Ubuntu USB棒启动。

有没有一种方法只需抓取TinyCore的grub目录,将其带到其他Linux机器上,并让它创建一个grub.efi,然后我就可以将它带回到这台机器,并在这台机器上复制到我的ESP?

EN

回答 2

Unix & Linux用户

回答已采纳

发布于 2018-04-07 16:42:37

我就是这么做的。首先,我把我的个人电脑EFI选项设置为EFI仅引导。然后我从DVD上启动了Ubuntu16.04.4。(显然是UEFI启动。)在Ubuntu16.04.4中,我做了以下工作。

  1. 安装了我的ESP分区。(它是磁盘1的第1分区)
  2. mkdir /path/to/装入/esp/分区/EFI/prime_boot
  3. 安装grub-efi-apt 64 with: sudo apt-get Install grub-efi-apt 64
  4. 格式=x86_64-EFI‘-前缀=(hd0,gpt1)/EFI/prime_boot’ext2 part_gpt
  5. 在/path/to/mounted/esp/partition/EFI/prime_boot/菜单条目“”中设置以下grub.cfg文件{ chainloader (hd0,gpt2)/boot/efi/core.efi }
  6. 将dir /usr/lib/grub/x86_64-efi复制到/path/to/mounted/esp/partition/EFI/prime_boot/.
  7. -c -d /dev/sda -p 1 -l \EFI\prime_boot\bootx64.efi -L“主装载机”
  8. 设置EFI菜单中的引导顺序以使用“主加载器”

是的,您必须在'efibootmgr‘命令中转义'\’。现在,您可以让EFI使用这个主加载程序向TinyCore分区中的引导加载程序发送。现在,您设置了TinyCore分区的引导加载程序。

  1. 挂载TinyCore分区。(我的是磁盘1分区2)
  2. 格式=x86_64-efi‘-前缀=(hd0,gpt2)/hd0/efi’ext2 part_gpt
  3. 现在在/path/to/ grub.cfg /tinycore/分区/boot/efi/中创建多引导

我知道有人会想为什么我会从主引导加载程序跳到多引导加载程序。我只想在我的esp分区中尽量少做。我希望TinyCore (我的维护操作系统)成为多引导管理器的所有者。

票数 0
EN

Unix & Linux用户

发布于 2018-03-22 09:42:49

efibootmgr是给我“系统不支持efivars”,当我从Ubuntu USB棒启动。

这是因为您使用遗留的BIOS样式从USB棒启动,因此UEFI的兼容性支持模块将禁用用于访问启动变量的UEFI运行时接口。如果您可以在本机UEFI模式下引导USB卡,那么efibootmgr将工作。如果固件引导设置包括一个选择,无论是UEFI还是旧的引导方法,尝试将其切换到"UEFI“模式,同时从棒引导。

使用遗留MBR GRUB2,您只能用遗留MBR样式引导可引导的操作系统。为了链接到已安装使用本机UEFI引导的操作系统,您将需要一个UEFI版本的GRUB2。

将UEFI从一个发行版移植到另一个发行版的问题是,不同的发行版以稍微不同的方式设置它:例如,Debian习惯于将一个非常小的grub.efi安装到ESP,并使用嵌入式指令从GRUB安装时指定的另一个文件系统(通常是包含/boot目录的文件系统)读取进一步的GRUB模块和配置文件。

这种方法的问题是,如果启用了安全启动,就不可能做到这一点:所有加载的可执行代码都必须进行签名,而且由于GRUB模块没有使用与标准UEFI二进制文件格式相同的二进制文件格式,因此它们不能以一种可以为UEFI固件识别的方式进行签名。

另一方面,RedHat派生的发行版倾向于将所有必要的GRUB模块嵌入到主grubx64.efi二进制文件中,然后安全引导shim.efi可以在一个操作中成功地加载这些模块。GRUB配置文件也放置在ESP文件系统中,通常反映主UEFI二进制文件的命名,也就是说,如果将二进制文件重命名为foo.efi,它将在同一个目录中查找foo.cfg

知道了这一点,您就可以确保安全引导被禁用,从RedHat/CentOS/Fedora安装媒体获取grub.efi二进制文件,手动编写一个最小配置文件,将它们放入您的ESP中(可能是\EFI\boot\bootx64.efi\EFI\boot\bootx64.cfg,因此UEFI应该在不需要UEFI变量的情况下自动拾取它们)并启动一次。然后,您可以看到TinyCore的原生GRUB配置生成器生成的GRUB配置文件是否与该版本的GRUB兼容,或者用实际的GRUB替换简化的配置文件,或者用TinyCore的首选版本UEFI替换移植的GRUB。

如果您想直接从UEFI固件启动TinyCore的vmlinuz,则需要使用CONFIG_EFI_STUB=y编译内核,然后您需要弄清楚如何处理引导参数和initramfs文件。通过将引导选项配置为UEFI引导变量,我做了一次这样的设置。如果没有引导加载程序,您可能无法在启动时更改引导参数,所以最好提前生成几个UEFI引导变量设置,使用不同的引导参数,这样就可以在内核更新出现问题时访问系统。

(如果您的固件级UEFI引导选项包括一种引导到UEFI的方法,那么它在设置“引导无加载”UEFI可引导安装时非常有用。)

可以通过运行blkid命令来发现UEFI引导变量中使用的UUID。GRUB使用文件系统UUID (= UUID=字段),而UEFI引导变量使用分区的唯一UUID (= PARTUUID=字段)。

票数 3
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/432747

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档