grub2-set-default 是 centos 7 修改默认启动内核的正确入口,支持数字索引(如 0)或完整菜单名两种方式:索引稳定可靠,菜单名需严格匹配且易因内核更新失效;修改后必须用 grub2-editenv list 验证 saved_entry 是否写入成功,并注意云平台或 uefi 环境可能绕过本地设置。

grub2-set-default 是改 CentOS 7 默认启动内核的正确入口,但直接写数字或字符串都容易出错——关键在于你用的是索引还是完整菜单名,而两者行为不一致,且 grub2-editenv list 显示的 saved_entry 值会因配置方式不同而变化。
怎么看当前有哪些内核可选
别信 /boot/grub2/grub.cfg 里肉眼数的顺序,它会被生成脚本动态排序。真正生效的菜单顺序由 grub2-mkconfig 生成时决定,所以必须用原始定义源确认:
-
grep ^menuentry /boot/grub2/grub.cfg—— 输出带行号,第一行是索引 0,第二行是 1,以此类推(注意:空行和注释不算) - 更稳妥的方式是执行
awk -F"'" '/^menuentry / {print NR-1 ": " $2}' /boot/grub2/grub.cfg,自动编号并提取显示名 - 如果输出里有
rescue或重复项,说明系统残留了旧内核或救援镜像,得先清理再设默认
用索引还是用菜单名设默认?
两种方式都支持,但行为差异很大:
CentOS Linux 7.9.2009是传统CentOS Linux 7的最后主要版本,也是很多企业历史服务器中仍可能遇到的系统版本。它以稳定、兼容RHEL 7生态、文档丰富和软件支持广泛著称,曾长期用于Web服务、数据库、虚拟化节点和企业内部业务系统。不过CentOS Linux 7已于2024年6月30日停止维护,现在继续使用会面临安全补丁缺失风险。该版本更适合旧业务迁移、历史环境恢复或离
- 用数字索引(如
grub2-set-default 0):最稳定,不依赖菜单名是否含空格、括号或版本号变化;grub2-editenv list会显示saved_entry=0 - 用完整菜单名(如
grub2-set-default "CentOS Linux (3.10.0-1160.119.1.el7.x86_64) 7 (Core)"):必须一字不差,包括所有空格和括号;一旦内核更新后自动生成新菜单项,旧名字就失效,saved_entry会变成该字符串,但 GRUB 启动时找不到匹配项,就会 fallback 到第一个菜单项 - 别用
grub2-set-default后跟内核路径(如/boot/vmlinuz-3.10.0...),它不识别这种格式,会静默失败
为什么改完不生效?常见失效场景
改完 grub2-set-default 后不生效,90% 是因为没触发 GRUB 配置重载或环境未持久化:
-
grub2-set-default只写入/boot/grub2/grubenv,不修改grub.cfg,所以不需要手动运行grub2-mkconfig—— 但必须确保/boot/grub2/grubenv可写(SELinux 或只读挂载会导致写入失败) - 执行完命令后,立刻用
grub2-editenv list检查输出是否为saved_entry=xxx;如果仍是空或报错error: cannot open '.../grubenv',说明写入失败 - 某些云平台(如 Linode、AWS EC2)屏蔽了 GRUB 引导控制权,后台强制指定内核,本地设置完全无效 —— 此时
grub2-editenv list可能显示已设置,但重启后仍走平台默认内核 - UEFI 系统可能同时存在
/boot/efi/EFI/centos/grub.cfg和/boot/grub2/grub.cfg,要确认你操作的是实际被加载的那个(通常看ls /sys/firmware/efi是否存在)
验证和回退怎么做
重启前务必验证,避免进不了系统:
- 用
grubby --default-kernel查看当前默认内核路径(CentOS 7 自带,比grub2-editenv更直观) - 用
grubby --default-index查看对应索引,再对照grep ^menuentry /boot/grub2/grub.cfg确认是否是你想要的那一个 - 如果设错了,用
grub2-set-default 0或其他正确索引重置即可,无需删文件 - 极端情况(如误删内核或
grubenv损坏),可临时在 GRUB 启动界面按e编辑启动项,把linux16行末尾加上systemd.unit=emergency.target进单用户模式修复
saved_entry 是按索引存的还是按字符串存的 —— 一旦混用,grub2-editenv list 看起来正常,但重启后根本不会加载你想要的内核。










