1.先看问题
这个时候不要慌,既然它的自动安装无法搞定,那我们就手动安装grub引导器
(注意:本人电脑环境是:windows10,分区表类型是GPT类型。尝试安装kali双系统出现grub引导器错误。不同环境下解决方法可能会有区别。并且接下来的操作可能会导致系统无法启动,请知晓其后果!!!)
2.手动安装Grub并添加引导项
2.1下载一个grubforWindows,并解压文件
因为我们现在无法启动kali系统,我们选择在Windows平台下安装好grub引导器
下载地址:grub引导器官方下载
下载后将文件解压到任意文件夹,不推荐含有中文或空格的文件夹
2.2安装grub引导器
首先,确定你的分区表是GTP分区表类型,才可进行接下来的操作
通常采用gpt分区安装系统默认会分一个efi分区用于安装启动文件,本质上是一个fat32格式分区。我们通过“磁盘管理”不能对其分配盘符,我们可以使用系统自带的diskpart工具对其操作,或者可以借助第三方工具。(第三方工具diskgenius操作:找到esp分区,右键->指派新的驱动器号(盘符);选择相应的盘符,确定) (如果你的efi分区已经有盘符请忽略接下来的分配盘符)
2.2.1给efi分区指定一个盘符
按下键盘上的win+r 输入”diskpart” 点击确定,打开磁盘管理工具(注意:以管理员运行该任务)
输入”list disk” 查看磁盘信息
接下来输入”select disk 2″ 选中你efi分区所在磁盘,所以这里的1需要根据实际情况来更改
接着输入”list part”查看磁盘分区信息
接着输入”select part 2″ 选中分区 (注意这里的”2″ 需要根据实际情况更改)
接着输入”assign letter = z”(其中z是为其分配的盘符,根据实际情况做出更改)
2.2.2在efi分区中安装grub引导器
首先打开一个cmd(win + r 输入cmd点击确定 ,推荐使用管理员权限运行该任务)
接下来切换到先前解压的grub文件所在目录(注意:如果目录与当前所在目录不在同一个盘中,请注意切换盘符 )我这里的目录是”H:\grub\grub-2.06-for-windows”;所以命令是
H:
cd H:\grub\grub-2.06-for-windows
接下来输入命令"grub-install.exe --target=x86_64-efi --efi-directory=z: --boot-directory=z:/EFI"
命令安装grub引导器(命令中的”z”是我们为efi分区分配的盘符,需要根据实际情况更改)
这个时候,我们已经安装好了grub引导器,但是我们并没有给它添加启动项,所以它并不能干什么,我们需要手动为其添加启动项
2.2.3给安装好的grub引导器添加启动项
我们可以手动编写一个引导记录,但是那样做太麻烦了,我们可以投机取巧,使用dg工具,打开kali安装的分区,直接复制kali中的grub.cfg文件(它在”kali安装盘符:/boot/grub/”目录中)
接下来直接简单粗暴的右键文件,将文件复制到指定位置,其中指定位置为你手动安装的grub引导器的”\EFI\grub”目录(我的是”Z:\EFI\grub” 根据实际情况更改)若提示文件已存在,点击替换即可。
这个时候,我们不出意外的话,我们已经可以引导kali了,但是我们现在千万不要急着重启,否者可能会导致无法引导Windows系统。我们还需要在其中添加Windows引导记录
右键”grub.cfg”这个文件,使用记事本打开,或者其它文本编辑器都可以
在(”menuentry ‘Kali GNU/Linux’ –class kali –class gnu-linux –class gnu –class os ……”)这一坨文本下面添加下面的数据
menuentry 'Windows 10' {
search --file --no-floppy --set=root /EFI/Microsoft/Boot/bootmgfw.efi
chainloader (${root})/EFI/Microsoft/Boot/bootmgfw.efi
}
修改之后保存文件,重启电脑,并且在bios中修改启动项, 选择我们的grub引导器(如何修改bios启动项请自行百度)
2.3.4在完成以上操作后,你可能需要进行清除上面为grub安装时所分配的盘符,我在这里提供一下参考命令,(”请根据实际情况决定是否执行”)
//打开diskpart工具(win + r 输入 diskpart)
diskpart
//查看磁盘信息
list disk
//选中磁盘
select disk 1
//选中分区
select part 2
//清除盘符(其中z 为你需要清除的盘符)
remove letter = z
//退出
exit