kali更新grub修复双系统windows10引导启动项

时间:2024-10-23 07:13:52

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 启动菜单项。