Featured image of post 启动引导(二):双硬盘下Windows/Linux双系统启动项配置踩坑

启动引导(二):双硬盘下Windows/Linux双系统启动项配置踩坑

双硬盘下Windows/Linux双系统启动项配置遇到的问题和解决方案建议

缘起

这是”启动引导“系列文章的第二篇。我也是万万没想到这么个简单的话题还能整成一个系列,因为我在写第一篇文章的时候就觉得已经把启动引导的相关概念已经讲得很明白了,而且成功搞了很多次多系统的启动引导配置。但是最近在搞双硬盘分别安装Windows和Linux双系统时踩了一个巨大的坑,所以感觉有必要再写一篇文章来记录一下。

本系列的另一篇比较详细地讲了启动引导的基本概念和多系统启动项的配置方法,建议先看一下:

Windows/Linux双硬盘双系统的坑

我本来以为经过上面的探索,我已经对多系统启动项非常熟悉了。所以当在一个双硬盘的电脑上安装Windows、Linux双系统时我信心满满,觉得在同一个硬盘上装多系统我都搞定了,俩系统分开装岂不更简单?然而现实却是啪啪打脸,我到最后甚至都没能优雅地解决。

背景

先说一下我的基本情况:电脑上装了两块固态硬盘A(1TB)和B(500GB),俩硬盘都装在主板上的M.2接口。A硬盘装的那个M.2接口离CPU更近,B硬盘离CPU稍远一点。离CPU远近有啥影响呢?我本来以为没啥影响,但最终发现这似乎是一个巨大的影响因素。

我选择使用Fedora 42作为自己的主力系统,所以选择1T的固态硬盘A来装Fedora 42。Windows 11系统只是辅助系统,装在500G的B硬盘上。按照惯例,Windows/Linux双系统安装时选择优先安装Windows,因为后安装的话Windows会覆盖Linux的引导程序,导致Linux无法启动。但是我点亮机器时已经将Fedora 42先装到了硬盘A上,且已经用了几天了,懒得再把它清理掉了。而且我觉得我已经对启动引导了如指掌了,即使先装Linux再装Windows那自然也就是个调整启动引导的小事。然后我就有了下面这个第一次的失败经历。

第一次失败的尝试

失败的过程总结起来是这样的:

  1. 先在硬盘A上装Fedora 42,成功引导进入系统。

  2. 再在硬盘B上装Windows 11。最保险的做法自然是将硬盘A拆下来,只留下硬盘B来安装Windows 11。这样Windows 11就会完全安装在硬盘B上,不会影响硬盘A上的Fedora 42。但是由于我懒得拆机,而且硬盘A那个M.2插槽还被显卡挡住了,拆机更麻烦。所以我就想,在安装Windows 11时能不能把硬盘A给屏蔽掉?

  3. 屏蔽硬盘A。首先我想到的是使用BIOS设置来禁用硬盘A,但我发现坑爹的MSI主板居然没有这个功能。我的Z890也算是中高端主板了,居然连这么个功能都没有。于是只能找其他方法屏蔽。经历了一番探索,发现可以通过在Windows安装时使用Diskpart工具来隐藏硬盘A。具体做法是这样的:

    • 启动Windows安装程序,在进入第一个安装界面(也就是选择语言那里)时按Shift + F10,打开命令提示符。

    • 在命令提示符中输入以下命令,启动Diskpart工具:

      1
      
      diskpart
      
    • 然后输入以下命令,列出所有磁盘:

      1
      
      list disk
      
    • 找到硬盘A的磁盘编号(例如Disk 0),然后输入以下命令,选择硬盘A:

      1
      
      select disk 0
      
    • 最后输入以下命令,将硬盘A下线:

      1
      
      offline disk
      

      这样,在本次Windows安装过程中,安装程序都无法看到硬盘A。

    • 退出Diskpart工具:

      1
      
      exit
      
    • 关闭命令提示符,继续安装Windows 11。

  4. 屏蔽硬盘A后继续运行安装程序。在安装程序运行到末期,需要建立启动引导,然后重启。这时问题来了,Windows 11的引导程序虽然看不到硬盘A,但由于硬盘A的M.2接口离CPU更近,Windows安装程序似乎意识到自己待的这个硬盘B不是第一块启动的硬盘,所以它仍然试图往启动顺序靠前的硬盘写入引导信息。但是硬盘A已经被下线了啊。于是Windows安装程序傲娇地拒绝把引导写在启动顺序靠后的硬盘B上,并报错说

    1
    
    Windows could not prepare the computer to boot into the next phase of installation. To install Windows, restart the installation.
    

于是本次尝试以失败告终。

第二次失败的尝试

有了第一次的教训,我也懒得管硬盘A上的Fedora系统了,反正才用了几天,做的配置还不多。就按照传统方案,先装Windows,把Fedora的引导项损坏了也无所谓,之后再重装Fedora就是了。于是就有了下面的操作:

  1. 在硬盘B上安装Windows 11,安装时不再将硬盘A下线。这倒是很顺利,能正常安装且正常启动进入Windows系统。

  2. Windows 11安装时破坏了Fedora的启动引导,我也懒得修复了,直接重装Fedora。Fedora重装后可以正常进入系统。

  3. 但是我在Fedora里试图用grub2-mkconfig命令重新生成GRUB配置时,发现它并没有自动检测到Windows 11的启动项。这时我才意识到,Windows 11的引导程序并没有将引导信息写入硬盘B,而是仍然试图将其写入硬盘A。而Fedora在安装时将它覆盖掉了!

  4. 行吧,刚才为了嫌修复Fedora的引导麻烦将其重装,但这下又要修复Windows的引导。但反正这活儿我也熟,于是开始修复:

    • 在Fedora系统里调整硬盘B的分区,在里面重新建立一个300M的FAT32分区,并将其命名为EFI

    • 重新从U盘启动Windows 11的安装程序,在进入第一个安装界面时按Shift + F10,打开命令提示符。

    • 在命令提示符中输入以下命令:

      1
      2
      
      diskpart
      list disk
      

      找到硬盘B的磁盘编号(例如Disk 1),然后输入以下命令,选择硬盘B:

      1
      2
      
      select disk 1
      list partition
      

      找到刚才新建的EFI分区的分区编号,以及硬盘B上安装Windows 11的那个分区的编号和盘符。可以根据分区的大小来判断,大小为300M的就是EFI分区,大小为400多G的就是Windows系统分区。发现EFI分区编号为4, Windows系统分区编号为3,且没有分配盘符。于是我们给EFI分区分配盘符为S,给Windows系统分区分配盘符为C。

      1
      2
      3
      4
      5
      
      select partition 4
      assign letter=S
      select partition 3
      assign letter=C
      exit
      

      这样我们就可以将Windows的启动引导程序从系统写入到EFI分区了

      1
      
      bcdboot C:\Windows /s S: /f UEFI
      

      这样就完成了Windows的启动引导程序的修复。

  5. 修复完成后,重启电脑,进入BIOS设置,将硬盘B设置为第一启动项。这样就可以正常启动Windows 11了。但是我常用的是Fedora,所以我想把Windows的启动项加到Fedora的Grub里。然后把硬盘A设置为第一启动项,这样默认会进入Fedora,当我想启动Windows时,在Fedora的Grub界面选择Windows就行了。

  6. 于是进入Fedora系统,运行sudo grub2-mkconfig -o /boot/grub2/grub.cfg。然而,Fedora并没有检测到刚才我们修复的Windows启动项。运行sudo os-prober也没有任何输出,表示Fedora就是看不见这个Windows启动项。我百思不得其解,这么明显一EFI分区,就在磁盘B上,我也mount了,它为啥就是视而不见。

  7. 我发现这个EFI分区跟正常装系统时安装程序自己建的EFI分区有些不一样。具体来说,系统自己建的EFI分区和系统分区在其他系统的文件管理器里默认是显示为一整块硬盘的,但现在这个EFI分区跟同一硬盘上的系统分区却是分开的。我也不知道为啥我手动修复建立的分区就是如此不合群。当然,还有解决方法就是手动修改Grub配置,强行把Windows的启动项添加进去。但这样就不优雅了。

于是,这次尝试又是以失败告终。

最终解决方案

我意识到Windows就是如此流氓,就是非得把引导分区建立在它所监测到的最先启动的硬盘上。所以要想老老实实让它把系统和启动引导都放在硬盘B上,只能把硬盘B挪到第一个M.2接口上,或者在安装Windows时把第一个M.2接口上的硬盘拆下来。

总之,还是逃不过拆机。

由于Fedora系统本身没问题,所以只需要把硬盘A拆下来。然后在硬盘B上安装Windows 11就行了。装好后再把硬盘A装回主板。

启动进入Fedora系统,这次再运行os-probergrub2-mkconfig就可以检测到Windows 11的启动项了。

总结

我是真的没想到在俩硬盘上装Windows/Linux双系统会有如此多的坑。这里的教训就是:

  • 如果要在双硬盘上安装双系统,最好把要装Windows的那个硬盘插到启动顺序靠前的那个M.2接口上。
  • 如果你非要把要装Linux的那个硬盘插到启动顺序靠前的M.2接口上,那么要么在安装Windows时把第一个硬盘拆下来,要么用其他电脑在硬盘B上安装好Windows,再把硬盘B插到主板上。
comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计