☰
双系统开机默认进Windows:GRUB引导配置详解与实操
2026/9/30 1:39:50 网站建设 项目流程

装过Windows和Ubuntu双系统的人,基本都遇到过这个场景:每次开机先出现一个紫色的GRUB菜单,默认高亮停在Ubuntu那一行,几秒倒计时结束后如果手没按键盘,机器就直接进了Linux。平时主力用Windows、Ubuntu只是偶尔跑脚本和Docker的话,这个默认行为确实恼人——手慢一次,就要多经历一轮“先进Ubuntu,再重启选Windows”的过程。这篇博文专门解决一个问题:把双系统的默认进入系统从Ubuntu改成Windows,同时把背后的引导原理、配置文件关系、常见坑一起讲清楚。不管你是刚装好双系统的新手,还是已经忍受默认项很久的老用户,看完都能自己动手改明白。

1. 为什么开机默认进的是Ubuntu?先搞懂GRUB的脾气

1.1 GRUB才是那位真正的“前台调度员”

很多人在装完双系统后会有一个误解:开机默认进Ubuntu,是不是Windows的引导坏了,或者Windows被Ubuntu“抢”走了?其实不是。UEFI主板启动时,固件会按照启动顺序去找EFI分区里的引导文件,先执行的那个文件决定了你看到什么界面。Ubuntu安装器在安装时会把自己的一套引导文件写到EFI系统分区,具体路径是\EFI\ubuntu\grubx64.efi,并且把这一项注册成第一启动顺序。于是开机后固件先加载GRUB,你就看到了GRUB菜单。

Windows自己的引导文件\EFI\Microsoft\Boot\bootmgfw.efi并没有被删除,它一直完好地待在EFI分区里。GRUB菜单里的Windows条目,实际上是GRUB在启动时通过os-prober等工具扫描硬盘后,添加进来的一个“跳转项”。选择它,GRUB就会把控制权交给Windows Boot Manager,再由Windows Boot Manager完成后续启动。所以整个链条是:主板固件 → GRUB → Windows Boot Manager / Ubuntu 内核。GRUB就是这个“前台调度员”,默认进Ubuntu不是Windows坏了,只是GRUB菜单的默认项指向了Ubuntu。

搞懂这一点,后面的所有修改思路就很清晰了:既然开机首先看到的是GRUB菜单,那我们只需要告诉GRUB“倒计时结束后直接执行Windows那个条目”,问题就解决了。至于怎么告诉它,有固定编号、固定菜单标题、saved模式等多种方式,下面逐个说。

1.2 Ubuntu安装时其实帮你做了两件事

装过Ubuntu的人都知道,安装过程里有一项是“安装启动引导器”,默认是装到整个系统盘。这一步背后做了两件事:一是把GRUB写入EFI分区并设为第一启动项,二是生成一份初始的GRUB菜单配置。在这份配置里,第一个菜单项自然是Ubuntu,而默认项编号通常对应GRUB_DEFAULT=0,也就是第一个菜单项。

同时,Ubuntu会把os-prober跑一遍,扫描硬盘上有没有其他操作系统。检测到Windows后,会把Windows Boot Manager作为一个菜单项追加到GRUB菜单里,但一般排在Ubuntu后面。如果当时扫描没成功,或者像新版Ubuntu那样默认不跑os-prober,菜单里甚至可能直接没有Windows条目。这也是很多双系统用户遇到的另一个问题:不是默认进Ubuntu,而是GRUB菜单里压根找不到Windows。

这里多说一句:很多教程会让你直接改/boot/grub/grub.cfg,我不推荐这么干。grub.cfg是编译生成的最终文件,系统升级内核、重新运行update-grub时会被覆盖。正确做法是改/etc/default/grub这个配置源文件,改完执行sudo update-grub重新生成grub.cfg。只要记住这个逻辑,后面所有操作都不会乱。

1.3 我们到底要动哪些文件

双系统默认启动项的修改,核心就围绕两个文件:/etc/default/grub和/boot/grub/grub.cfg。前者是“人类写的配置文件”,后者是“机器实际读取的启动配置”。日常操作只需要编辑前者,然后通过sudo update-grub命令把配置同步到后者。

具体到配置内容,就是三个关键项:GRUB_DEFAULT(默认选择哪个菜单项)、GRUB_TIMEOUT(倒计时秒数)、GRUB_SAVEDEFAULT(是否记住上次选择)。这三个参数决定了开机时GRUB的行为。理解了它们,再去翻网上各种教程,就不会被各种互相矛盾的命令搞晕了。

2. 动手前先看清:你的GRUB菜单里Windows长什么样

2.1 从GRUB菜单里确认Windows条目的位置

改配置之前,先确认一下当前GRUB菜单里到底有哪些项、Windows条目叫什么名字、排在第几位。最直接的办法:重启电脑,在GRUB菜单出现时用方向键上下翻一遍,看看有没有类似“Windows Boot Manager (on /dev/sda1)”或“Windows UEFI bootmgfw.efi”的条目。

菜单项的排列顺序和你的分区结构有关,Windows条目前面可能还有“Advanced options for Ubuntu”这种子菜单。这里有个容易混淆的点:GRUB菜单的编号是从0开始数的,第一个可见菜单项是0,第二个是1,如果有submenu这类子菜单,它本身也算一个顶层菜单项。后面的操作里,如果你打算用“编号”来指定默认项,就必须按这个规则数清楚。

但说实话,我一般不建议用编号来指认Windows条目,因为Ubuntu内核一更新,菜单里就会多出几个带新内核版本号的条目,编号很容易错位。更稳的是用菜单标题字符串来指认,所以看清楚Windows条目的完整显示文本,比记住它是第几个更重要。

2.2 用命令把菜单项打出来,别靠肉眼记

重启时肉眼看清没问题,但更准确的做法是在Ubuntu里直接查看GRUB生成的菜单配置。打开终端,运行:

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

输出大概是这样的:

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

那么在这个例子里,“Ubuntu”是第0项,“Advanced options for Ubuntu”是第1项,“Windows Boot Manager (on /dev/sda1)”是第2项。不同机器上Windows条目的显示名可能带(on /dev/nvme0n1p1)这样的设备路径,复制完整文本时连括号一起带上就好。

这一步很重要。很多人改完配置不生效,就是因为Windows菜单项的实际显示名和自己记忆的不一致,比如少了设备路径后缀,或者把大小写写错了。GRUB对菜单标题的匹配是严格按文本来的,差一个空格都会导致匹配失败。

2.3 新版Ubuntu用户先检查os-prober开关

如果你跑完上面的grep命令,发现输出里压根没有Windows条目,那多半不是改默认项的问题,而是GRUB菜单里根本没有Windows。新版Ubuntu(22.04及之后)出于安全考虑,默认不再自动运行os-prober,而Windows条目主要就是靠os-prober扫描出来的。解决办法是在/etc/default/grub里加上一行:

GRUB_DISABLE_OS_PROBER=false

然后执行:

sudo update-grub

这样GRUB重新扫描硬盘时,就会把Windows Boot Manager加进菜单。我见过很多人卡在这一步,以为是Windows引导坏了,重装了半天系统,最后发现只是os-prober被Ubuntu默认禁用了。所以动手改默认项之前,先确认菜单里能不能看到Windows条目,这点非常关键。

3. 最直接的办法:把GRUB默认项改成Windows

3.1 编辑default配置文件,把GRUB_DEFAULT改成Windows

先打开配置文件:

sudo nano /etc/default/grub

里面会有一行:

GRUB_DEFAULT=0

这里的0代表默认启动第0个菜单项,也就是Ubuntu。要改成Windows,最稳妥的方式是直接用Windows条目的完整菜单标题:

GRUB_DEFAULT="Windows Boot Manager (on /dev/sda1)"

注意引号必须带上,因为菜单标题里有空格和括号。这个标题就从你之前grep出来的结果里复制,确保一字不差。为什么我不推荐改成数字编号?因为一旦Ubuntu内核更新,/boot目录下会多出新的内核文件,GRUB菜单前面会插入新的Ubuntu子项,Windows条目在菜单中的位置就可能从第2位变成第3位、第4位,数字就错位了。而Windows Boot Manager的标题字符串相对稳定,不容易受内核更新影响。

顺便推荐把GRUB_TIMEOUT也改一下。默认值往往是10秒,也就是开机后要傻等10秒才自动进默认项,这个时间属实有点长。改成3秒左右比较合适:

GRUB_TIMEOUT=3

如果你打算以后偶尔还要手动切到Ubuntu,3秒足够反应;如果完全不需要手动选,甚至可以改成0,但那样GRUB菜单会一闪而过,万一哪天想临时进Ubuntu,就得开机时狂按方向键,不太推荐。

3.2 更新配置并核对结果

编辑完保存退出后,一定要执行:

sudo update-grub

这一步会把/etc/default/grub里的配置重新生成到/boot/grub/grub.cfg。执行过程中能看到类似这样的提示:

Found Windows Boot Manager on /dev/sda1

如果没有这条提示,说明os-prober没扫到Windows,回到2.3处理。有这个提示后,可以再验证一下生成的配置:

sudo grep "set default" /boot/grub/grub.cfg

正常情况下输出应该是:

set default="Windows Boot Manager (on /dev/sda1)"

到这里,配置已经生效了。有人喜欢直接编辑/boot/grub/grub.cfg里的set default,我不建议,原因前面说过:这文件是自动生成的,内核一升级就被覆盖,白改。

3.3 重启验证的完整流程

改完配置后重启电脑。这一步有个小技巧:让倒计时自己走完,别在GRUB菜单里手动选择。很多人改完之后还是习惯性地抬手去按Windows那一项,结果验证的时候分不清到底是自己手选的还是配置生效了。

如果倒计时结束直接进了Windows,说明配置生效。如果还是进了Ubuntu,也别慌,按下文第五章的排查思路走一遍,大概率能找到原因。

3.4 三种常见写法怎么选

关于GRUB_DEFAULT的写法,网上能看到各种建议,这里用表格做一个对比:

写法配置示例优点缺点适用场景
数字编号法GRUB_DEFAULT=2简单直观内核更新后编号容易错位短期临时修改、菜单结构长期不变的机器
标题字符串法GRUB_DEFAULT="Windows Boot Manager (on /dev/sda1)"稳定,不受新增菜单项影响需要完整复制标题,容易输错只想固定默认Windows的用户
saved模式GRUB_DEFAULT=saved自动记住上次选择,切换方便配合GRUB_SAVEDEFAULT,否则不生效经常在Windows和Ubuntu之间来回切换的用户

如果你只是单纯想让Windows成为默认系统,标题字符串法是最直接的。如果你经常两个系统来回切,下一章要讲的saved模式会更好用。

4. 更好用的saved模式:让GRUB“记住”上次的选择

4.1 saved模式适合谁

我自己的使用场景比较典型:工作日在Ubuntu里写代码,周末打游戏、剪视频就切到Windows。这种习惯下,“固定默认Windows”其实不是最优解,因为如果哪天我需要连续几天在Ubuntu里干活,每次开机还要站在GRUB菜单前手动选一次Ubuntu,挺烦的。

saved模式解决的就是这个痛点。它的逻辑是:GRUB会记住你上一次在菜单里手动选择的是哪一项,下次开机倒计时结束时,自动进入上一次选择的那个系统。说白了就是“你上次想去哪,下次默认就还是去哪”。对于经常切换双系统的用户,这是最贴近使用习惯的方案。

但如果你用双系统的频率极低,Ubuntu可能一个月都开不了一次,那我建议还是用第三章的标题字符串法,把Windows固定死,省心。

4.2 配置saved模式的两个关键参数

在/etc/default/grub里saved模式需要两行配置配合,缺一不可:

GRUB_DEFAULT=saved GRUB_SAVEDEFAULT=true

第一行GRUB_DEFAULT=saved是告诉GRUB:默认项不要写死,去读取环境变量saved_entry。第二行GRUB_SAVEDEFAULT=true是告诉GRUB:用户每次在菜单里手动选择后,把这个选择写进saved_entry。如果不写第二行,GRUB只会读取一个固定的saved_entry,但不会自动更新它,也就是说你手动选了Windows下次会进Windows,但手动选了Ubuntu下次仍然进Windows,和预期不一致。

配置完成后同样执行:

sudo update-grub

重启后你就会发现:GRUB菜单里手动选一次Windows,下次开机默认就是Windows;再手动选一次Ubuntu,下次默认就是Ubuntu。这个体验确实舒服。

4.3 grub-set-default的妙用

既然saved模式读取的是saved_entry变量,那能不能不通过菜单手动选择,直接用命令把这个变量设成Windows?可以,grub-set-default就是干这个的:

sudo grub-set-default "Windows Boot Manager (on /dev/sda1)"

执行后,GRUB环境变量文件/boot/grub/grubenv里的saved_entry就会被改成Windows条目。查看方式:

sudo cat /boot/grub/grubenv

输出里会有一行saved_entry=...。这个命令最实用的场景是:你希望“平时默认Windows,但偶尔手动选一次Ubuntu后,下次还能回到Windows”——那就不要设置GRUB_SAVEDEFAULT=true,只用GRUB_DEFAULT=saved加grub-set-default固定saved_entry。这样用户手动选择的动作不会被记录,默认项始终是grub-set-default指定的那个。

这个思路其实是对saved模式的进阶运用。很多人用saved模式翻车,就是没搞清楚GRUB_SAVEDEFAULT和GRUB_DEFAULT=saved各自的职责,要么漏了saved,要么漏了true。把这层逻辑理顺了,saved模式在任何场景下都不会出乱子。

5. 实战中一定会踩的坑:问题排查速查

5.1 改了GRUB_DEFAULT还是进Ubuntu,怎么回事?

最典型的问题:配置文件和update-grub都做了,重启后依然进了Ubuntu。遇到这种情况,我一般按以下顺序排查:

第一步,回到Ubuntu执行:

sudo grep "set default" /boot/grub/grub.cfg

看生成后的配置里set default是不是Windows条目标题。如果还是set default="0"或者saved,说明update-grub读取的配置文件不是你以为的那个,或者配置文件里可能残留了其他设置。

第二步,检查/etc/default/grub里有没有被写成这样:

GRUB_DEFAULT=saved

saved模式会覆盖你对默认项的固定设置。如果前面按第三章的方法改成了标题字符串,但后来又用过图形工具或残留配置,很可能被改回saved。

第三步,检查标题字符是否完全匹配。比如grep输出的是'Windows Boot Manager (on /dev/sda1)',但你配置里写的是Windows Boot Manager on /dev/sda1(少了一对括号),GRUB匹配就会失败,然后退回默认第一项。仔细核对括号、空格、大小写,这是我见过最多的一种低级错误。

5.2 GRUB菜单里压根没有Windows条目,怎么办?

这个问题在2.3提到过,这里再说全面一点。菜单里没有Windows,通常有三个原因。

第一个是os-prober被禁用。新版Ubuntu默认GRUB_DISABLE_OS_PROBER未设置或为true,需要手动在/etc/default/grub里加一行GRUB_DISABLE_OS_PROBER=false,然后执行sudo update-grub。

第二个是os-prober没装。极少数精简安装的Ubuntu可能没有os-prober,执行:

sudo apt install os-prober

装完再update-grub。

第三个是Windows开启了快速启动,导致NTFS分区处于类似休眠的锁定状态,os-prober访问不了Windows分区,自然检测不到。这个在Windows里关掉“快速启动”就行:控制面板 → 电源选项 → 选择电源按钮的功能 → 取消勾选“启用快速启动”。顺便一提,双系统长期共存的话,Windows快速启动还会导致Linux下面挂在NTFS分区时出现只读、文件损坏等问题,有条件就关掉。

5.3 内核更新后默认项又失效了?

这种问题通常出现在用“数字编号法”配置的场景。Ubuntu每次升级内核,都会在GRUB菜单里增加一个新条目,比如“Ubuntu, with Linux 6.8.0-45-generic”,旧内核条目不会立刻删除。菜单项数量一多,Windows的位置就可能从第2位挪到第3位、第4位,导致原来写的GRUB_DEFAULT=2现在指向了另一个系统。

解决方法有两个:一是改回标题字符串法,Windows Boot Manager这个条目标题基本不会变,按名称匹配最稳;二是用saved模式加grub-set-default固定,因为saved_entry保存的就是菜单标题字符串,而不是编号,内核增加新条目也不影响匹配。

顺便提一句:不要为了省事去删Ubuntu旧内核。虽然sudo apt autoremove确实可以清理旧内核,但手动乱删容易把当前内核一起干掉,风险大于收益,不如把默认项配置改稳。

5.4 手滑改错GRUB配置,开机直接进不了系统怎么办?

这种问题虽然不常见,但一旦碰到就很吓人:开机后不再出现GRUB菜单,直接跳到grub>提示符或者GRUB Rescue界面。这里先说一句:别慌,系统数据基本没丢,只是引导器起不来了。

如果GRUB菜单还能显示,只是你写的默认项有问题,可以在GRUB菜单界面按e键编辑启动项,找到linux那一行,按方向键删掉错误内容,改成能启动Ubuntu的状态,然后按Ctrl+X启动。进入Ubuntu后把/etc/default/grub里的错误配置改回来,再执行update-grub即可。

如果连GRUB菜单都进不去,那就需要用Ubuntu安装U盘走Live环境修复。大致步骤如下:

  1. 插入Ubuntu安装U盘,选择“Try Ubuntu”进入Live桌面。
  2. 打开终端,查看分区:
sudo fdisk -l

找到Ubuntu根分区(通常是ext4)和EFI分区(通常是FAT32,很小,几百MB)。

  1. 把根分区挂载到/mnt,EFI分区挂载到/mnt/boot/efi:
sudo mount /dev/sdXY /mnt sudo mount /dev/sdXZ /mnt/boot/efi
  1. 绑定系统目录并chroot:
sudo mount --bind /dev /mnt/dev sudo mount --bind /proc /mnt/proc sudo mount --bind /sys /mnt/sys sudo chroot /mnt
  1. 在chroot环境里重新安装GRUB:
grub-install update-grub
  1. 退出并重启:
exit sudo reboot

整个过程不难,但对新手来说命令比较多,建议操作之前先把这段记录存到手机或另一台设备上。最关键的提醒是:别把grub-install之后的设备参数漏了,UEFI模式下通常不需要指定设备,但在一些特殊机器上可能需要写grub-install /dev/sda(其中/dev/sda是你的硬盘)。如果拿不准,先看/sys/firmware/efi目录是否存在:存在就是UEFI模式,不存在就是传统BIOS模式,命令略有差异。

5.5 进阶思路:直接从固件层指定Windows启动

如果你连GRUB菜单都不想看到,想开机直接进Windows,那其实可以绕开GRUB,在主板固件设置里把Windows Boot Manager设为第一启动项。

操作方法是:开机时按进入固件设置的热键(常见的有F2、Del、F12等,不同品牌不一样),找到启动顺序设置,通常叫“Boot Priority”或“Boot Order”,把“Windows Boot Manager”这一项调到第一位。保存重启后,开机就不会出现GRUB菜单,而是直接进Windows。

这个方案的好处是足够干净,缺点是每次想进Ubuntu时,都要在开机时按启动菜单快捷键(通常是F12或F8),从弹出的列表里选Ubuntu的GRUB项,或者在固件设置里把顺序再换回来,操作成本略高。另外需要注意:如果系统更新或某些软件重写了启动顺序,这个设置可能会被重置。适用人群是“日常只用一个系统,另一个系统一个月都用不到一次”的用户。

5.6 问题速查表

症状可能原因解决办法
改了GRUB_DEFAULT还是进Ubuntu未执行update-grub,或标题字符不匹配,或存在saved残留核对set default输出,检查标题是否完全一致,清除saved配置后重新update-grub
GRUB菜单里没有Windows条目os-prober被禁用、未安装,或Windows快速启动锁定分区设置GRUB_DISABLE_OS_PROBER=false,安装os-prober,关闭Windows快速启动
内核更新后默认项失效数字编号错位改用标题字符串法,或使用saved模式固定
开机进grub>或GRUB RescueGRUB配置写错、grub.cfg损坏用启动盘Live环境chroot,重新grub-install和update-grub
开机直接进Ubuntu,想完全跳过GRUB进WindowsGRUB作为第一启动项在固件设置里把Windows Boot Manager调到第一位

6. 踩坑记录与个人体会

6.1 我自己最稳的一套组合

说了这么多方案,最后交个底:我现在的笔记本长期保持双系统,最常用的组合是第三章和第四章的混搭——GRUB_DEFAULT="Windows Boot Manager (on /dev/sda1)"加上GRUB_TIMEOUT=3,另外顺手把GRUB_DISABLE_OS_PROBER=false开着。Windows作为默认项,平时开机基本不会在GRUB菜单这里多等;偶尔需要进Ubuntu,我就在开机时走到GRUB界面按方向键选一下,3秒的倒计时足够我反应了。

早年间我图方便,直接用GRUB_DEFAULT=2这种数字编号,结果某次Ubuntu内核更新后,菜单前头多插了两个带新内核版本的子项,Windows排到了第4位,而我的默认项还指着第2位——开机直接进了“Ubuntu高级选项”里的一个旧内核恢复模式。那次折腾了我半个多小时才反应过来是编号错位。从那以后我再也没敢用数字写法。如果你也想省心,标题字符串法或者saved模式选一个吧。

6.2 最后再分享一个细节

很多人在改完GRUB配置后,会顺手装个Grub Customizer之类的图形工具“看看效果”。这个工具本质上也是修改/etc/default/grub和grubenv,如果你刚才已经在命令行里手动配好了默认项,再用它保存一次配置,很可能会把你刚写的内容覆盖回它自己的逻辑。我遇到过几次“明明命令行配置正确,重启又变回去了”的情况,最后都是在Grub Customizer里发现的。

另外一个小技巧:GRUB菜单界面里,手动按方向键选中的项,在配置了GRUB_SAVEDEFAULT=true的情况下,会被写进/boot/grub/grubenv的saved_entry。如果你感觉默认项“自己变了”,先别急着怀疑配置写错,运行sudo cat /boot/grub/grubenv看一眼,很多答案都在那里面。这个文件是我排查启动问题时第一个要看的,比反复重启有效得多。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询