我想在启动时有一个单独的启动菜单条目。唯一的区别是 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_DEFAULT
为GRUB_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
两种方式:
快速、简单且带有 GUI 界面:安装 grub-customizer。
sudo apt update && sudo apt install grub-customizer
进入
/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,因为它更干净、更快、更容易。