本文适用于 UEFI 启动模式下的 Windows + Linux 双系统,以 Kubuntu 为例,一次性解决三个最常见问题:

  1. 开机 GRUB 出现多余、无效的 Windows/EFI 启动项
  2. 设置默认启动系统,重启/更新内核后不失效
  3. 双系统切换后时间快/慢 8 小时

一、环境说明

  • 系统:Windows 11 + Kubuntu(适用于所有 Ubuntu 系发行版)
  • 启动方式:UEFI(非传统 Legacy BIOS)
  • 问题来源:多硬盘/多 ESP 分区导致 os-prober 扫出冗余启动项、系统时间标准不统一

二、屏蔽 GRUB 中多余的 EFI 启动项

GRUB 会自动扫描所有 EFI 分区,常会出现旧系统、无效 Windows 项,我们通过 UUID 精准屏蔽。

1. 查看要屏蔽的分区信息

终端执行,替换为你要屏蔽的分区(如 /dev/nvme0n1p1):

sudo blkid /dev/nvme0n1p1

记录下:

  • UUID=";A482-5A9F";
  • 分区路径 /dev/nvme0n1p1

2. 写入 GRUB 屏蔽规则

echo ';GRUB_OS_PROBER_SKIP_LIST=";A482-5A9F@/dev/nvme0n1p1";'; | sudo tee -a /etc/default/grub

3. 更新 GRUB 生效

sudo update-grub

执行后输出中不再出现该分区,即屏蔽成功。


三、永久设置默认启动系统(不会重启失效)

很多人设完默认系统,几次重启又跳回 Linux,原因是启动项名称不匹配

1. 获取真实 Windows 启动项名称

sudo grep -i ";menuentry.*Windows"; /boot/grub/grub.cfg

示例输出:

menuentry ';Windows Boot Manager (on /dev/nvme0n1p3)'; ...

2. 修改 GRUB 默认项

sudo nano /etc/default/grub

找到并修改为:

GRUB_DEFAULT=";Windows Boot Manager (on /dev/nvme0n1p3)";
GRUB_SAVEDEFAULT=false

3. 更新 GRUB

sudo update-grub

✅ 只要名称完全匹配,无论重启多少次、更新内核多少次,默认项永久不变


四、双系统时间快/慢 8 小时 彻底解决

根本原因

  • Windows:主板 RTC 时间 = 本地时间
  • Linux:主板 RTC 时间 = UTC 时间(国内东八区相差 8 小时)

统一方案(只选一种,不要混用)

方案 A:让 Linux 使用本地时间(最简单、推荐)

sudo timedatectl set-local-rtc 1 --adjust-system-clock
sudo hwclock --systohc
sudo timedatectl set-ntp true

执行后:

RTC in local TZ: yes

两边时间永久一致。

方案 B:让 Windows 使用 UTC 时间(更标准)

管理员打开 PowerShell:

reg add HKLM\SYSTEM\CurrentControlSet\Control\TimeZoneInformation /v RealTimeIsUniversal /t REG_DWORD /d 1 /f

然后开启 Windows 自动时间同步。


五、常见踩坑与排错

  1. 设置默认 Windows 后又变回 Linux → 启动项名称写错(nvme1n1p3 vs nvme0n1p3),必须与 grep 查到的完全一致。

  2. 屏蔽后启动项还在 → UUID 或分区路径错误,重新用 blkid 核对。

  3. 时间快了 8 小时 → 两种时间方案混用了。删除 Windows 注册表项,只保留 Linux set-local-rtc 1 即可。

  4. 更新内核后默认项失效 → 使用完整启动项名称,不要用数字序号,即可永久稳定。


六、最终效果总结

  • GRUB 启动菜单清爽,无多余 EFI/Windows 项
  • 默认启动系统固定,重启/更新内核不漂移
  • Windows 与 Linux 时间完全同步,不再 ±8 小时
  • 全程不破坏 UEFI、不删除分区、安全可靠。