我可以使用默认引导加载程序 ID“ ubuntu ”重新安装 grub
但是如果我使用像“ MyUbuntu ”这样的自定义名称,我将无法成功安装 grub。
在启动良好的 Ubuntu 18.04 上测试安装:
1:删除现有的grub:
rm -r /boot/efi/EFI/*
2:安装新的grub:
grub-install --target=x86_64-efi --bootloader-id=MyUbuntu /dev/sda
2:更新grub:
update-grub
系统现在启动到 Grub 控制台。EFI 在引导菜单中看到新的引导条目就好了。
刚刚进入高峰/boot/grub/grub.cfg
,它仍然说:
menuentry 'Ubuntu' --class ubuntu.....
在我作为引导加载程序遇到systemd-boot之后,我再也没有回头看 GRUB。 systemd-boot,在我看来,更稳定并且有更好的配置方式。我所说的“稳定”是指它不像 GRUB 那样脆弱。GRUB 很容易被破解。只需在您的盒子中添加一个新磁盘就会给您带来很大的麻烦(因为您可能无法更改相同的引导加载程序 ID 等)
systemd-boot的唯一缺点是缺乏安全启动支持,但这对我来说不是问题,而且您的内核必须位于 EFI 分区,而不是根分区,就像 GRUP 一样。
使用systemd-boot我重新获得了对引导过程的完全控制权......是的
它应该是默认的引导加载程序而不是 GRUB。
更新,如何做(Debian/Ubuntu):(
这是一个相当肤浅的指南,但我希望它能让你开始。其他来源:Ahrlinux..、freedesktop..和自述文件..)
1:首先将内核文件从你的根分区复制,例如
/boot/vmlinuz-4.9.0-8-amd64
和/boot/initrd.img-4.9.0-8-amd64
,到你的EFI分区。您可以将它们放在您选择的子文件夹中,如果您愿意,甚至可以放在根文件夹中。2:许多指南说您需要访问 EFI 变量,但我不确定这是否需要。但是要测试是否有,请运行
efivar --list
.缺少时安装:
apt install efivar
3:将systemd-boot loader 安装到 EFI 分区:(
bootctl --path=/mnt/efi install
使用您自己的安装 EFI 分区的路径)4:将文件编辑为
/mnt/efi/loader/loader.conf
:(还没有弄清楚如何使用文件中自动添加的UUID,所以我只是将其标记出来)
5:每个文件
/mnt/efi/loader/entries/*.conf
对应systemd-boot菜单中的boot-entry。因此,要添加您当前的操作系统,请创建一个类似于以下内容的文件:(修改您在步骤 1 中复制的内核文件的路径。将 UUID 修改为根分区的文件系统-UUID(使用 Linux 命令
lsblk -o name,uuid
)一般信息:
bootctl将在您的 EFI 分区中安装两个引导加载程序文件:
这些文件是相同的。主板上的 EFI BIOS 必须引导/指向其中之一。要么直接在 BIOS 中执行,要么使用 Linux 命令
efibootmgr....
要添加新的引导条目,只需创建一个
/mnt/efi/loader/entries/*.conf
指向正确内核文件和根分区的新文件。内核文件必须位于 EFI 分区 (FAT32)。
EFI 分区的大小必须相应调整。我认为例如 Debian/Ubuntu 的内核文件大约是 50-60MB。因此,如果您有两个安装,则需要 120MB。
我使用一个简单的解决方法。运行
grub-install
后--bootloader-id
,grub-install
不带任何参数运行。它将创建一个 ubuntu 条目。如果你想删除它,但现在你的 id 将“神奇地”工作。很烦人,好像是老bug了。希望我能帮上忙。正如gdeff 所提到的,要自定义安装 Grub
--bootloader-id
,也可以使用该选项--no-uefi-secure-boot
。例如:此外,请确保在您的系统上禁用 SecureBoot。
解释
grub-install
如果您想更好地理解、grubx64.efi
、grub.cfg
和 SecureBoot之间的交互,您只需阅读下面的说明(不幸的是,很长) 。.efi
由 Microsoft 加密签名的文件。/boot/efi/EFI/ubuntu/grubx64.efi
通常来自以下两个位置之一:grubx64.efi
是由 Canonical 提供的静态、不变、Microsoft 签名、与 SecureBoot 兼容的“二进制 blob”Grub 引导加载程序。这是默认选项。grubx64.efi
在您运行时在您的系统上创建grub-install
。在这种情况下,grubx64.efi
未签名,因此与 SecureBoot 不兼容。使用选项 1(规范提供,与 SecureBoot 兼容
grubx64.efi
):grub.cfg
文件。grub.cfg
在/boot/efi/EFI/ubuntu/grub.cfg
grub.cfg
在/boot/grub/grub.cfg
grub.cfg
文件包含grubx64.efi
查找和读取阶段 2grub.cfg
文件所需的信息。grub.cfg
第 1 阶段文件的路径/boot/efi/EFI/ubuntu/grub.cfg
无法更改。改变这条道路需要改变grubx64.efi
自己。更改grubx64.efi
将使签名无效,使其与 SecureBoot 不兼容。使用选项 2(定制
grubx64.efi
):grub.cfg
文件,因为...grubx64.efi
引导加载程序为了查找和读取阶段 2grub.cfg
文件 (/boot/grub/grub.cfg
) 所需的所有配置信息都直接嵌入到定制grubx64.efi
文件本身中。grubx64.efi
引导加载程序与 SecureBoot 不兼容,因此不需要由 Microsoft 签名。如果您在
grub-install
有--bootloader_id=
和没有--no-uefi-secure-boot
的情况下运行,则:grub-install
将使用 Microsoft 签名的、由规范提供的grubx64.efi
文件。(这是上面的选项 1。)grubx64.efi
文件和定制的阶段 1grub.cfg
文件将安装在:/boot/efi/EFI/$bootloader_id/
grubx64.efi
文件将尝试读取/boot/efi/EFI/ubuntu/grub.cfg
(因为无法更改此路径)。/boot/efi/EFI/ubuntu/grub.cfg
不存在,则引导将失败。/boot/efi/EFI/ubuntu/grub.cfg
确实存在,但来自同一系统上不同的 Ubuntu 安装,则引导可能会失败,或者grubx64.efi
可能引导其他 Ubuntu 系统而不是所需的 Ubuntu 系统。--no-uefi-secure-boot
不存在的地方),可以说:grub-install
应该产生错误(或至少是响亮的警告),而不是默默地安装一个很可能配置不正确的引导加载程序。或者,如果您使用 运行
grub-install
,--no-uefi-secure-boot
则:grub-install
将创建一个定制的(和未签名的)grubx64.efi
文件。grub.cfg
文件/boot/efi/EFI/$bootloader_id/
。grubx64.efi
文件本身将能够grub.cfg
在/boot/grub/grub.cfg
.如本答案顶部所述,如果您使用
--no-uefi-secure-boot
,则(当然)需要确保系统上的 SecureBoot 已关闭。