我安装了 TinyCore 作为我的维护操作系统。我给了那个 GRUB2。但是 TinyCore 安装说明告诉您使用 MBR 方法添加 GRUB2。(它可以工作,但这只是因为 EFI 向后兼容 MBR。)理想情况下,我想将它链接起来,以便 EFI 引导存根引导到 TinyCore 的 /boot/grub,这样我就可以从 TinyCore 的 GRUB2 引导我的任何其他操作系统想。或者第二个选择,我想将它链接起来,以便 EFI 引导存根向量到 TinyCore 的 vmlinuz。
TinyCore 没有 efibootmgr。当我从 Ubuntu USB 记忆棒启动时,efibootmgr 给了我“系统不支持 efivars”。
有没有办法只获取 TinyCore 的 grub 目录,将其带到其他 Linux 机器上并从中创建一个 grub.efi,然后我可以将其带回这台机器并复制到这台机器上的 ESP 中?
发生这种情况是因为您使用旧版 BIOS 样式从 USB 记忆棒启动,因此 UEFI 的兼容性支持模块将禁用用于访问启动变量的 UEFI 运行时接口。如果您可以在本机 UEFI 模式下启动 U 盘,则
efibootmgr
可以。如果固件启动设置包括选择首先尝试 UEFI 还是传统启动方法,请尝试在从记忆棒启动时将其切换到“UEFI 优先”模式。使用旧版 MBR GRUB2,您只能引导可使用旧版 MBR 样式引导的操作系统。为了链接到已安装以使用本机 UEFI 引导的操作系统,您需要 GRUB2 的 UEFI 版本。
将 UEFI GRUB 从一个发行版移植到另一个发行版的问题在于,不同的发行版以稍微不同的方式设置它:例如,Debian 过去使用
grub.efi
嵌入式指令将一个非常小的 ESP 植入到 ESP 中,以从另一个发行版读取更多的 GRUB 模块和配置文件在 GRUB 安装时指定的文件系统(通常是包含/boot
目录的文件系统)。这种方法的问题在于,如果启用 Secure Boot,这将变得不可能:加载的所有可执行代码都必须进行签名,并且由于 GRUB 模块没有使用与标准 UEFI 二进制文件相同的二进制文件格式,因此无法以会UEFI 固件可被识别。
另一方面,RedHat 派生的发行版倾向于将所有必要的 GRUB 模块嵌入到主
grubx64.efi
二进制文件中,然后可以通过 Secure Boot 在一次操作中成功加载shim.efi
。GRUB 配置文件也放置在 ESP 文件系统中,通常反映主 UEFI GRUB 二进制文件的命名,即如果二进制文件重命名为foo.efi
,它将foo.cfg
在同一目录中查找。知道了这一点,您只需确保禁用安全启动,
grub.efi
从 RedHat/CentOS/Fedora 安装介质中获取二进制文件,手动将其写入最小配置文件,将它们放入您的 ESP(可能是\EFI\boot\bootx64.efi
and\EFI\boot\bootx64.cfg
,因此 UEFI 应该选择它们无需 UEFI 变量)并启动一次。然后你可以看看TinyCore原生的GRUB配置生成器生成的GRUB配置文件是否兼容那个版本的GRUB,或者把简化的配置文件替换成真实的,或者用TinyCore的首选UEFI GRUB版本替换移植版的GRUB .如果你想
vmlinuz
直接从 UEFI 固件启动 TinyCore,内核需要用 编译CONFIG_EFI_STUB=y
,然后你需要弄清楚如何处理启动参数和 initramfs 文件。通过将引导选项配置到 UEFI 引导变量中,我进行了一次这样的设置。如果没有引导加载程序,您可能无法在引导时更改引导参数,因此您最好提前生成几个具有不同引导参数的 UEFI 引导变量设置,这样您就可以访问例如,如果内核更新出现问题,系统会出现问题。(如果您的固件级 UEFI 引导选项包括引导到 UEFI Shell 的方法,那么它在设置“无引导加载程序”的 UEFI 可引导安装时非常有用。)
UEFI 引导变量中使用的 UUID 可以通过运行该
blkid
命令来发现。GRUB 使用文件系统 UUID(=UUID=
字段),而 UEFI 引导变量使用分区的唯一 UUID(=PARTUUID=
字段)。这就是我的做法。首先,我将我的 PC EFI 选项设置为仅 EFI 引导。然后我从 DVD 启动 Ubuntu 16.04.4。(显然这是 UEFI 引导。)。在 Ubuntu 16.04.4 中,我执行了以下操作。
在 /path/to/mounted/esp/partition/EFI/prime_boot/ 中设置以下 grub.cfg 文件
menuentry "GRUB 链式加载器" { 链式加载器 (hd0,gpt2)/boot/efi/core.efi }
将目录 /usr/lib/grub/x86_64-efi 复制到 /path/to/mounted/esp/partition/EFI/prime_boot/。
是的,您必须在“efibootmgr”命令中转义“\”。现在您已经使用此主加载程序将 EFI 引导到 TinyCore 分区中的引导加载程序。所以现在你设置了 TinyCore 分区的引导加载程序。
我知道有人会想为什么我从主引导加载程序跳转到多引导加载程序。我只想在我的 esp 分区中做尽可能少的事情。我希望 TinyCore(我的维护操作系统)成为多引导引导管理器的所有者。