相信很多朋友在安装双系统的时候都多多少少会遇到双系统的困扰:
1.安装好了双系统,重启到Windows 10后就无法进入Linux系统了;
2.用grub引导开机启动项,但是发现没有Windows 10的启动项;
第一点主要是微软的锅,在这之前先了解一下当我们按电脑电源键开机的时候发生了什么:
1.在你电脑硬盘中有一个EFI分区,这个分区就是起引导用的,在资源管理器是看不见的,要在磁盘管理中看,或者Dg分区工具中查看,可以看到,我是在Linux中将EFI挂载到Boot分区截图的:
可以看到,该分区包含三个文件夹,分别是Boot、Microsoft、(arch-grub),其中Boot文件夹就是采用UEFI引导所必
需的,且必须在这个目录,其次就是Microsoft,我们打开Microsoft/Boot文件夹:
看到有好多文件,这就是Windows 10启动所必需的,文件夹包含语言包、字体等,BCD 包含了 windows 引导开始以后的信息。其中:bootmgfw.efi 是 Windows 默认引导文件。
EFI/Boot/bootx64.efi
EFI/Microsoft/Boot/bootmgfw.efi
这是采用UEFI启动Windows 10的文件结构,也就是说,当开机的时候,首先UEFI找到EFI分区的Boot文件夹,然后加载bootx64.efi文件,读取文件信息,找到EFI/Microsoft/Boot/bootmgfw.efi,按照bootmgfw.efi的要求,加载所需的启动信息,启动Windows 10。
而微软是有一种功能叫做Secure Boot,这个功能,你要说一点用都没有,那也不至于,默认情况下,UEFI固件只会加载那些被签名的引导程序。在缺少Secure Boot功能的传统PC机上,恶意的后门程序可以加载自身,进而摇身一变伪装成一个引导程序。这样的话,BIOS就会在启动的时候加载后门程序,这样它就可以躲过操作系统,把自己隐藏得很深。
但是不得不说,这对我们安装Linux造成了很大的困扰,也是直接间接导致我们重启到Windows 10后进不去Linux的原因,首先我们要关闭掉,进入BIOS找到Secure Boot,选择disabled,就OK了,当然,有些人进入BIOS会发现Secure Boot这个选项是灰色的(比如我的就是),这时你需要先给你的BIOS设一个密码,然后就能关Secure Boot了。
然后我们重启进入Windows 10,接下来就是用grub引导了,安装完Linux后,你会发现EFI分区中多了一个文件夹,名称取决与你安装的是哪个发行版,我安装的是Archlinux,就是arch-grub,打开看就会发现里面有一个名为grubx64.efi的文件,没错,他就是启动Linux的引导文件,和Windows的bootmgfw.efi类似,我们想要用grub引导代替掉bootmgfw.efi,这样在开机的时候就能进入Linux了,步骤:
1.进入管理员命令行,方法:win+x,再按a;
2.输入:bcdedit /set {bootmgr} path \EFI\ubuntu\grubx64.efi;提示操作成功后就设置好了;
至此,第一个问题解决了,如果你是安装的Ubuntu、Fedora、Opensusu等绝大多数发行版,那么第二点就与你没关系了,开机之后会发现进入grub的引导了,通常会包含至少三个选项(以Ubuntu举例):Ubuntu、Ubuntu高级选项、Windows Manager。这就代表你已经完美的解决了Windows和Linux双系统引导的问题。
第二点是我在安装Archlinux的时候发现的,由于Archlinux安装过程是手动安装的,在编写grub的时候会扫描不到Windows Manager所在的分区(当然可能不是所有人都会遇到),所以在grub的界面选项就没有Windows Manager,导致进不去Windows,这里采用重新编译grub的信息的方法解决这个问题。
1.编辑/boot/grub/grub.cfg文件,发现里面确实没有Windows的启动信息,在后面加上:
menuentry "Microsoft Windows 10" {
insmod part_gpt
insmod fat
insmod search_fs_uuid
insmod chain
search --fs-uuid --set=root $hints_string $fs_uuid
chainloader /EFI/Microsoft/Boot/bootmgfw.efi
}
注意:这里的'$hints_string',代表的是终端执行命令
# grub-probe --target=hints_string /boot/efi/EFI/Microsoft/Boot/bootmgfw.efi 后的输出,
'$fs_uuid'代表的是
# grub-probe --target=fs_uuid /boot/efi/EFI/Microsoft/Boot/bootmgfw.efi 的输出
然后执行保存,执行命令:# grub-mkconfig -o /boot/grub/grub.cfg,就OK了。
到此,Archlinux和Windows 10双系统配置完毕。