如何使用安装程序手动引导到未安装 GRUB 的系统?

det*_*tly 3 bootloader system-installation 14.04

对于实验的缘故,我想记录一个最小的程序在一台Mac Mini的14.04纯EFI启动。

这涉及将基本系统(使用 Mac 风格的服务器安装 ISO)安装到硬盘驱动器,但将 GRUB 安装到 MBR。GRUB安装到硬盘的第一个分区,但直到我手动设置EFI引导分区,系统将无法启动。

有没有办法使用 USB 安装程序上的引导加载程序手动引导到已安装的系统?我可以访问安装程序上的“高级选项”(即引导加载程序命令行),但我不知道它是什么引导加载程序,因此我找不到它的完整文档。

det*_*tly 7

不要使用 Mac 特定的安装程序。使用普通(服务器、桌面)安装程序,使用所有默认设置(避免 LVM 除外)安装系统,然后重新启动。

再次启动 USB 安装程序,但是当您看到 GRUB 菜单时,按C以调出 GRUB 控制台。

查找安装的驱动器

在 GRUB 控制台,执行

grub> ls
(memdisk) (hd0) (hd0,msdos) (hd1) (hd2) (hd2,gpt3) (hd2,gpt2) (hd2,gpt1)
Run Code Online (Sandbox Code Playgroud)

您可能不会得到与此完全相同的结果,但您有一些选择。您要查找新安装,而不是安装程序/实时系统。我建议找到一个包含新用户主目录的分区:

grub> ls (hd2,gpt2)/home
jason/
Run Code Online (Sandbox Code Playgroud)

继续尝试这种模式,直到找到为止。

查找安装的引导分区

如果你知道你把所有东西都安装到了一个分区,那么你就完成了——只需使用最后一步的结果,(hdX,gptY). 如果您没有,或者您不确定,请保留该hdX部分,但通过所有gptY选项查找/boot/grub目录:

grub> ls (hd2,gpt1)/boot/grub
error: file `/boot/grub' not found.
Run Code Online (Sandbox Code Playgroud)

不,不是那个。

grub> ls (hd2,gpt2)/boot/grub
unicode.pf2 [...] grub.cfg
Run Code Online (Sandbox Code Playgroud)

找到了!

现在您想将其设置为您的根以执行进一步的命令:

grub> set root=(hd2,gpt2)
Run Code Online (Sandbox Code Playgroud)

找出引导命令

我发现正确启动的唯一方法是使用驱动器的 UUID(即没有快捷方式/dev/sdaX!) - 所以让我们明白:

grub> ls -l (hd2,gpt2)
        Partition hd2,gpt2: Filesystem type ext* [...snip...] UUID e86c20b9-83e1-447d-a3be-d1ddaad6c4c6 - Partition start at [...]
Run Code Online (Sandbox Code Playgroud)

注意 UUID 字符串!你的会不一样。现在告诉 GRUB Linux 在哪里:

grub> linux /boot/vmlinuz[...tab here!...].efi.signed root=UUID=<the UUID from above>
Run Code Online (Sandbox Code Playgroud)

GRUB的控制台可以做tab完成,所以如果你只是打出来的vmlinuz部分,命中tab,然后打.tab再次...你将不必键入出整个文件名。但一定要确保.efi.signed位在那里!是的,您必须输入整个 UUID。

现在设置initrd(初始 RAM 磁盘):

grub> initrd /boot/initrd[...tab here!...]
Run Code Online (Sandbox Code Playgroud)

开机

类型:

grub> boot
Run Code Online (Sandbox Code Playgroud)

您应该会发现自己已启动到您的安装中!


我不是 GRUB 向导,所以我欢迎任何关于如何减少它的提示。尤其是 UUID 部分,这有点令人发指。