GRUB2 - 在 GRUB_CMDLINE_LINUX_DEFAULT 中使用不同的内核命令行选项创建第二个引导条目

Nao*_*Tai 7 grub2

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

简而言之,我想要两个启动菜单条目,唯一的区别是内核参数。我浏览了 /etc/grub.d 但除了 /etc/grub.d 中的粗暴黑客之外找不到其他方法。

Nao*_*Tai 1

我通过从 /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
Run Code Online (Sandbox Code Playgroud)

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

将 GRUB_CMDLINE_LINUX_DEFAULT_ALT 放入 /etc/default/grub.conf 中 (在我的例子中,“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
Run Code Online (Sandbox Code Playgroud)