kali双系统grub修复windows10引导启动项
背景
本人笔记本只有一块SSD硬盘,装有一个UEFI启动模式的win10 操作系统,经过分区后安装了KALI,结果2022年6月某次最新更新kali系统重启电脑后,grub引导界面没有了win10的启动项。
搜索过很多“双系统grub添加Windows10引导启动项”之类文章,照做总是提示不能识别efi启动分区sda1。估计是kali升级后添加的windows启动项不能再简要设置指定位置,要严格按照grub手册参数要求,$hints_string 和 $fs_uuid 缺一不可。
解决方法
1:
fdisk -l 查看确认efi启动分区是否sda1,或者其他分区;
首先要知道win10启动项分区的UUID,使用blkid /dev/sda1或者grub命令均可,详情如下
blkid /dev/sda1
# 或者
grub-probe -t fs_uuid -d /dev/sda1
- 1
- 2
- 3
2:修改文件
首先定位 /boot/grub/,修改权限为777;
UEFI/GPT 模式下安装的 Windows
这个模式寻找 Windows 的启动加载器的位置,然后当用户选择了相应的菜单条目的时候,通过链式载入的方法在 GRUB 之后加载它。这里主要的任务是找到 EFI 系统分区然后从上面运行启动加载器。
注意: 这个启动项仅在 UEFI 模式下才起作用,而且 Windows 和 UEFI 的位数必须相同。
if [ ‘${grub_platform}’ == ‘efi’ ]; then
menuentry ‘Microsoft Windows Vista/7/8/8.1/10 UEFI/GPT’ {
insmod part_gpt
insmod fat
insmod chain
search --no-floppy --fs-uuid --set=root $hints_string $fs_uuid
chainloader /EFI/Microsoft/Boot/bootmgfw.efi
}
fi
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
其中 $hints_string 和 $fs_uuid 由下述两个命令得到。
$fs_uuid 命令检测 EFI 系统分区的 UUID:
grub-probe --target=fs_uuid esp/EFI/Microsoft/Boot/bootmgfw.efi
- 1
输出:1ce5-7f28
或者(以 root 身份)运行 blkid 然后从结果中找到 EFI 系统分区的 UUID:
blkid /dev/sda1
- 1
输出:/dev/sda1: SEC_TYPE=“msdos” UUID=“1ce5-7f28” BLOCK_SIZE=“512” TYPE=“vfat” PARTLABEL=“EFI system partition” PARTUUID=“d8cc1e8f-5tb8-4cd9-85v8-e7dfedcc327d”
$hints_string 命令可以确定 EFI 系统分区的位置,在当前的例子中是 harddrive 0:
grub-probe --target=hints_string esp/EFI/Microsoft/Boot/bootmgfw.efi
- 1
输出:–hint-bios=hd0,gpt1 --hint-efi=hd0,gpt1 --hint-baremetal=ahci0,gpt1
(如果输出为:–hint-bios=hd0,msdos1 --hint-efi=hd0,msdos1 --hint-baremetal=ahci0,msdos1 那说明你的window是BIOS/MBR 模式下安装的 Windows)
这两个命令都是假设 Windows 使用的 ESP 是挂载在$esp上的。当然,Windows的 EFI 文件路径可能有变,因为这就是Windows…
本例中实际 /dev/sda1 是挂载在 /boot/efi ,所以用 /boot/efi 替换上述的 esp
结果
修改 /boot/grub/文件中:
### BEGIN /etc/grub.d/30_os-prober ###
### END /etc/grub.d/30_os-prober ###
- 1
- 2
添加中间内容实际修改为:
### BEGIN /etc/grub.d/30_os-prober ###
menuentry 'Microsoft Windows 10' {
insmod part_gpt ## -> 现在一般是gpt格式的硬盘
insmod fat ## -> 实际上是fat格式,可以自己试一下是vfat还是fat
insmod chain
search --no-floppy --fs-uuid --set=root --hint-bios=hd0,gpt1 --hint-efi=hd0,gpt1 --hint-baremetal=ahci0,gpt1 1ce5-7f28
chainloader /EFI/Microsoft/Boot/bootmgfw.efi ## 注意大写
}
### END /etc/grub.d/30_os-prober ###
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
保存,重启,搞定。
结语
本文仅适合UEFI/GPT 模式下安装的 Windows,kali 双系统情况,如果你是BIOS/MBR 模式下安装的 Windows,请参考:GRUB:BIOS/MBR 模式下安装的 Windows
本人的台式机也是如此,试了很多文章的方法都是比较旧的依据grub方式复杂的命令模式,还不能修复,原因就是那些文章都是基于grub旧版,升级最新的linux都依据使用了grub2,启动文件和参数都发生了变化,最简单的方式是,首先修复windows的正常启动,安装使用 Grub2Win,定位到 linux 的grub2启动文件,通常在 /boot/grub/,在windows 模式下,使用 Grub2Win 导入这个(可以用 DiskGenius 读取linux文件系统的boot文件夹,将此文件复制到 win 的硬盘),就可以在win 启动菜单添加 linux(kali)的 grub 启动菜单项。