直接改GRUB_DEFAULT并运行update-grub即可生效,但必须用grep -E '^menuentry' /boot/grub/grub.cfg | cut -d"'" -f2 | nl -w1 -s') '查菜单名及从0开始的索引,用grub-editenv list查当前saved_entry,且GRUB_DEFAULT填数字易偏移、填名称须完全匹配(含空格括号),改完未生效多因未sudo编辑、未运行update-grub或GRUB_TIMEOUT=0导致菜单不显示。

直接改 GRUB_DEFAULT 并运行 update-grub 就能生效,但必须确认索引或名称完全匹配,否则启动项会失效或跳回第一个。
怎么查当前所有启动项和默认项
启动菜单里看到的顺序 ≠ GRUB 内部索引顺序,靠肉眼数容易错。得用命令确认:
-
grep -E '^menuentry' /boot/grub/grub.cfg | cut -d"'" -f2 | nl -w1 -s') '—— 列出所有可选菜单名,前面带编号(从 0 开始) -
grub-editenv list—— 查当前保存的默认项,输出可能是saved_entry=0或saved_entry="Ubuntu" - 注意:
grub.cfg是自动生成的,别手动编辑它;/etc/default/grub才是该改的地方
GRUB_DEFAULT 填数字还是填名字
填数字简单,但加新内核后索引可能偏移;填名字稳定,但大小写、空格、括号都得一模一样。
- 按索引设(推荐用于单系统或内核固定场景):
GRUB_DEFAULT=1表示第二个菜单项 - 按名字设(双系统或常更新内核时更安全):
GRUB_DEFAULT="Windows Boot Manager (在 /dev/nvme0n1p1)",必须和grub.cfg里menuentry后面的字符串完全一致 - 进子菜单(比如 Advanced options 下的某个内核):
GRUB_DEFAULT="Advanced options for Ubuntu>Ubuntu, with Linux 5.15.0-76-generic",用>分隔层级
改完不生效?常见卡点
不是改了配置就完事,漏掉任一环节都会白忙活。
- 没加
sudo编辑/etc/default/grub→ 权限不足,文件实际没保存 - 改完没运行
sudo update-grub→ 新配置根本没写进grub.cfg,重启还是旧逻辑 -
GRUB_TIMEOUT被设成 0 或注释掉了 → 菜单不显示,你以为改成功了,其实根本没机会验证是否选对了项 - 系统用了
grubby(如 RHEL/CentOS 8+)而非 GRUB2 工具链 → 此时update-grub不存在,得用grubby --set-default和grubby --default-kernel
最易被忽略的是:不同发行版底层工具链不同 —— Ubuntu/Debian 用 update-grub,RHEL/CentOS 8+ 用 grubby,CentOS 7 用 grub2-set-default。混用命令会导致看似操作成功,实则配置未落地。


















