我有双启动 Ubuntu 和 Arch,我认为必须有一种方法可以设置 GRUB 的默认启动项来启动第二个操作系统,例如,当我从 Arch 重新启动时,它将启动到 Ubuntu,反之亦然。也许可以通过创建一个新的 grub 条目来实现,但我不知道如何检查以前的引导条目,因此选择另一个。
答案1
在现代版本的 GRUB 中,您可以使用两个命令来实现此目的:grub-set-default
和grub-reboot
。
grub-set-default
将持续更改默认启动项,但需要使用GRUB_DEFAULT=saved
(/etc/default/grub
并使用通用grub-mkconfig
或其特定于 Debian/Ubuntu 的包装器更新实际的 GRUB 配置update-grub
以使更改生效)。
grub-reboot
指定一个一度仅用于下次启动的启动目标。尽管有这个名称,但它实际上不会重新启动系统。
这两者都将采用数字、菜单项标题或菜单项标识符作为参数。如果所需的菜单项位于子菜单中,则需要指定主菜单项的名称/标识符、字符>
以及子菜单项的名称。
例如,在 Debian 上,第一个(也是正常的默认)菜单项通常名为Debian GNU/Linux
,第二个菜单项的标题为Advanced options for Debian GNU/Linux
,它打开当前安装的内核的子菜单。对于每个内核,子菜单中有两个条目:Debian GNU/Linux, with <kernel version>
和Debian GNU/Linux, with <kernel version> (recovery mode)
。
要在正常模式下使用以前的内核版本启动一次,您可以执行以下操作:
grub-reboot 'Advanced options for Debian GNU/Linux>Debian GNU/Linux, with <kernel version>'
您可以通过运行并查看变量是否有值来查看grub-reboot
当前引导周期中是否使用了该命令。如果从未使用过,则该变量可能根本不存在。grub-editenv list
next_entry=
grub-reboot
同样,如果有saved_entry=
变量,则说明该grub-set-default
命令已被使用;但与 不同的是next_entry=
,该值不会在一次启动尝试后自动删除。
答案2
您可以编写一个systemd
脚本(服务)来检查您当前所在的系统(例如,通过检查是否有命令lsb_release
——它应该在 Ubuntu 中,但不在 Arch 中)。然后检查GRUB配置文件的内容(/boot/grub/grub.cfg
请参见这个关于 GRUB 的 wiki 页面)。然后,根据您所在的系统,切换 GRUB 配置中的条目。有几种方法可以做到这一点。这不建议方法是“手动”(即使用脚本/服务)编辑主配置文件。理论上你不应该这样做,因为它很容易犯错误,这将使你无法启动到任何系统。编辑 GRUB 条目的推荐方法是使用自定义条目,但从脚本(或一般命令行)处理它们可能有点棘手。
当然,脚本/方法中存在一些陷阱systemd
(例如,您实际上应该有两个这样的脚本:一个在 Arch 上,另一个在 Ubuntu 上,两者都实现相同的功能),但它非常接近您想要的功能。顺便说一句,你写道:
我不知道如何检查以前的启动项,因此选择另一个
我强烈建议您阅读GRUB 上的 Arch Linux wiki——好几次了。它对我最终理解 GRUB 的工作原理有很大帮助。我很钦佩创建此文档的人,我想说这是一篇精彩的说明,是网络上最好的说明之一(作为 wiki 页面的示例)。
总而言之,没有简单的方法可以实现您在问题中想要的结果,但另一方面,“简单”解决方案的乐趣在哪里? :) 祝你好运,编码愉快,如果你需要更多建议,请告诉我。