在GRUB中设置默认内核


49

如何选择默认应加载的内核GRUB2?我最近安装了linux实时内核,现在默认情况下加载。我想默认加载常规的。

到目前为止,我只设法选择了默认操作系统。由于某种原因/boot/grub.cfg,我已经假设我要加载rt-kernel并将其放入通用linux菜单项(在我的情况下为Arch Linux)。


2
grub2-set-default <标题或编号>?
taliezin 2015年

1
但是我怎么知道这个数字?中的数字grub.cfg仅对应于操作系统,而不对应于内核。
TomTom 2015年

在某些情况下,它可以起作用:askubuntu.com/questions/216398/…您可以通过浏览以下文件找到菜单名称:/boot/grub/grub.cfg
TekOps,2018年

Answers:


41

我认为大多数发行版都将更多内核移到了高级选项子菜单中,因为TomTom发现他的Arch就是这种情况。

我不想更改顶层菜单结构以选择以前的内核作为默认内核。我在这里找到了答案:

http://www.humans-enabled.com/2014/08/how-to-set-default-grub-kernel-boot.html

总结一下:

1)找到$menuentry_id子菜单的_option:

$ grep submenu /boot/grub/grub.cfg
submenu 'Advanced options for Debian GNU/Linux' $menuentry_id_option 'gnulinux-advanced-38ea4a12-6cfe-4ed9-a8b5-036295e62ffc' {

2)找到$menuentry_id_option要使用的内核的菜单项:

$ grep gnulinux /boot/grub/grub.cfg
menuentry 'Debian GNU/Linux' --class debian --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-38ea4a12-6cfe-4ed9-a8b5-036295e62ffc' {
submenu 'Advanced options for Debian GNU/Linux' $menuentry_id_option 'gnulinux-advanced-38ea4a12-6cfe-4ed9-a8b5-036295e62ffc' {
    menuentry 'Debian GNU/Linux, with Linux 4.18.0-0.bpo.1-rt-amd64' --class debian --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.18.0-0.bpo.1-rt-amd64-advanced-38ea4a12-6cfe-4ed9-a8b5-036295e62ffc' {
    menuentry 'Debian GNU/Linux, with Linux 4.18.0-0.bpo.1-rt-amd64 (recovery mode)' --class debian --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.18.0-0.bpo.1-rt-amd64-recovery-38ea4a12-6cfe-4ed9-a8b5-036295e62ffc' {
    menuentry 'Debian GNU/Linux, with Linux 4.18.0-0.bpo.1-amd64' --class debian --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.18.0-0.bpo.1-amd64-advanced-38ea4a12-6cfe-4ed9-a8b5-036295e62ffc' {
    menuentry 'Debian GNU/Linux, with Linux 4.18.0-0.bpo.1-amd64 (recovery mode)' --class debian --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.18.0-0.bpo.1-amd64-recovery-38ea4a12-6cfe-4ed9-a8b5-036295e62ffc' {
    menuentry 'Debian GNU/Linux, with Linux 4.17.0-0.bpo.1-amd64' --class debian --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.17.0-0.bpo.1-amd64-advanced-38ea4a12-6cfe-4ed9-a8b5-036295e62ffc' {
    menuentry 'Debian GNU/Linux, with Linux 4.17.0-0.bpo.1-amd64 (recovery mode)' --class debian --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.17.0-0.bpo.1-amd64-recovery-38ea4a12-6cfe-4ed9-a8b5-036295e62ffc' {
    menuentry 'Debian GNU/Linux, with Linux 4.9.0-8-amd64' --class debian --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.9.0-8-amd64-advanced-38ea4a12-6cfe-4ed9-a8b5-036295e62ffc' {
    menuentry 'Debian GNU/Linux, with Linux 4.9.0-8-amd64 (recovery mode)' --class debian --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.9.0-8-amd64-recovery-38ea4a12-6cfe-4ed9-a8b5-036295e62ffc' {

3)注释掉您当前的默认grub,/etc/default/grub并用$menuentry_id_option步骤1 的子菜单替换,并将$menuentry_id_option步骤2 的选定内核替换为>

就我而言,修改GRUB_DEFAULT为:

#GRUB_DEFAULT=0

GRUB_DEFAULT="gnulinux-advanced-38ea4a12-6cfe-4ed9-a8b5-036295e62ffc>gnulinux-4.18.0-0.bpo.1-amd64-advanced-38ea4a12-6cfe-4ed9-a8b5-036295e62ffc"

4)更新grub进行更改。对于Debian,这样做是这样的:

$ sudo update-grub

做完了 现在,当您启动时,高级菜单应该带有一个星号,并且您应该启动到所选的内核中。您可以通过uname确认。

$ uname -a
Linux NAME 4.18.0-0.bpo.1-amd64 #1 SMP Debian 4.18.0-0 (2018-09-13) x86_64 GNU/Linux

将其更改为最新的内核非常简单,只需注释掉新行并取消注释#GRUB_DEFAULT=0,然后重新运行即可update-grub


31

经过2个小时的奋斗,我找到了一种更简单的方法来实现这一目标。我只是RTFM。;)

在/ etc / default / grub中添加两行

GRUB_SAVEDEFAULT=true
GRUB_DEFAULT=saved

请执行sudo update-grub,重新开机,进入你的GRUB菜单,并选择您需要哪个菜单或子菜单项。该选择将被保存,下次您的计算机将自动启动该选择。


2
精彩!很简单!
Egor Skriptunoff

哦,简单得多。谢谢。
user207863

21

如注释中所述,您可以使用grub-set-default X命令设置要引导进入的默认内核,其中X是您要引导进入的内核的编号。在某些发行版中,您还可以通过编辑/etc/default/grub文件和设置GRUB_DEFAULT=X,然后运行来设置此数字update-grub

该数字是引导期间GRUB菜单中显示的内核/内核设置数组的索引,其中0是第一个(最顶部)条目。通常,您可以通过在中查找menuentry行来找到正确的数字/boot/grub/grub.cfg,如下所示:

grep menuentry /boot/grub/grub.cfg

您将看到列出的每个内核都具有GRUB引导菜单中显示的名称。第一个是0,第二个是1,依此类推。


1
在Fedora 21中是/boot/grub2/grub.cfg
somethingSomething

3
这对我不起作用。我安装的最新内核是4.4.0-64-generic(菜单0),但我希望4.4.0-59-generic(菜单9)成为默认的启动内核。我跑了grub-set-default 9,然后grub-update重新启动。我让grub使用默认内核启动,并且仍然使用4.4.0-64-generic启动。我也尝试编辑/etc/default/grub并设置GRUB_DEFAULT=9并运行grub-update。重启后,系统仍然使用4.4.0-64-generic引导。也许我错过了一些东西,有人可以帮助我吗?
Dronacharya

这对我也不起作用。我删除了不必要的内核喜欢这里解释:askubuntu.com/a/764242/456247
路易斯-

8

简单地grep 'menuentry' /boot/grub/grub.cfg列出其他与实际内核或操作系统版本无关的条目。例如,它列出了

if [ x"${feature_menuentry_id}" = xy ]; then
  menuentry_id_option="--id"
  menuentry_id_option=""
export menuentry_id_option

我想对搜索该文件的方法提出一个小的改进:使用 awk

$ awk '/menuentry/ && /class/ {count++; print count-1"****"$0 }' /boot/grub/grub.cfg                                            
0****menuentry 'Ubuntu' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-86df21bf-d95f-435c-9292-273bdbcba056' {
1****   menuentry 'Ubuntu, with Linux 3.19.0-26-generic' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-3.19.0-26-generic-advanced-86df21bf-d95f-435c-9292-273bdbcba056' {
2****   menuentry 'Ubuntu, with Linux 3.19.0-26-generic (recovery mode)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-3.19.0-26-generic-recovery-86df21bf-d95f-435c-9292-273bdbcba056' {
3****   menuentry 'Ubuntu, with Linux 3.13.0-62-generic' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-3.13.0-62-generic-advanced-86df21bf-d95f-435c-9292-273bdbcba056' {
4****   menuentry 'Ubuntu, with Linux 3.13.0-62-generic (recovery mode)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-3.13.0-62-generic-recovery-86df21bf-d95f-435c-9292-273bdbcba056' {

使用波纹管命令及其输出,您可以看到awk与实际操作系统版本匹配的代码,并提供可以在/etc/default/grub文件中使用的编号。

除了/etc/default/grub手动编辑 文件外,建议使用sed。在下面的命令中,将X替换为您从上述awk命令获得的相应数字:

sudo sed -i 's/GRUB_DEFAULT=0/GRUB_DEFAULT=X/g' /etc/default/grub; sudo update-grub


2
这不是答案。它读起来像一条评论。答案应为“这是如何在GRUB中设置默认条目”,而不是“让我为另一个答案做附录”。您可以轻松地将其编辑为适当的答案,但是对jkt123有关使用awk而不是grep的答案发表评论可能会更聪明。
Aleksandr Dubinsky

2

我猜jkt123可以用于大多数发行版。但是对于Arch Linux,它不起作用,至少不适用于我提供的软件包。

可以设置的索引grub-set-default仅对应于主菜单条目。但是,内核选项位于子菜单中。因此,您可以将内核条目从子菜单中移出到主菜单中,或者将条目放在子菜单列表的顶部,然后选择子菜单。

我的Grub菜单

  • Arch Linux
  • Arch Linux的高级选项
    • 内核1
    • 内核2
  • 视窗

为了能够启动内核2,您必须与内核1交换它,或者将其放在与Arch Linux或Windows相同级别的子菜单之外。然后将默认数字设置为主菜单索引之一。例如,在上方的菜单中,“ 0”引导“ Arch Linux”,而“ 1”引导内核1。

要更改层次结构和交换,请打开/boot/grub/grub.cfg并移动您要移动的条目。一个条目可能看起来像这样

menuentry 'ENTRY NAME'
   ... some code ...
}

然后,您需要应用更改。就我而言grub-mkconfig。但这可能因系统而异。


0

直到最近CentOS-6.6 grub.conf看起来可以手动编辑以更改默认选择:

default=1
timeout=5
splashimage=(hd0,0)/boot/grub/splash.xpm.gz

0

Debian拉伸:

不用搞乱配置文件,而是在其中创建一个文件夹/noot(称其为所需内容),将所需的内核以及匹配的配置文件和系统文件保留在其中,/boot然后将其余部分移动到该新文件夹中。

运行update-grub

仔细检查/boot您的内核版本以及匹配的配置文件和系统文件是否仍然存在的文件夹(以防您复制了本不应该包含的内容)并重新启动。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.