win10原来的bootloader装在了淘汰的机械硬盘EFI分区上,拆掉后无法引导也检测不到。本文给出了仅重装bootloader的方法,避免了重装整个系统。

起因

之前装win10时主系统是机械硬盘上的linux mint,已有EFI分区,把win装到nvme固态(nvme0)上时windows安装程序自动选择了已有的EFI分区。现在主系统是ubuntu 22.04,装在新的2T固态(nvme1)上,也有EFI分区。拆掉机械硬盘后win10无法引导也检测不到。

在nvme0建立EFI分区

接上旧硬盘,引导到win10。如果已经格式化则用win安装盘引导->疑难解答->高级选项->命令提示符,用diskpart完成等效操作。

开始->磁盘管理。

右键win这块硬盘最后的一个分区(如C盘),压缩卷,压缩空间200(MB)。

注:EFI分区并不要求为第一分区,只要在前2T以内即可。win10实际占用26.8MB,新建200MB够用了,ubuntu默认建立的是512MB。

右键新建的分区,新建简单卷,格式FAT32。完成后会自动挂载。

安装win10 bootloader

以管理员权限打开CMD。

1
bcdboot C:\Windows /s D: /f uefi

注:这里假定win10装在C盘,而EFI分区挂载为D盘。

开始->磁盘管理。右键选中EFI分区->更改驱动器号和路径->选中D:然后删除。

fdisk修改分区类型(可选)

现在已经可以正常使用了,但在ubuntu下用os-prober仍然无法识别,虽然可以通过修改/etc/grub.d/40_custom手动添加,但不够优雅。

原因在于新建的EFI分区其类型为Microsoft basic data,应该是EFI System

打印存储设备列表:

1
sudo blkid

已知EFI位于win的那块nvme固态的第三分区,大小为200(MB),可判断/dev/nvme0n1p3为目标分区。

1
sudo fdisk /dev/nvme0n1

注:这里指定的是硬盘,不是分区,不要带上p3

t选择修改分区类型。

3选择第三分区。

L列出所有分区类型的编号,不同版本的fdisk编号可能会不同,保险起见建议此步别省。如无意外EFI System编号应该是1

1

w完成修改。

q退出。

执行sudo os-prober已可以见到win10被正确识别。

2.06版本后GRUB不再自动调用os-prober,所以jammy之后的系统要重新开启。

修改/etc/default/grub,在末尾添加这句:

1
GRUB_DISABLE_OS_PROBER=false

最后更新grub:

1
sudo update-grub

参考资料

What is the best way to move MBR and bootmgr to new drive (Windows 10)?