GRUB2 - 在 GRUB_CMDLINE_LINUX_DEFAULT 中使用不同的内核命令行选项创建第二个启动项

GRUB2 - 在 GRUB_CMDLINE_LINUX_DEFAULT 中使用不同的内核命令行选项创建第二个启动项

我想在启动时有一个单独的启动菜单条目。唯一的区别是 GRUB_CMDLINE_LINUX_DEFAULT 的值。原始(第一次)启动的 GRUB_CMDLINE_LINUX_DEFAULT 值为空,而第二个条目有一个传递给内核的值。

简而言之,我希望有两个启动菜单条目,唯一的区别是内核参数。我仔细研究了 /etc/grub.d,但除了对 /etc/grub.d 进行粗暴破解外,没有找到其他方法。

答案1

这是我在 16.04 上所做的事情:

/etc/default/grub首先在1中为备用命令行添加一个条目:

export GRUB_CMDLINE_LINUX_2="quiet splash mitigations=off"

当然,请更改内容以反映您想要的论点!笔记如图所示,您需要它export,即使现有GRUB_CMDLINE...变量不需要它:因为现有的已知变量被导出到内部的其他地方grub-mkconfig

其次,编辑/etc/grub.d/10_linux以添加新linux_entry行,这将生成您的新菜单项。您在文件中放置此行的位置决定了它显示的位置,但要让它显示在第一个默认选项的正下方,请在此处:

  if [ "x$is_top_level" = xtrue ] && [ "x${GRUB_DISABLE_SUBMENU}" != xy ]; then
    linux_entry "${OS}" "${version}" simple \
    "${GRUB_CMDLINE_LINUX} ${GRUB_CMDLINE_LINUX_DEFAULT}"

    # START
    linux_entry "${OS} (mitigations off)" "${version}" simple \
    "${GRUB_CMDLINE_LINUX} ${GRUB_CMDLINE_LINUX_2}"
    # END

新添加的内容位于# START和之间# END,而上面的条目是生成默认选项的现有条目。您基本上可以复制先前的条目,但将其更改GRUB_CMDLINE_LINUX_DEFAULTGRUB_CMDLINE_LINUX_2,并为其指定一个唯一的名称(在我的情况下,我附加了(mitigations off})。

现在,此菜单项将以与默认项相同的方式生成,只是使用不同的命令行参数。您也可以添加用附加参数替换默认参数,而不是替换它们,这实际上是我所做的,例如:

"${GRUB_CMDLINE_LINUX} ${GRUB_CMDLINE_LINUX_DEFAULT} ${GRUB_CMDLINE_EXTRA}"

${GRUB_CMDLINE_EXTRA}除了默认参数之外,我想要的额外参数在哪里?

跑步sudo update-grub就可以了。


1严格来说,您不需要这样做:您可以10_linux linux_entry在下一步中直接将值放入,但这会使事情变得清晰一些,并且如果您愿意,可以使用新命令行创建多个条目。一个问题是,在/etc/default/grub更新时,您可能偶尔会遇到合并冲突(通常,它们应该很容易解决:您只需要默认文件加上您的export ...行)。

答案2

我通过从 /etc/grub.d/40_linux 重新运行 /etc/grub.d/10_linux 并挑选菜单项来解决这个问题。

第一部分是 /etc/grub.d/40_linux

#!/bin/sh
. /etc/default/grub
export GRUB_DISABLE_RECOVERY=true
export GRUB_DISABLE_SUBMENU=y
export GRUB_CMDLINE_LINUX_DEFAULT=$GRUB_CMDLINE_LINUX_DEFAULT_ALT
/etc/grub.d/10_linux | python3 /usr/local/bin/extract-menuentry.py

因此,我可以使用备用命令行重新运行 10_linux。

在 /etc/default/grub 中输入 GRUB_CMDLINE_LINUX_DEFAULT_ALT。(在我的例子中是“aufs=tmpfs”)

并编写了一个 python 脚本来提取菜单项。(在我的情况下是在 /usr/local/bin/extract-menuentry.py 中。)

#!/usr/bin/env python3
import os, sys, re

menuentry_start = "menuentry"

def extract_menuentry(infile):
  in_menuentry = False
  for line in infile.readlines():
    if in_menuentry:
      if line.strip() == "}":
        in_menuentry = False
        print(line.rstrip())
        pass
      else:
        print(line.rstrip())
        pass
      pass
    else:
      if line.startswith(menuentry_start):
        in_menuentry = True
        match = re.search(r"menuentry '[^']+' (.*)", line)
        print("menuentry '%s' %s" % (os.environ.get('GRUB_ALT_NAME', 'Ubuntu alt'), match.group(1)))
        pass
      pass
    pass
  pass


if __name__ == "__main__":
  extract_menuentry(sys.stdin)
  pass

答案3

两种方式:

  1. 快速、简单且带有 GUI 界面:安装 grub-customizer。

    sudo apt update && sudo apt install grub-customizer
    
  2. 进入/etc/grub.d/proxifiedScripts并添加一个名为 custom1 的自定义条目(您可以从 /boot/grub/grub.cfg 中的默认条目复制配置)

    cd /etc/grub.d/proxifiedScripts sudo leafpad custom1 &

例如,custom1 条目可以像这样,您可以在以以下内容开头的行中自定义默认启动选项linux

menuentry "Custom Gnu/Linux"{
    load_video
    insmod gzio
    if [ x$grub_platform = xxen ]; then insmod xzio; insmod lzopio; fi
    insmod part_msdos
    insmod ext2
    set root='hd0,msdos5' [YOUR CORRESPONDING ROOT LOCATION]
    if [ x$feature_platform_search_hint = xy ]; then
      search --no-floppy --fs-uuid --set=root --hint-bios=[YOUR CORRESPONDING ROOT LOCATION] --hint-efi=[YOUR CORRESPONDING ROOT LOCATION] --hint-baremetal=ahci0,msdos5  [UUID of / partition]
    else
      search --no-floppy --fs-uuid --set=root [UUID]
    fi
    echo    'Loading Linux custom1 ...'
    linux   /boot/[your vmlinuz] root=UUID=[UUID] ro initrd=/install/gtk/initrd.gz quiet splash acpi_osi=linux
    echo    'Loading initial ramdisk ...'
    initrd  /boot/[your initrd.img]
}

然后你必须40_custom_proxy/etc/grub.d/t中编辑(如果没有,则创建)

#!/bin/sh
#THIS IS A GRUB PROXY SCRIPT
'/etc/grub.d/proxifiedScripts/custom1' | /etc/grub.d/bin/grubcfg_proxy "-*
-#text
+'Custom1 Gnu/Linux'~f993006fab178e9acbf3ae439d2495c0~

最后sudo grub-mkconfig运行sudo update-grub

但是,我推荐选项 1,因为它更干净、更快、更容易。

相关内容