Grub的一些操作随记:修订间差异

来自三线的随记
(创建页面,内容为“=== 列出全部启动项(包括submenu) === grep -E "^(\s*menuentry |\s*submenu )" /boot/grub/grub.cfg 例如: root@sit1:/etc/apt/sources.list.d# grep -E "^(\s*menuentry |\s*submenu )" /boot/grub/grub.cfg menuentry 'Ubuntu' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-a6097def-7c8d-4ed3-91c4-83e0916f1a03' { submenu 'Advanced options for Ubuntu' $menuentry_id_option 'gnulinux-advanced-a6097def-7c8d-4ed3-91c…”)
 
无编辑摘要
 
(未显示同一用户的1个中间版本)
第12行: 第12行:
  menuentry 'Ubuntu, with Linux 5.15.0-94-generic' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-5.15.0-94-generic-advanced-a6097def-7c8d-4ed3-91c4-83e0916f1a03' {
  menuentry 'Ubuntu, with Linux 5.15.0-94-generic' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-5.15.0-94-generic-advanced-a6097def-7c8d-4ed3-91c4-83e0916f1a03' {
  menuentry 'Ubuntu, with Linux 5.15.0-94-generic (recovery mode)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-5.15.0-94-generic-recovery-a6097def-7c8d-4ed3-91c4-83e0916f1a03' {
  menuentry 'Ubuntu, with Linux 5.15.0-94-generic (recovery mode)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-5.15.0-94-generic-recovery-a6097def-7c8d-4ed3-91c4-83e0916f1a03' {
从上述输出可以看出,每个 '''menuentry''' 表示一个具体的启动项,而 '''submenu''' 表示一个包含多个启动项的子菜单(例如 “Advanced options for Ubuntu” 高级选项子菜单)。缩进的 <code>menuentry</code> 行表示属于该子菜单的条目(例如不同内核版本及其恢复模式)。引号中的内容是启动项在引导菜单中显示的名称。


=== grub-set-default ===
通过分析输出,我们可以确定各启动项在 GRUB 菜单中的位置索引。例如,通常索引 '''0''' 是主菜单的第一个启动项(上述示例中的 “Ubuntu”,即最新内核的普通启动),索引 '''1''' 则是第二个启动项,这里是一个 '''submenu''' (“Advanced options for Ubuntu”)。由于 '''submenu''' 并非直接可引导的项(而是容器),如需选择子菜单内的某个启动项,需要使用复合索引(如 <code>1>2</code> 形式)或使用完整菜单路径/ID(下文将详述)。
 
=== 使用 <code>grub-set-default</code> 设置默认启动项 ===
通过 <code>grub-set-default 0</code> 或者 <code>grub-set-default "gnulinux-5.15.0-105-generic-advanced-a6097def-7c8d-4ed3-91c4-83e0916f1a03"</code> 或者 <code>grub-set-default "Advanced options for Ubuntu>Ubuntu, with Linux 5.15.0-105-generic"</code>  均可以实现在不编辑文件的情况下设置启动项
通过 <code>grub-set-default 0</code> 或者 <code>grub-set-default "gnulinux-5.15.0-105-generic-advanced-a6097def-7c8d-4ed3-91c4-83e0916f1a03"</code> 或者 <code>grub-set-default "Advanced options for Ubuntu>Ubuntu, with Linux 5.15.0-105-generic"</code>  均可以实现在不编辑文件的情况下设置启动项


grub-set-default 会操作 /boot/grub/grubenv 并写入 saved_entry 变量
grub-set-default 会操作 /boot/grub/grubenv 并写入 saved_entry 变量 (grub-set-default 其实就是一个bash脚本)


'''但是''' saved_entry 变量生效依赖 GRUB_DEFAULT=saved (man grub-set-default 中有提到)<blockquote>Set the default boot menu entry for GRUB.  This requires setting GRUB_DEFAULT=saved in /etc/default/grub.</blockquote>
'''但是''' <code>saved_entry</code> 变量生效依赖 <code>GRUB_DEFAULT=saved</code> (man grub-set-default 中有提到)<blockquote>Set the default boot menu entry for GRUB.  This requires setting GRUB_DEFAULT=saved in /etc/default/grub.</blockquote>⚠️ 注意这里<code>"Advanced options for Ubuntu>Ubuntu, with Linux 5.15.0-105-generic"</code> 的 <code>></code> 前后不需要也不能有空格


=== 通过修改 <code>/etc/default/grub</code> 实现指定启动项 ===
=== 通过修改 <code>/etc/default/grub</code> 实现指定启动项 ===
第28行: 第31行:


当然,同理  <code>GRUB_DEFAULT</code> 也可以写为  <code>GRUB_DEFAULT=gnulinux-5.15.0-105-generic-advanced-a6097def-7c8d-4ed3-91c4-83e0916f1a03</code> 这样更稳妥
当然,同理  <code>GRUB_DEFAULT</code> 也可以写为  <code>GRUB_DEFAULT=gnulinux-5.15.0-105-generic-advanced-a6097def-7c8d-4ed3-91c4-83e0916f1a03</code> 这样更稳妥
如果设置了无效的名称或索引,GRUB 通常会回退到第一个菜单项,因此务必确保字符串与实际 <code>grub.cfg</code> 中的条目匹配


[[分类:Linux]]
[[分类:Linux]]

2025年4月17日 (四) 19:19的最新版本

列出全部启动项(包括submenu)

grep -E "^(\s*menuentry |\s*submenu )" /boot/grub/grub.cfg

例如:

root@sit1:/etc/apt/sources.list.d# grep -E "^(\s*menuentry |\s*submenu )" /boot/grub/grub.cfg

menuentry 'Ubuntu' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-a6097def-7c8d-4ed3-91c4-83e0916f1a03' {
submenu 'Advanced options for Ubuntu' $menuentry_id_option 'gnulinux-advanced-a6097def-7c8d-4ed3-91c4-83e0916f1a03' {
	menuentry 'Ubuntu, with Linux 5.15.0-113-generic' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-5.15.0-113-generic-advanced-a6097def-7c8d-4ed3-91c4-83e0916f1a03' {
	menuentry 'Ubuntu, with Linux 5.15.0-113-generic (recovery mode)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-5.15.0-113-generic-recovery-a6097def-7c8d-4ed3-91c4-83e0916f1a03' {
	menuentry 'Ubuntu, with Linux 5.15.0-105-generic' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-5.15.0-105-generic-advanced-a6097def-7c8d-4ed3-91c4-83e0916f1a03' {
	menuentry 'Ubuntu, with Linux 5.15.0-105-generic (recovery mode)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-5.15.0-105-generic-recovery-a6097def-7c8d-4ed3-91c4-83e0916f1a03' {
	menuentry 'Ubuntu, with Linux 5.15.0-94-generic' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-5.15.0-94-generic-advanced-a6097def-7c8d-4ed3-91c4-83e0916f1a03' {
	menuentry 'Ubuntu, with Linux 5.15.0-94-generic (recovery mode)' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-5.15.0-94-generic-recovery-a6097def-7c8d-4ed3-91c4-83e0916f1a03' {

从上述输出可以看出,每个 menuentry 表示一个具体的启动项,而 submenu 表示一个包含多个启动项的子菜单(例如 “Advanced options for Ubuntu” 高级选项子菜单)。缩进的 menuentry 行表示属于该子菜单的条目(例如不同内核版本及其恢复模式)。引号中的内容是启动项在引导菜单中显示的名称。

通过分析输出,我们可以确定各启动项在 GRUB 菜单中的位置索引。例如,通常索引 0 是主菜单的第一个启动项(上述示例中的 “Ubuntu”,即最新内核的普通启动),索引 1 则是第二个启动项,这里是一个 submenu (“Advanced options for Ubuntu”)。由于 submenu 并非直接可引导的项(而是容器),如需选择子菜单内的某个启动项,需要使用复合索引(如 1>2 形式)或使用完整菜单路径/ID(下文将详述)。

使用 grub-set-default 设置默认启动项

通过 grub-set-default 0 或者 grub-set-default "gnulinux-5.15.0-105-generic-advanced-a6097def-7c8d-4ed3-91c4-83e0916f1a03" 或者 grub-set-default "Advanced options for Ubuntu>Ubuntu, with Linux 5.15.0-105-generic" 均可以实现在不编辑文件的情况下设置启动项

grub-set-default 会操作 /boot/grub/grubenv 并写入 saved_entry 变量 (grub-set-default 其实就是一个bash脚本)

但是 saved_entry 变量生效依赖 GRUB_DEFAULT=saved (man grub-set-default 中有提到)

Set the default boot menu entry for GRUB.  This requires setting GRUB_DEFAULT=saved in /etc/default/grub.

⚠️ 注意这里"Advanced options for Ubuntu>Ubuntu, with Linux 5.15.0-105-generic"> 前后不需要也不能有空格

通过修改 /etc/default/grub 实现指定启动项

关联配置项是 GRUB_DEFAULT , 例如 GRUB_DEFAULT="1 > 2"

虽然这里 "1 > 2" 可以有空格,但是推荐写法还是 GRUB_DEFAULT="1>2"

修改 /etc/default/grub 以后需要执行 update-grub 以更新 grub 配置

当然,同理 GRUB_DEFAULT 也可以写为 GRUB_DEFAULT=gnulinux-5.15.0-105-generic-advanced-a6097def-7c8d-4ed3-91c4-83e0916f1a03 这样更稳妥

如果设置了无效的名称或索引,GRUB 通常会回退到第一个菜单项,因此务必确保字符串与实际 grub.cfg 中的条目匹配