Ubuntu+Windows双系统:解决GRUB不显示Windows启动项、一闪而过问题

Ubuntu+Windows双系统:解决GRUB菜单一闪而过、不显示Windows启动项

很多用户在安装Ubuntu和Windows双系统后,会遇到两个典型问题:

  1. 开机GRUB菜单一闪而过,来不及选择系统,直接进入Ubuntu;
  2. 即使调出GRUB菜单,也看不到Windows的启动选项,无法进入Windows系统。

本文以Ubuntu 24.04系统为例,详细讲解从排查到彻底解决这两个问题的完整步骤,同时附上常见报错分析、一键修复脚本,以及极端情况的Live USB救援方案,帮助双系统用户顺利切换系统、解决引导故障。

一、问题分析

1. 菜单一闪而过的原因

GRUB默认的配置中,部分版本会设置GRUB_TIMEOUT=0GRUB_TIMEOUT_STYLE=hidden,导致开机菜单被隐藏或停留时间极短,用户来不及操作就直接进入默认系统(通常是Ubuntu)。

2. 不显示Windows启动项的原因

Ubuntu的GRUB配置中,默认禁用了os-prober工具,该工具用于探测系统中其他可引导的操作系统(如Windows),因此GRUB无法识别并添加Windows启动项,进而无法切换到Windows。

二、解决步骤

全程无需修改BIOS,安全启动保持关闭即可

步骤1:临时验证Windows是否可被探测

首先在Ubuntu终端执行下面命令:

bash 复制代码
sudo os-prober

如果输出类似下面内容,说明系统已经识别到Windows:

bash 复制代码
/dev/nvme0n1p1@/EFI/Microsoft/Boot/bootmgfw.efi:Windows Boot Manager:Windows:efi

步骤2:修改GRUB配置文件,开启菜单并启用os-prober

打开GRUB配置文件:

bash 复制代码
sudo nano /etc/default/grub

进入文件后,修改三项配置,直接复制粘贴下面三行替换原有对应行:

bash 复制代码
GRUB_TIMEOUT=10
GRUB_TIMEOUT_STYLE=menu
GRUB_DISABLE_OS_PROBER=false

配置说明:

  • GRUB_TIMEOUT=10:开机菜单停留10秒,足够选择系统
  • GRUB_TIMEOUT_STYLE=menu:强制显示GRUB菜单,不再隐藏
  • GRUB_DISABLE_OS_PROBER=false:允许GRUB自动探测Windows系统

编辑完成:

Ctrl+X → 按 Y → 回车 保存退出。

步骤3:更新GRUB配置生效

bash 复制代码
sudo update-grub

正常会输出类似:

复制代码
Found Windows Boot Manager on /dev/nvme0n1p1@/EFI/Microsoft/Boot/bootmgfw.efi
Adding boot menu entry for UEFI Firmware Settings ...
done

步骤4:重启验证

bash 复制代码
reboot

开机就能看到GRUB菜单停留10秒,选项如下:

  • Ubuntu
  • Advanced options for Ubuntu
  • Windows Boot Manager

上下键选中 Windows 回车即可进入。

三、进阶:设置默认启动系统

  1. 先记住GRUB菜单序号(从0开始)

    一般顺序:

    0:Ubuntu

    1:高级选项

    2:Windows Boot Manager

  2. 再次打开配置文件

bash 复制代码
sudo nano /etc/default/grub
  1. 修改默认项
bash 复制代码
GRUB_DEFAULT=saved

改成(Windows是第2项就写2):

bash 复制代码
GRUB_DEFAULT=2
  1. 保存并更新
bash 复制代码
sudo update-grub

重启后默认直接进Windows。

四、常见报错日志分析与解决方案

报错1

bash 复制代码
Warning: os-prober will not be executed to detect other bootable partitions

原因:禁用了系统探测功能。

解决

  1. 编辑配置
bash 复制代码
sudo nano /etc/default/grub
  1. 确保是下面这行(去掉前面#号)
bash 复制代码
GRUB_DISABLE_OS_PROBER=false
  1. 更新配置
bash 复制代码
sudo update-grub

报错2:执行 os-prober 无任何输出

原因

  • Windows EFI分区未挂载
  • Ubuntu和Windows引导模式一个UEFI、一个Legacy

解决

bash 复制代码
ls /sys/firmware/efi
lsblk
sudo mkdir -p /mnt/efi
sudo mount /dev/nvme0n1p1 /mnt/efi
sudo os-prober

报错3:改完配置仍不显示Windows

bash 复制代码
sudo grub-mkconfig -o /boot/grub/grub.cfg

重启测试,不行就看后面Live USB救援方案。

五、一键修复脚本(懒人必备)

新建 fix_grub.sh,粘贴以下全部代码:

bash 复制代码
#!/bin/bash
# 备份原始GRUB配置文件,防止修改错误无法恢复
sudo cp /etc/default/grub /etc/default/grub.bak
echo "已备份原始GRUB配置文件为/etc/default/grub.bak"

# 自动修改GRUB配置文件:启用os-prober、设置菜单停留10秒、强制显示菜单
sudo sed -i 's/^#GRUB_DISABLE_OS_PROBER=false/GRUB_DISABLE_OS_PROBER=false/' /etc/default/grub
sudo sed -i 's/GRUB_TIMEOUT=.*/GRUB_TIMEOUT=10/' /etc/default/grub
sudo sed -i 's/GRUB_TIMEOUT_STYLE=.*/GRUB_TIMEOUT_STYLE=menu/' /etc/default/grub
echo "已修改GRUB配置文件,启用os-prober并设置菜单停留时间为10秒"

# 更新GRUB配置,使修改生效
sudo update-grub
echo "GRUB配置已更新,重启电脑即可生效"

执行命令:

bash 复制代码
chmod +x fix_grub.sh
sudo ./fix_grub.sh
sudo reboot

六、极端情况:修改GRUB后系统无法启动(Live USB救援)

前提准备

  1. 准备和你同版本的Ubuntu镜像,制作UEFI模式U盘启动盘
  2. 插入故障电脑,U盘启动,选择 Try Ubuntu without installing

救援操作

进入试用桌面,打开终端依次执行:

bash 复制代码
lsblk
sudo mount /dev/nvme0n1p5 /mnt
sudo mount /dev/nvme0n1p1 /mnt/boot/efi

sudo mount --bind /dev /mnt/dev
sudo mount --bind /proc /mnt/proc
sudo mount --bind /sys /mnt/sys

sudo chroot /mnt

恢复原有配置:

bash 复制代码
cp /etc/default/grub.bak /etc/default/grub

重新更新引导:

bash 复制代码
sudo update-grub
sudo grub-install /dev/nvme0n1

退出并重启:

bash 复制代码
exit
sudo umount /mnt/boot/efi
sudo umount /mnt/dev
sudo umount /mnt/proc
sudo umount /mnt/sys
sudo umount /mnt
sudo reboot

拔掉U盘,正常双系统恢复。

七、总结

  1. 菜单一闪而过:修改 GRUB_TIMEOUTGRUB_TIMEOUT_STYLE
  2. 不显示Windows:开启 GRUB_DISABLE_OS_PROBER=falseupdate-grub
  3. 改坏引导进不去系统:用Ubuntu Live USB chroot救援恢复

补充说明

  • 适配 Ubuntu 20.04 / 22.04 / 24.04 所有版本
  • 每次改完grub配置必须执行 sudo update-grub 才生效
  • 双系统建议安全启动保持关闭,不要随意进BIOS改动
  • 修改grub前最好备份配置文件,防止引导损坏
相关推荐
深念Y2 小时前
踩坑实录:把 Windows 默认 PowerShell 换成 7.x 到底有多坑?一条龙解决指南
windows·乱码·bug·控制台·powershell·管道·流式
夜猫逐梦2 小时前
[开发经验] DLL注入中控制台窗口无法关闭的排查与修复
c++·windows·控制台
无限进步_2 小时前
C++ 多态机制完全解析:从虚函数重写到动态绑定原理
java·c语言·jvm·数据结构·c++·windows·后端
天都3572 小时前
青少年ctf 日志排查 复盘
windows·网络安全·应急响应
Yupureki2 小时前
《Linux网络编程》5.HTTPS协议
linux·网络·https
搬砖的小码农_Sky3 小时前
Linux操作系统:Ubuntu和Debian的区别
linux·ubuntu·debian
江湖有缘3 小时前
基于Ubuntu系统Docker部署Note Mark:从安装到配置全流程
linux·ubuntu·docker
前端之虎陈随易4 小时前
2年没用Nodejs了,Bun很香
linux·前端·javascript·vue.js·typescript
宁小法4 小时前
Linux批量删除文件
linux·服务器·批量·删除文件