grub2 配置的核心是修改 /etc/default/grub 文件并执行 update-grub 命令,掌握这几个关键参数就能管理默认启动项、调整等待时间以及修复引导故障。
先说清楚 grub2 配置到底要改什么
grub2 的配置文件不像老版 grub 那样直接编辑 menu.lst,而是分成了两套体系:一套是用户可以改的 /etc/default/grub,另一套是自动生成的 /boot/grub/grub.cfg。系统每次更新内核或运行 update-grub 时,都会根据前者重新生成后者。 所以你要改的永远只有 /etc/default/grub,千万别手动去编辑 grub.cfg,那玩意一更新就给覆盖了。
以下是最常用的几个参数,基本覆盖了 90% 的配置场景:
GRUB_DEFAULT:默认启动项,可以是数字序号,也可以是菜单项名称。GRUB_TIMEOUT:倒计时秒数,改成0就是开机直接进系统。GRUB_CMDLINE_LINUX_DEFAULT:追加的内核启动参数,比如设置分辨率、静默启动。GRUB_GFXMODE:图形模式分辨率,改成1920x1080可以解决开机画面模糊的问题。GRUB_THEME:指定主题文件路径,配合主题包使用。
修改完文件后,记住一条命令让配置生效:
sudo update-grub
如果你用的是 RHEL 系(CentOS、Rocky Linux 等),命令是 sudo grub2-mkconfig -o /boot/grub2/grub.cfg,这是两个体系的区别,很多新手卡在这一步,以为配置没生效。
grub2 配置默认启动项和开机等待时间
用数字选择启动项:简单直接但容易错
运行 grep menuentry /boot/grub/grub.cfg 能看到当前所有菜单项,从 0 开始编号,比如输出结果里有 Windows 10 在第 4 行,那 GRUB_DEFAULT=4 就能跳转过去。
这种方式的缺点很明显:内核更新后序号会变,比如你现在 Ubuntu 是第 0 项,升级内核后旧内核还在,新内核变成第 0 项,你的数字就指到旧内核上去了,所以数字只适合临时用。
用菜单名选择启动项:稳定但长名字难写
直接用菜单项名称,
GRUB_DEFAULT="Advanced options for Ubuntu>Ubuntu, with Linux 6.8.0-generic"
这里用 > 连接子菜单路径,名称里包含内核版本,未来内核一升级,这个配置就失效了,每个内核大版本都去改一遍,纯属折腾。
最省心的做法:子菜单里的第一个内核

行业共识认为,多数用户只是想默认进入当前最新内核,同时保留旧内核作为保险,这时可以写成:
GRUB_DEFAULT="Advanced options for Ubuntu>Advanced options for Ubuntu>Ubuntu, with Linux"
注意这个技巧:用不带版本号的内核名称前缀,grub2 会自动匹配列表里第一个符合条件的项,这样每次内核更新后,它都能自动指向最新内核的子菜单项,不用反复调整。
把 Windows 设为默认启动项
装双系统的用户经常要改这个,先查看菜单项:
grep -i windows /boot/grub/grub.cfg
得到类似 Windows Boot Manager (on /dev/nvme0n1p1) 这样的完整名称,然后写成:
GRUB_DEFAULT="Windows Boot Manager (on /dev/nvme0n1p1)"
注意保留原有空格和括号,也可以直接设置 GRUB_DEFAULT=saved 配合 GRUB_SAVEDEFAULT=true,让 grub2 记住你上次启动的是哪个系统,下次自动选中,这个功能很实用,相当一部分人不知道。
调整倒计时:快启动还是慢思考?
- 单系统用户:
GRUB_TIMEOUT=0,开机直接进系统,不显示菜单。 - 双系统用户:
GRUB_TIMEOUT=5或者10,给切换留一点时间。 - 如果你希望按下某个按键后等待更久,可以用
GRUB_TIMEOUT_STYLE=menu配合GRUB_TIMEOUT=30。hidden模式会在倒计时结束后自动启动,按键才能显示菜单。
grub2 修复引导的常见场景与命令
开机直接进 grub 命令行,看不到菜单
这通常意味着 grub.cfg 丢失或者损坏,最典型的解决办法是在 grub> 命令行里手动引导一次系统,然后进入系统重新生成配置。
操作步骤如下:
- 在
grub>提示符下输入ls,会列出所有磁盘分区,(hd0,gpt1)、(hd0,gpt2)。 - 用
ls (hd0,gpt2)/查看分区内容,找到包含/boot或 目录的那个分区。 - 如果是 UEFI 引导,需要先执行
set root=(hd0,gpt2)(这里换成实际分区),再insmod normal和normal尝试调出菜单。 - 如果不行,手动加载内核和 initrd:
linux /vmlinuz-<版本号> root=/dev/nvme0n1p2 initrd /initrd.img-<版本号> boot
进去之后立即执行 sudo update-grub 修复。
更新内核后进不去系统

这类故障多数是 /boot 分区空间写满了,内核更新时旧内核没清掉,新内核写到一半失败,导致 grub2 找不到可引导的内核。
解决思路是腾出空间,然后重新生成 grub.cfg,进入恢复模式或者用 Live USB 启动,挂载根分区后执行:
sudo apt remove --purge linux-image-旧版本号 sudo update-grub
为了避免再犯,建议定期清理旧内核,或者直接设置自动保留最近 2 个版本,Debian/Ubuntu 可以安装 byobu 家族的工具,或者手动配置 apt autoclean 的定时任务。
硬盘克隆或更换分区后引导失败
你用了 dd 或 DiskGenius 把系统盘克隆到新硬盘,结果 grub2 找不到原来的 UUID,这属于路径识别问题,检查 /boot/grub/grub.cfg 里的 search --no-floppy --fs-uuid --set=root 后面跟的 UUID 是否和实际分区一致。
如果发现不一致,用 blkid /dev/sdXY 查出新 UUID,然后更新 /etc/default/grub 里涉及到的根目录配置,或者重装 grub2:
sudo grub-install /dev/sdX sudo update-grub
业内专家指出,克隆系统后重新安装 grub 到目标磁盘是最稳妥的方案,比手动改 UUID 省心得多。
grub2 主题设置与自定义引导界面
用现成的 grub2 主题,二十分钟换脸
网上有大量开源 grub2 主题,Vimix、Stylish、Fallout 等,下载后是一个解压文件夹,里面包含 theme.txt 和一堆背景图、字体文件,安装步骤很固定:
- 把主题文件夹放到
/boot/grub/themes/下,权限 755。 - 在
/etc/default/grub里加上一行:
GRUB_THEME="/boot/grub/themes/你的主题目录/theme.txt"
- 执行
sudo update-grub。
注意:设置了 GRUB_THEME 后,GRUB_TIMEOUT_STYLE 的 hidden 模式会失效,因为主题自带图形界面,想隐藏菜单得另外调整主题配置里的 desktop-image 和组件显示。
调整 grub2 启动画面分辨率
很多人改了主题还是模糊,原因是 grub2 默认的图形模式分辨率很低,在 /etc/default/grub 里加一行:
GRUB_GFXMODE=1920x1080
然后执行 update-grub,如果配置后没有生效,可能是显卡不支持该分辨率,可以用 GRUB_GFXPAYLOAD_LINUX=keep 让内核沿用 grub 的分辨率,还有一个小细节:GRUB_TERMINAL_OUTPUT=console

被取消注释了,图形界面会被强制转为字符终端,那么设啥分辨率都没用。
自定义菜单背景图和字体
不装整个主题,单纯换背景也可以,你只需要准备一张 PNG 格式图片,放进 /boot/grub/ 目录,然后在 /etc/default/grub 里添加:
GRUB_BACKGROUND=/_placeholder.png
图片大小建议控制在 1MB 以内,分辨率匹配你的屏幕,如果图片过大或者格式不支持,grub2 会静默忽略,直接使用默认黑底白字界面,字体方面,默认的 unifont 够用,不用去折腾。
给 grub2 配置做一个备份和回滚方案
改动配置文件前,先把当前状态存个档,很多人手滑删错参数,最后只能靠 Live USB 救人,其实一条命令就能防呆:
sudo cp /etc/default/grub /etc/default/grub.bak
如果修改后出现反复重启、菜单乱码等异常,直接恢复备份:
sudo cp /etc/default/grub.bak /etc/default/grub sudo update-grub
grub.cfg 本身也建议备份一份,因为你可能误执行了 grub2-mkconfig 覆盖掉原本能用的配置,把当前正常启动的 grub.cfg 复制到一个不会被系统自动扫描的目录,/root/grub.cfg.bak,这是最后一道安全网。
grub2 配置的常见问题
问:grub2 和 grub legacy 的命令有哪些不一样?
grub legacy 用 root (hd0,0)、kernel /vmlinuz 这种写法,grub2 用 set root=(hd0,gpt1)、linux /vmlinuz(注意是 linux 而不是 kernel),grub2 还支持模块动态加载,insmod normal、insmod search,老版本里这些功能都是内置的,如果你在网上搜到老教程,看清命令格式再抄。
问:GRUB_TIMEOUT 改成 0 之后怎么再进入 grub 菜单?
开机时按住 Shift 键(UEFI 模式)或者狂按 Esc 键(BIOS 模式),可以强制显示菜单并暂停倒计时,如果你的主板启动太快,看不到按键提示,可以先把 GRUB_TIMEOUT_STYLE=menu 和 GRUB_TIMEOUT=2 保留一两天,确认稳定后再改回 0。
问:如何把 Windows 的启动项移到菜单最前面?
直接编辑 /etc/grub.d/ 目录下的脚本排序,30_os-prober 负责扫描 Windows,10_linux 负责当前 Linux,手动调整可能导致系统更新后失效,更稳妥的办法是用 GRUB_DEFAULT 指定 Windows 名称来达到默认选中效果,而不是强行改菜单顺序。
