我有一台装有 Windows 和 Ubuntu 20.04 的机器。活动分区(BIOS 中的第一个引导项)是安装 Ubuntu 的分区,我已经手动输入 GRUB 条目以选择 Windows 作为引导进入,这是默认设置。
我希望能够使用 USB 记忆棒(或者更好的 SD 卡)来更改默认选择。如果它被插入,它应该引导到 Ubuntu(第一个条目),如果没有,那么它应该使用默认选择(第三个条目,Windows)。
我是否需要(不知何故,我不知道如何)将 GRUB 安装/复制/dd 到 USB 棒/SD 卡上,并选择它作为 BIOS 引导顺序中的第一项,并回退到 Ubuntu 的分区,目前哪个是引导顺序中的第一个?
或者(希望)有一个工具可以让我在 Stick/Card 上放置一个文件,然后由 GRUB 读取?
更新:我一直在检查 GRUB 配置文件,并注意到有一个名为的文件/boot/grub/grubenv
,其中有一个名为next_entry=
. 存在这条线是因为我有时会使用sudo grub-reboot 0
它来重新启动进入 Ubuntu。如果我执行sudo grub-reboot 0
,则此行更改为next_entry=0
.
我现在正在考虑修改/etc/default/grub/00_header
以检查是否连接了某个 USB 设备,如果是,则它要么写入next_entry=0
文件grubenv
,要么添加一些代码,这些代码只是设置必要的变量,类似于next_entry=0
这样做的方式。
所以现在我的问题是我不知道可以执行哪些操作00_header
,最终使用curl
来获取变量将是完美的,但我猜当时不存在网络并且 curl 不是一个可识别的命令。
如何调试/学习 GRUB 以查看此文件中的功能,而不会有损坏系统的风险?
我目前正在考虑使用带有快照的干净虚拟机,如果出现问题,我可以恢复到该快照中,以获得一些见解。但也许这里专家的一两个提示对我来说很有价值。
以前有一个软件叫Multisystem。我看它还在。它通常是一种软件,可让您将多个发行版安装到 U 盘上。您可以使用它(我已经使用它)的方式是使用它引导到 grub(USB 闪存驱动器的 grub)。我看到的一个较新的工具叫做 Ventoy,但我没有使用过它。看起来它有相同的方法。基本上,我口袋里有 GRUB。否则,我曾经启动到 Windows。我没有(故意)安装 grub,我也是双引导,使用 U 盘引导进入 Debian。有更干净的方法可以做到这一点,但我认为这些会更容易。
如果您在 GRUB 2 选择菜单中中止引导过程并放入 shell,您将能够通过执行
ls
命令列出连接的设备。在我的情况下,USB 记忆棒是
(hd0,msdos1)
.首先,我修改了
/boot/grub/grub.cfg
文件,使其包含以下内容:next_entry=0
如果我跑了$prefix/grubenv
会在哪里设置sudo grub-reboot 0
。这有效,但它无法在内核升级后继续存在,因为它会重建
/boot/grub/grub.cfg
然后我
/etc/grub.d/00_header
通过添加以下内容进行了修改:并发出
sudo update-grub
,然后生成/boot/grub/grub.cfg
结果是,如果插入 USB 记忆棒并且它
grub_boot_config
在根目录中包含文件(可以为空),那么(hd0,msdos1)/grub_boot_config
将成功并设置next_entry=0
.下一步的改进是在
0
文件中包含(或应启动的任何菜单项),并让脚本读取并设置next_entry
它,并使其在每个驱动器上搜索此文件,而不仅仅是(hd0,msdos1)
.无论如何,事实证明它对
/boot/grub/grub.cfg
拼写错误非常有弹性,因此您不太可能通过进行这些修改来破坏您的系统(这是我用干净的 VM 测试的)。