GPT/EFI下Centos 7/windows 10用GRUB双启动配置

情况说明

原本安装了 UbuntuWindows 10 双系统,通过 UEFI 启动,并使用 GRUB 来引导。
然后,我要把Ubuntu换成CentOS 7,覆盖Ubuntu的分区安装了 CentOS 7
结果装完一启动,发现 Windows 10 不见了……
后来想了想,应该是在分区的时候把原本的 EFI 系统分区删了,导致新的 EFI分区里没有 Windows 记录的原因。
于是就开始了漫长的修复过程。

制作 Windows 启动盘

首先我们要知道是 EFI 下的 Microsoft 记录缺失导致的启动失败,这个过程可以从 CentOS 7 里面去找 /boot/efi/ 路径,查看是否存在 Microsoft 文件夹。如果的确缺失的话,就需要重做安装盘 / PE 盘来提供一个 Windows 环境。

具体怎么做安装盘就不说了,只是简单的把Windows 10的镜像iso文件用Rufus/etcher或者其他工具写入U盘就可以。

修复 Win 10 EFI 分区

开机启动盘选择U盘,使用 Win10 安装盘启动。
进入界面后按 Shift + F10 进入命令提示符,输入 diskpart 运行磁盘程序。

注意:
如果Shift + F10不起作用,可以到BIOS中设置功能键作为功能键使用,而不是作为启动过程中的快捷键使用。

将原 Windows 10 的系统盘挂为 C:/,将目标 EFI 分区挂为 Q:/

diskpart 常用命令:

  • list disk 查看磁盘列表
  • select disk [num] 选择磁盘
  • list partition 查看选定的磁盘分区
  • select partition [num] 选择分区
  • assign letter = [letter] 挂载选定的分区到目标字母下
  • remove letter = [letter] 从目标字母下卸载分区

分配好盘符后,输入 exit 退出 diskpart 程序,分别切换进入C:\Q:确认分区选择的是正确的。

复制 Windows 10EFI 分区文件到目标 EFI 分区:

1
bcdboot c:\windows /s q: /f uefi /l zh-cn

重启机器;

就可以在 UEFI 启动项中找到 Windows Boot Manager 了。

更新 Grub

找到 Windows 10EFI 的引导后,我希望通过 CentOS 7 来引导 Windows 10,需要更新 Grub

1
2
3
# run following command as root user
root@localhost # cp /boot/efi/EFI/centos/grub.cfg /boot/efi/EFI/grub.cfg.orig
root@localhost # grub2-mkconfig -o /boot/efi/EFI/centos/grub.cfg

要确保你使用 EFI 模式启动,否则是 /boot/grub2/grub.cfg 文件。
若需要更多的 Grub 使用信息,请参考官方网站。

重启计算机后,就能够通过 Grub 来引导系统了。

删除无用的EFI启动项Ubuntu

  1. 启动CentOS 7,以root用户登录进入;

  2. 打开终端,输入命令:

    1
    root@localhost # efibootmgr

    可以看到如下输出:

    1
    2
    3
    4
    5
    6
    BootCurrent: 0002
    Timeout: 2 seconds
    BootOrder: 0002,0001,000
    Boot0001* Ubuntu
    Boot0002* CentOS
    Boot0003* Windows Boot Manager
  3. 删掉Ubuntu对应的Boot0001

    1
    root@localhost # efibootmgr -b 1 -B

修正Windows 10时间不正确问题

设置Windows 10时钟为Universal Time

未确认是否可以行.

更改注册表:

  1. 打开开始菜单左侧的搜索界面,输入regedit

  2. 以管理员权限运行regedit,进入注册表编辑程序;

  3. 进入如下键值路径:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\TimeZoneInformation

hkey_01

  1. 鼠标右键点击左边键值目录,选择新建

  2. 选择:DWORD (32-bit Value)

hkey_02

  1. 命名这个DWORD键为: RealTimeIsUniversal

  2. 鼠标左键双击RealTimeIsUniversal,修改值为:1

hkey_04

  1. 重启计算机,进入非Windows操作系统。

  2. 再次重启进入Windows,时间应该正确了。