为win10重装EFI引导加载器
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)?