我能够使用默认引导加载程序 ID 重新安装 grub”Ubuntu“
但如果我使用自定义名称,如“Ubuntu“我无法成功安装 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.....
答案1
在我遇到systemd-boot作为引导加载程序,我从未回头看过 GRUB。 systemd-boot在我看来,它更加稳定,配置方式也更好。我说的“稳定”是指它不像 GRUB 那样脆弱。GRUB 很容易被破坏。只要在机器上添加一个新磁盘就可能给你带来大麻烦(因为可能有相同的引导加载程序 ID,而你无法更改等等)。
唯一的缺点systemd-boot是缺乏安全启动支持,但这对我来说不是问题,并且你的内核必须位于 EFI 分区,而不是根分区,就像 GRUP 的情况一样。
和systemd-boot我重新获得了对启动过程的完全控制权……是的
它应该是默认的引导加载程序,而不是 GRUB。
更新, 如何操作(Debian/Ubuntu):(
这是一个相当肤浅的指南,但我希望它能帮助你入门。其他来源:阿里云,免费桌面..和自述..)
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加载程序到 EFI 分区:(bootctl --path=/mnt/efi install
使用您自己的已安装 EFI 分区的路径)
4:将文件编辑/mnt/efi/loader/loader.conf
为类似以下内容:
timeout 5
# default 6a9857a393724b7a981ebb5b8495b9e-*
(还没有弄清楚如何在文件中使用自动添加的 UUID,所以我只是将其标记出来)
5:每个文件对应/mnt/efi/loader/entries/*.conf
于启动项中的systemd-boot菜单。因此,要添加当前操作系统,请创建一个如下所示的文件:
title Debian 9 :-)
linux /debian9/vmlinuz-4.9.0-6-amd64
initrd /debian9/initrd.img-4.9.0-6-amd64
options root=UUID=084917b7-8be2-4e86-838d-f771a9902e08`
(修改您在步骤 1 中复制的内核文件的路径。将 UUID 修改为根分区的文件系统 UUID(使用 Linux 命令lsblk -o name,uuid
)
基本信息:
启动控制将在你的 EFI 分区中安装两个引导加载程序文件:
../BOOT/BOOTX64.EFI
../systemd/systemd-bootx64.efi
这些文件是相同的。主板上的 EFI bios 必须引导/指向其中一个。可以直接在 BIOS 中执行此操作,也可以使用 Linux 命令efibootmgr....
要添加新的启动项,只需创建一个/mnt/efi/loader/entries/*.conf
指向正确内核文件和根分区的新文件。
内核文件必须位于 EFI 分区 (FAT32) 上。EFI
分区的大小必须相应调整。我认为 Debian/Ubuntu 等操作系统的内核文件大约为 50-60MB。因此,如果您有两个安装,则需要 120MB。
答案2
作为gdeff 提及要使用自定义方式安装 Grub --bootloader-id
,也可以使用选项--no-uefi-secure-boot
。例如:
grub-install \
--target=x86_64-efi \
--no-uefi-secure-boot \
--bootloader-id=MyUbuntu \
/dev/sda
另外,请确保您的系统上已禁用安全启动。
解释
grub-install
如果您想更好地理解、、和 SecureBoot之间的交互,您只需要阅读下面(不幸的是很长的)解释grubx64.efi
。grub.cfg
- SecureBoot 将仅启动
.efi
由 Microsoft 加密签名的文件。 - 在 Ubuntu 系统上,该文件
/boot/efi/EFI/ubuntu/grubx64.efi
通常来自以下两个地方之一: - 选项 1:
grubx64.efi
是 Canonical 提供的静态、不变、Microsoft 签名、与 SecureBoot 兼容的“二进制 blob”Grub 引导加载程序。这是默认选项。 - 选项 2:
grubx64.efi
运行 时会在您的系统上创建grub-install
。在这种情况下,grubx64.efi
未签名,因此与 SecureBoot 不兼容。
使用选项 1 (Canonical 提供,兼容 SecureBoot grubx64.efi
):
- 通常会有两个
grub.cfg
文件。 - 第一
grub.cfg
阶段/boot/efi/EFI/ubuntu/grub.cfg
- 第二
grub.cfg
阶段/boot/grub/grub.cfg
- 第 1 阶段文件包含查找和读取第 2 阶段文件所需的
grub.cfg
信息。grubx64.efi
grub.cfg
- 无法更改阶段 1
grub.cfg
文件的路径。更改此路径将需要更改其本身。更改将使签名无效,从而导致其与 SecureBoot 不兼容。/boot/efi/EFI/ubuntu/grub.cfg
grubx64.efi
grubx64.efi
采用选项 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 签名的、由 Canonical 提供的grubx64.efi
文件。(这是上面的选项 1。)- 此
grubx64.efi
文件和定制的 phase-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
位于的第 2 阶段文件/boot/grub/grub.cfg
。
正如该答案顶部所提到的,如果您使用--no-uefi-secure-boot
,您(当然)需要确保您的系统上的 SecureBoot 已关闭。
答案3
我使用了一个简单的解决方法。运行后grub-install
,不带任何参数--bootloader-id
运行grub-install
。它将创建一个 ubuntu 条目。如果您愿意,可以删除它,但现在您的 id 将“神奇地”工作。非常烦人,似乎是一个老错误。希望我有所帮助。