Ubuntu系统下GRUB默认启动项的修改与配置方法

10 次阅读

GRUB是Ubuntu系统启动过程中负责加载操作系统的重要引导程序。当电脑中同时安装Ubuntu、Windows或多个Linux发行版时,GRUB启动菜单通常会列出多个可选系统。如果不进行配置,系统会按照默认规则自动选择启动项。对于需要频繁进入某个系统、指定特定内核版本启动的用户,修改GRUB默认启动项可以明显提高使用效率。

一、GRUB默认启动项的工作原理

Ubuntu中的GRUB配置通常涉及两个关键文件:

/etc/default/grub
/boot/grub/grub.cfg

其中,/etc/default/grub主要保存用户可以调整的GRUB参数,例如默认启动项、菜单等待时间等。

而/boot/grub/grub.cfg属于GRUB实际使用的生成配置文件,通常不建议直接手工修改。修改/etc/default/grub后,需要通过update-grub重新生成配置。

查看当前GRUB配置可以执行:

Bash
cat /etc/default/grub

常见内容类似:

Bash
GRUB_DEFAULT=0
GRUB_TIMEOUT_STYLE=menu
GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
GRUB_CMDLINE_LINUX=""

其中最值得关注的是:

Bash
GRUB_DEFAULT=0

这里的0代表GRUB菜单中的第一个启动项。GRUB通常从0开始计算菜单索引,因此:

0 → 第一个启动项
1 → 第二个启动项
2 → 第三个启动项

如果默认启动项排在第三位,可以将其设置为:

Bash
GRUB_DEFAULT=2

不过,直接使用数字并不是最稳妥的方法,因为系统内核更新、Windows启动项变化或者GRUB菜单结构调整后,启动项顺序可能发生变化。

二、修改GRUB默认启动项的基本方法

修改Ubuntu默认启动项之前,建议先备份配置文件:

Bash
sudo cp /etc/default/grub /etc/default/grub.bak

然后使用编辑器打开配置:

Bash
sudo nano /etc/default/grub

找到:

Bash
GRUB_DEFAULT=0

根据实际需求进行修改。

例如希望默认启动第二个菜单项:

Bash
GRUB_DEFAULT=1

保存后执行:

Bash
sudo update-grub

如果终端出现类似:

Generating grub configuration file ...
Found linux image: ...
Found initrd image: ...
Found Windows Boot Manager ...
done

说明GRUB配置已经重新生成。

随后重启:

Bash
sudo reboot

进入GRUB菜单后,系统会按照新的默认启动项进行倒计时,并自动启动指定系统。

三、推荐使用菜单名称指定默认启动项

对于双系统或者多系统环境,仅使用数字索引存在一定风险。更稳定的方式是直接指定GRUB菜单中的启动项名称。

首先查看GRUB菜单中的实际项目:

Bash
grep "^menuentry" /boot/grub/grub.cfg

也可以使用:

Bash
grep "menuentry " /boot/grub/grub.cfg

可能看到类似结果:

menuentry 'Ubuntu' ...
menuentry 'Advanced options for Ubuntu' ...
menuentry 'Windows Boot Manager (on /dev/nvme0n1p1)' ...

如果希望默认启动Windows,可以将:

Bash
GRUB_DEFAULT=0

修改为对应的菜单名称,例如:

Bash
GRUB_DEFAULT="Windows Boot Manager (on /dev/nvme0n1p1)"

然后执行:

Bash
sudo update-grub

这种方式比固定数字索引更容易理解,也能降低菜单顺序发生变化带来的影响。

需要注意的是,菜单名称必须与GRUB实际生成的名称匹配。如果名称中包含空格或特殊字符,建议使用双引号包裹。

四、设置默认启动Ubuntu的指定内核版本

除了选择Ubuntu和Windows这样的操作系统之外,GRUB还可以控制Ubuntu默认启动哪个Linux内核。

查看当前安装的内核:

Bash
dpkg -l | grep linux-image

也可以查看:

Bash
ls /boot/vmlinuz-*

例如系统中可能存在:

/boot/vmlinuz-6.8.0-40-generic
/boot/vmlinuz-6.8.0-41-generic
/boot/vmlinuz-6.8.0-42-generic

GRUB菜单通常会提供:

Ubuntu
Advanced options for Ubuntu

进入Advanced options for Ubuntu后,可以看到不同内核版本及恢复模式。

如果需要固定使用某一个内核,可以通过嵌套菜单路径指定启动项。例如:

Bash
GRUB_DEFAULT="Advanced options for Ubuntu>Ubuntu, with Linux 6.8.0-41-generic"

修改后执行:

Bash
sudo update-grub

这样GRUB启动时会选择指定的内核。

不过,生产环境中不建议长期依赖已经停止获得安全更新的旧内核。固定内核通常更适合驱动兼容性测试、内核升级验证或临时故障排查。

五、使用saved方式记住上一次启动项

如果希望GRUB记住上一次手动选择的操作系统,可以使用:

Bash
GRUB_DEFAULT=saved
GRUB_SAVEDEFAULT=true

编辑:

Bash
sudo nano /etc/default/grub

加入或修改:

Bash
GRUB_DEFAULT=saved
GRUB_SAVEDEFAULT=true

然后:

Bash
sudo update-grub

以后从GRUB菜单中手动选择一个系统后,GRUB可以将该选择作为后续启动的默认项目。

这种方式比较适合双系统用户,例如平时使用Ubuntu,但偶尔需要进入Windows。选择Windows后,下一次启动仍可能优先进入Windows,直到再次选择其他启动项。

如果只是想固定使用某一个系统,则直接指定菜单名称通常更加直观。

六、修改GRUB启动等待时间

GRUB默认启动项与等待时间通常需要配合调整。

例如:

Bash
GRUB_TIMEOUT=5

表示GRUB菜单显示后等待5秒。

如果希望等待10秒:

Bash
GRUB_TIMEOUT=10

修改后:

Bash
sudo update-grub

如果不希望显示启动菜单,可以使用:

Bash
GRUB_TIMEOUT_STYLE=hidden
GRUB_TIMEOUT=0

但对于双系统环境,不建议盲目隐藏GRUB菜单。否则需要临时选择Windows、旧内核或恢复模式时,操作会更加麻烦。

日常双系统电脑可以考虑:

Bash
GRUB_TIMEOUT_STYLE=menu
GRUB_TIMEOUT=5

这样既能看到菜单,又不会让启动过程等待太久。

七、Ubuntu双系统中将Windows设置为默认启动项

Ubuntu与Windows双系统是修改GRUB默认启动项最常见的场景。

首先查看GRUB是否检测到Windows:

Bash
grep -i "Windows" /boot/grub/grub.cfg

如果能够找到类似:

Windows Boot Manager

说明Windows启动项已经被GRUB识别。

然后查看完整菜单:

Bash
grep "^menuentry" /boot/grub/grub.cfg

找到Windows对应的菜单名称。

例如:

menuentry 'Ubuntu'
menuentry 'Advanced options for Ubuntu'
menuentry 'Windows Boot Manager (on /dev/nvme0n1p1)'

修改:

Bash
sudo nano /etc/default/grub

设置:

Bash
GRUB_DEFAULT="Windows Boot Manager (on /dev/nvme0n1p1)"

保存并执行:

Bash
sudo update-grub

重启后,Windows就会成为默认启动项。

需要注意,Windows的设备名称可能因硬盘、分区布局和安装方式不同而发生变化,因此不要直接照搬示例中的/dev/nvme0n1p1。

八、为什么修改GRUB_DEFAULT后没有生效

实际操作中,最常见的问题就是修改了:

Bash
GRUB_DEFAULT

但重启后仍然进入原来的系统。

首先检查配置:

Bash
grep "^GRUB_DEFAULT" /etc/default/grub

确认修改是否保存。

然后重新生成GRUB:

Bash
sudo update-grub

如果只修改了配置文件,却没有执行update-grub,/boot/grub/grub.cfg不会立即同步变化。

其次检查实际生成的配置:

Bash
grep -E "^menuentry|^submenu" /boot/grub/grub.cfg

确认目标启动项是否存在。

如果使用的是菜单名称,还要注意名称是否完全匹配。例如:

Bash
GRUB_DEFAULT="Windows Boot Manager"

与实际:

Windows Boot Manager (on /dev/nvme0n1p1)

并不是同一个字符串。

此外,如果配置采用:

Bash
GRUB_DEFAULT=saved

还需要考虑GRUB保存的启动项状态。此时固定数字索引与saved机制的行为不同,不应混合配置后再根据单次启动结果判断。

九、GRUB配置修改后如何验证

修改完成后,可以从多个角度检查。

首先检查默认参数:

Bash
grep "^GRUB_DEFAULT" /etc/default/grub

检查生成配置:

Bash
grep "menuentry" /boot/grub/grub.cfg

查看GRUB相关版本信息:

Bash
grub-install --version

也可以直接查看:

Bash
sudo grub-mkconfig -o /boot/grub/grub.cfg

在Ubuntu中,更常用的方式仍然是:

Bash
sudo update-grub

如果系统中安装了多个内核,还可以检查:

Bash
ls /boot/

确认目标内核、初始化镜像等文件是否存在。

十、不要直接修改grub.cfg

很多初学者会直接执行:

Bash
sudo nano /boot/grub/grub.cfg

然后修改menuentry。

虽然技术上可以编辑这个文件,但通常不推荐这样做。

grub.cfg属于自动生成的配置文件。执行:

Bash
sudo update-grub

或者相关系统更新操作后,手工修改的内容可能被重新生成的配置覆盖。

更合理的管理方式是:

/etc/default/grub
        ↓
修改GRUB参数
        ↓
sudo update-grub
        ↓
/boot/grub/grub.cfg
        ↓
GRUB启动菜单

如果需要进行更加复杂的GRUB定制,可以结合/etc/grub.d/中的脚本进行配置,而不是直接编辑生成文件。

十一、常用GRUB参数说明

常见参数可以整理如下:

参数作用示例
GRUB_DEFAULT设置默认启动项GRUB_DEFAULT=0
GRUB_TIMEOUT设置菜单等待时间GRUB_TIMEOUT=5
GRUB_TIMEOUT_STYLE控制菜单显示方式GRUB_TIMEOUT_STYLE=menu
GRUB_CMDLINE_LINUX_DEFAULT设置默认内核启动参数GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
GRUB_CMDLINE_LINUX设置通用内核启动参数GRUB_CMDLINE_LINUX=""
GRUB_SAVEDEFAULT是否保存用户选择的启动项GRUB_SAVEDEFAULT=true

修改这些参数时,需要结合实际需求,避免同时修改多个不相关配置导致问题难以定位。

十二、GRUB默认启动项修改的安全建议

修改GRUB虽然操作简单,但它位于系统启动链路的重要位置,因此建议先备份:

Bash
sudo cp /etc/default/grub /etc/default/grub.bak

修改后立即生成配置:

Bash
sudo update-grub

确认没有错误信息后再重启。

如果修改的是默认内核,建议保留至少一个可以正常启动的备用内核。Ubuntu内核升级过程中通常会保留旧版本,这对于启动故障排查非常有帮助。

如果系统出现无法正常启动的情况,可以在GRUB菜单中尝试:

Advanced options for Ubuntu

然后选择其他可用内核进入系统,再检查GRUB配置。

对于双系统用户,还应确认UEFI启动模式、EFI系统分区以及Windows Boot Manager均处于正常状态。GRUB默认启动项配置本身无法修复EFI分区损坏或Windows引导文件缺失等底层问题。

十三、一个实用的双系统配置示例

假设电脑安装了Ubuntu和Windows,希望默认启动Windows,同时保留5秒GRUB菜单。

编辑:

Bash
sudo nano /etc/default/grub

配置可以类似:

Bash
GRUB_DEFAULT="Windows Boot Manager (on /dev/nvme0n1p1)"
GRUB_TIMEOUT_STYLE=menu
GRUB_TIMEOUT=5
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
GRUB_CMDLINE_LINUX=""

保存后:

Bash
sudo update-grub

检查Windows启动项:

Bash
grep -i "Windows Boot Manager" /boot/grub/grub.cfg

确认没有错误后重启:

Bash
sudo reboot

如果GRUB菜单中的Windows名称与配置文件中的名称不同,应以实际生成的menuentry名称为准。

十四、常见问题快速排查

修改GRUB_DEFAULT后没有变化怎么办?

确认修改的是:

/etc/default/grub

而不是其他文件,并且执行了:

Bash
sudo update-grub

GRUB菜单中找不到Windows怎么办?

可以检查EFI启动项:

Bash
sudo efibootmgr -v

同时确认Windows EFI文件和EFI系统分区是否正常。若只是GRUB没有检测到Windows,也需要进一步检查GRUB的操作系统探测配置。

数字索引为什么容易失效?

因为内核升级、菜单新增或删除都可能改变启动项位置。例如原本Windows是第3项,内核升级后新增了多个菜单项,Windows的位置可能发生变化。

应该使用数字还是菜单名称?

临时调整可以使用数字索引;需要长期维护时,可以根据实际菜单结构使用明确的菜单名称或saved机制。

修改配置后是否需要重装GRUB?

通常不需要。修改/etc/default/grub后执行:

Bash
sudo update-grub

即可重新生成配置。只有GRUB本身损坏、引导程序缺失或EFI引导存在问题时,才需要进一步处理GRUB安装。

合理配置GRUB默认启动项,可以让Ubuntu双系统、多个Linux内核以及Windows启动环境更加符合日常使用习惯。实际操作时,核心流程可以概括为:先查看当前菜单结构,再修改/etc/default/grub中的GRUB_DEFAULT,随后执行sudo update-grub生成新配置,最后通过重启验证结果。对于长期使用的系统,优先采用清晰、可维护的配置方式,并保留可用的备用内核,有助于降低启动配置调整带来的风险。