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的最新版本
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 中的条目匹配