缘起
我之前在电脑上装过双系统或者多系统,但对于多个系统的启动项一直云里雾里,经常出现启动项丢失、启动项重复等问题。这次我打算好好研究一下多系统启动项的配置,包括启动加载器的设置、EFI/Grub/rEFInd等,以及如何定制多系统启动器主题。
更新:本文主要讲启动引导的基本概念和多系统启动项的配置方法。我本来以为这一篇文章就把多系统启动的问题讲明白了,但万万没想到我在配置双硬盘Windows/Linux双系统启动时还踩了一个巨大的坑,不得不再写一篇文章,从而把启动引导也搞成了一个系列。如果你想搞双硬盘Windows/Linux双系统启动,强烈建议你再参考一下本系列的第二篇文章:
操作系统启动流程
计算机的启动过程主要分为4步:1. 上电;2. BIOS/UEFI启动;3. 加载启动项;4. 操作系统启动。第1步和第4步一般不需要用户干预,而第2步和第3步需要用户配置。所以这里主要介绍第2步和第3步的内容。

BIOS/UEFI启动
BIOS(Basic Input/Output System)和UEFI(Unified Extensible Firmware Interface)是计算机的固件,负责启动计算机并加载操作系统。BIOS是旧的启动方式,UEFI是新的启动方式,UEFI相对于BIOS有更多的功能和更好的性能。无论是UEFI还是BIOS,它们都是主板上的固件。
BIOS启动流程
BIOS一般在比较旧的计算机上使用,其启动流程比较固定,用户定制的自由度比较低。主要分为以下步骤:
-
BIOS POST(Power-On Self-Test)自检
-
BIOS读取MBR(Master Boot Record)中的引导程序
-
引导程序读取分区表,找到活动分区
-
引导程序读取活动分区的引导扇区,加载操作系统
MBR的位置是固定的,一般在硬盘的第一个扇区,大小为512字节。MBR中包含了分区表和引导程序,分区表记录了硬盘的分区信息,引导程序负责加载操作系统。
UEFI启动流程
UEFI也是BIOS的一种,一般在比较新的计算机上使用。其启动流程比较灵活,包含的功能更多,用户定制的自由度比较高。尽管UEFI的功能更多,但其流程更为统一,主要分为以下步骤:
-
UEFI POST(Power-On Self-Test)自检
-
UEFI读取EFI分区中的引导程序
-
引导程序读取EFI分区中的引导文件,加载操作系统

相比BIOS,UEFI使用的EFI分区的位置并不固定,甚至一块硬盘上可以有多个EFI分区。
UEFI的引导程序和引导文件都存储在EFI分区中,包含了引导程序、引导文件、驱动程序等。只要引导文件符合UEFI的规范,无论是Windows、Linux还是macOS的引导程序,也无论引导文件放在哪个EFI分区,UEFI都可以找到并加载。
由于UEFI更灵活也更新,所以接下来讲的多系统启动项配置都是基于UEFI的。
概念辨析:启动加载器、启动项、启动文件
在讲多系统启动项配置之前,我们先来梳理一下启动加载器、启动项和启动文件的概念。
-
启动加载器(Boot Loader):负责加载操作系统的启动引导程序,每个启动引导程序就是一个启动项(Boot Entry)。常用的启动加载器有Grub(Grub2)、rEFInd、Clover等。
-
启动项(Boot Entry):启动加载器加载的每个操作系统就是一个启动项,每个启动项对应一个操作系统。启动项包含了操作系统的启动文件、内核、驱动程序等。
-
启动文件(Boot File):启动项中的启动文件,是操作系统的引导程序,负责加载操作系统。Windows的启动文件是
bootmgfw.efi,Linux的启动文件是vmlinuz。
在此基础上,我们再来看UEFI是如何启动操作系统的。
-
每个启动加载器都对应着一个
.efi文件,这个.efi文件就是启动加载器的启动文件,负责加载启动加载器。在UEFI完成自检后,会读取EFI分区中的所有.efi文件,如果你在此时进入BIOS设置,看到的启动项就是EFI分区中的.efi文件。这些启动项是有优先顺序的,其顺序可以在BIOS设置中调整。例如下图中最高优先级的启动项是
rEFInd,其次是Windows Boot Manager,最后是ubuntu。电脑启动时会先试图加载rEFInd,如果rEFInd不存在,再尝试加载Windows Boot Manager,以此类推。
-
如果
rEFInd成功加载,rEFInd会读取EFI分区中的refind.conf配置文件,根据配置文件生成启动菜单,显示在屏幕上。其中每个菜单项对应一个启动项,启动项一般有两类:一类是操作系统内核镜像,另一类是启动加载器。- 操作系统内核镜像:对应的是操作系统的内核文件,例如Linux的
vmlinuz文件,Windows的bootmgfw.efi文件。 - 启动加载器:对应的是启动加载器的
.efi文件,例如Grub2的grubx64.efi文件。

- 操作系统内核镜像:对应的是操作系统的内核文件,例如Linux的
-
用户选择一个菜单项后,
rEFInd会加载对应的启动项,如果启动项是操作系统内核镜像,rEFInd会直接加载操作系统;如果启动项是启动加载器,rEFInd会加载启动加载器,启动加载器再加载操作系统。 -
如果启动加载器要启动一个Linux系统,那么首先会加载Linux的内核文件
vmlinuz-xxx,然后加载Linux的初始化文件系统文件initrd-xxx.img或者initramfs-xxx.img,最后加载Linux系统。这两个文件都在Linux系统的/boot目录下。
多系统安装时的启动项配置
上面说了UEFI的引导程序和引导文件都存储在EFI分区中,所以在安装多个系统时,每个系统都会在EFI分区中创建一个引导文件,这样就会有多个引导文件,每个引导文件对应一个系统。这样就可以通过选择不同的引导文件来启动不同的系统。
在安装多个操作系统时,我们可以把各个系统的引导文件放入同一个EFI分区中,也可以把各个系统的引导文件放入不同的EFI分区中。两种方法各有利弊,具体选择哪种方法取决于个人喜好。
-
同一个EFI分区
这种情况下的硬盘分区结构如下:

优点:方便管理,只需要一个EFI分区,不需要多个EFI分区。更易于配置启动加载器。
缺点:所有的引导文件都在一个EFI分区中,万一EFI分区损坏,所有的系统都无法启动。
安装多个系统的具体操作如下:
- 硬盘分区:在硬盘上分出一个EFI分区,大小最好为1GB以上,格式为FAT32。其他分区可以按照各个操作系统的需求而定,例如Windows一般需要至少52GB的空间,Linux一般需要至少20GB的空间。
- 安装Windows:如果安装的多个操作系统既有Windows又有Linux,建议先安装Windows。因为Windows的引导程序会覆盖其他已安装操作系统的引导程序,导致先前安装的Linux无法启动。安装Windows时,选择给Windows分配的分区,Windows会自动在EFI分区中创建引导文件。
- 依次安装各个Linux:对于每个Linux系统,安装时一般选择自定义分区,手动挂载EFI分区到
/boot/efi,挂载为Linux准备的分区到/,可选择创建交换分区和/home分区。安装完成后,Linux会在EFI分区中创建引导文件。 - 配置启动加载器:多个操作系统依次安装完成后,我们需要配置启动加载器,让我们可以选择要启动的操作系统。这些内容会在后面详细介绍。
-
不同的EFI分区
这种情况下的硬盘分区结构如下:

优点:每个系统有自己的EFI分区,互不干扰。一个系统的EFI分区损坏,其他系统不受影响。
缺点:需要多个EFI分区,管理起来比较麻烦。每个系统的引导文件都在不同的EFI分区中,不易于配置启动加载器。
安装多个系统的具体操作如下:
- 硬盘分区:在硬盘为每个系统分别分出一块空间。暂时不需要创建EFI分区,安装系统时会在每个系统各自的分区中分别创建EFI分区。
- 安装Windows:安装Windows时,选择给Windows分配的分区,Windows会自动在该分区中创建EFI分区。
- 安装Linux:对于每个Linux系统,安装时选择为这个系统分配的分区,在这个分区中创建大小为200MB左右的EFI分区,挂载点为
/boot/efi;剩余的空间挂载为Linux准备的分区,挂载点为/;可选择创建交换分区和/home分区。 - 配置启动加载器:多个操作系统依次安装完成后,我们需要配置启动加载器,让我们可以选择要启动的操作系统。这些内容会在后面详细介绍。
启动目录结构
我们来看一下启动目录的结构,以及安装一个操作系统时,这个操作系统会创建哪些文件。这里假设多个操作系统的引导文件都放在同一个EFI分区中,我们安装了3个操作系统:Windows、Ubuntu、Arch Linux。其中Ubuntu系统使用Grub2作为启动加载器,Arch Linux系统使用systemd-boot作为启动加载器。我们还在Ubuntu系统下安装了rEFInd作为启动加载器。
-
EFI分区
EFI分区是一个FAT32格式的独立的分区,一般大小为1GB左右。EFI分区中主要包含各个启动加载器的引导文件。
EFI分区的目录结构如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19EFI ├── Boot │ └── bootx64.efi ├── Microsoft │ └── Boot │ ├── BCD │ ├── BCD.LOG │ ├── BCD.LOG1 │ ├── BCD.LOG2 │ ├── bootmgfw.efi │ ├── bootmgr.efi │ └── boot.stl ├── systemd │ └── systemd-bootx64.efi └── ubuntu ├── grub.cfg ├── grubx64.efi ├── mmx64.efi └── shimx64.efiEFI/Boot/bootx64.efi:UEFI的默认引导文件,一般指向Windows的引导文件EFI/Microsoft/Boot/bootmgfw.efi。EFI/Microsoft/Boot/bootmgfw.efi:Windows的引导文件,负责加载Windows操作系统。EFI/systemd/systemd-bootx64.efi:systemd-boot的引导文件,负责加载Linux操作系统。EFI/ubuntu/grubx64.efi:Grub2的引导文件,负责加载Linux操作系统。EFI/ubuntu/shimx64.efi:Secure Boot的引导文件,用于加载Grub2。EFI/ubuntu/mmx64.efi:Grub2的引导文件,用于加载Grub2。EFI/ubuntu/grub.cfg:Grub2的配置文件,包含了各个启动项的配置。
-
安装操作系统
安装Ubuntu时,选择自定义分区,手动挂载EFI分区到
/boot/efi,挂载为Linux准备的分区到/。安装完成后,Ubuntu会在EFI分区中创建EFI/ubuntu目录,其中包含了Grub2的引导文件和配置文件。Ubuntu会在/boot目录中创建两个文件:vmlinuz和initrd.img,这两个文件是Linux的内核文件和初始化文件系统文件。Grub2的引导文件会识别这两个文件,并创建启动项,在启动时选择相应的启动项,就可以加载Ubuntu系统。在Ubuntu系统中,可以进入
/boot/efi/EFI中查看EFI分区的目录结构。1 2 3 4 5 6 7 8 9/boot ├── efi │ └── EFI │ ├── Boot │ ├── Microsoft │ ├── systemd │ └── ubuntu ├── vmlinuz └── initrd.img注意,虽然
/boot/efi/EFI在/boot下,但/boot/efi/EFI中的文件在EFI分区里,而/boot下的其他文件在Ubuntu系统的分区里。/boot下的vmlinuz和initrd.img文件在其他系统中是无法访问的,而若其他系统也挂载了EFI分区,那么其他系统也可以访问/boot/efi/EFI中的文件。如果继续安装更多的操作系统,一般操作系统都会让你选择启动加载器,你可以选择使用Grub2,也可以选择systemd-boot,或者其他启动加载器。下面介绍一下启动加载器的配置。
启动加载器
启动加载器(Boot Loader)负责加载操作系统的启动引导程序,每个启动引导程序就是一个启动项(Boot Entry)。常用的启动加载器有Grub(Grub2)、rEFInd、Clover等。这里主要介绍Grub2和rEFInd。
Grub2
Grub2(GNU GRand Unified Bootloader 2)是Linux系统上常用的启动加载器,功能强大,支持多系统启动。Grub2的工作文件夹是/boot/grub(Ubuntu等系统)或/boot/grub2(fedora等系统),Grub2的配置文件是位于工作文件夹内的grub.cfg,一般由grub-mkconfig命令生成。
Grub2的配置文件比较复杂,但功能强大,可以定制各种启动项。Grub2的主题也可以定制,但相对比较复杂。
Grub2的配置
-
配置文件
Grub2的主配置文件是
/boot/grub/grub.cfg或/boot/grub2/grub.cfg,可以通过编辑这个文件来配置Grub2的启动项。1 2sudo cat /boot/grub/grub.cfg # Ubuntu sudo cat /boot/grub2/grub.cfg # fedora不过一般不建议直接编辑
grub.cfg文件,因为这个文件是由grub-mkconfig命令生成的,如果直接编辑grub.cfg文件,下次更新Grub2时会被覆盖。建议通过配置/etc/default/grub文件,以及/etc/grub.d/目录下的配置文件来配置Grub2。 -
启动项的配置
Grub2的启动项配置比较复杂,例如:
1 2 3 4 5GRUB_DEFAULT=0 GRUB_TIMEOUT=5 GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian` GRUB_CMDLINE_LINUX_DEFAULT="quiet splash" GRUB_CMDLINE_LINUX=""GRUB_DEFAULT:默认启动项的编号,从0开始。GRUB_TIMEOUT:启动菜单显示的时间,单位为秒。GRUB_DISTRIBUTOR:系统的发行商。GRUB_CMDLINE_LINUX_DEFAULT:Linux内核的默认启动参数。GRUB_CMDLINE_LINUX:Linux内核的启动参数。
-
定制主题
Grub2的主题可以定制,可以把想要的主题文件放在
/boot/grub/themes目录下。主题目录下包含了主题文件、字体文件、背景图片等,而且有一个名为theme.txt的配置文件,可以配置主题的各种属性。在配置文件
/etc/default/grub中可以指定主题文件:1GRUB_THEME="/boot/grub/themes/theme-name/theme.txt" -
Grub2配置生效
Grub2的配置文件
/boot/grub/grub.cfg或/boot/grub2/grub.cfg是由grub-mkconfig命令生成的,所以每次修改配置文件后,都需要重新生成grub.cfg文件。1 2sudo grub-mkconfig -o /boot/grub/grub.cfg # Ubuntu sudo grub2-mkconfig -o /boot/grub2/grub.cfg # fedora也可以使用
update-grub命令来更新Grub2配置。1 2sudo update-grub # Ubuntu sudo grub2-mkconfig -o /boot/grub2/grub.cfg # fedora
更多的Grub2配置可以参考Grub2配置。
rEFInd
rEFInd是一个基于UEFI的启动加载器,功能强大,支持多系统启动。rEFInd的配置文件是/boot/efi/EFI/refind/refind.conf,一般由refind-install命令生成。
rEFInd的配置文件比较简单,但功能强大,可以定制各种启动项。rEFInd的主题也可以定制,相对比较简单。
rEFInd安装
rEFInd的安装比较简单,可以直接下载rEFInd的安装包,解压到EFI分区中。也可以使用refind-install命令安装rEFInd。
|
|
安装完成后,rEFInd会在EFI分区中创建EFI/refind目录,其中包含了rEFInd的引导文件和配置文件。
rEFInd配置
rEFInd的配置文件是/boot/efi/EFI/refind/refind.conf,可以通过编辑这个文件来配置rEFInd的启动项。
|
|
-
启动项的配置
rEFInd中启动项的配置比较简单,例如:
1 2 3timeout 5 hideui singleuser scanfor manual,externaltimeout:启动菜单显示的时间,单位为秒。hideui:隐藏启动菜单,只显示单用户模式。scanfor:扫描启动项的方式,可以扫描手动配置的启动项,也可以扫描外部设备的启动项。
-
定制主题
rEFInd的主题可以定制,可以把想要的主题文件放在
/boot/efi/EFI/refind/theme目录下。主题文件是一个CSS文件,可以修改颜色、字体、背景等。在配置文件
/boot/efi/EFI/refind/refind.conf中可以指定主题文件:1include themes/theme-name/theme.conf -
屏蔽启动项
有时候rEFInd会扫描到很多不需要的启动项,例如如果你在安装系统时选择了使用Grub2作为启动加载器(Deepin, Fedora等系统会默认安装Grub2,而且似乎没法在安装时取消),那么rEFInd会扫描到Grub2的启动项。你可以通过配置文件
/boot/efi/EFI/refind/refind.conf来屏蔽这些启动项。rEFInd可以选择忽略某些文件(dont_scan_files)、工具(dont_scan_tools)、目录(dont_scan_dirs)和磁盘(dont_scan_volumes)。1 2dont_scan_files shim.efi,mmx64.efi dont_scan_dirs ESP:/EFI/ubuntu,EFI/deepin,EFI/fedora
问题解决
-
在SD卡或U盘上安装系统
- 如果你的电脑有SD卡插槽,你可以选择把系统安装在SD卡上。
- 跟上面讲的安装多个操作系统的方法相似,在SD卡上安装操作系统也有两种EFI分区方式,一种是在SD卡上创建一个EFI分区,另一种是在安装系统时把硬盘上的EFI分区挂载到
/boot/efi。 - 对于
/boot分区,可以选择直接在SD卡上创建,也可以先在硬盘上创建一个大小约为500M的ext4分区,然后在安装系统时把它挂载到/boot。/boot里主要存放内核文件和引导文件,通常200M左右的空间就够了,但是如果你选择备份多个内核,那么就需要更大的空间。Fedora系统会限制/boot分区不小于512M。 - 如果你选择把
/boot分区放在SD卡上,你可能会遇到一些安全方面的限制,例如Secure Boot可能会阻止从SD卡启动。你需要注册注册密钥,或者关闭Secure Boot。 - 我一般选择把EFI分区和
/boot分区都放在硬盘上。
我还没试过在U盘上安装系统,不过原理应该和在SD卡上安装是一样的。
-
Fedora无法启动
在SD卡上安装了Fedora系统后,我遇到了系统无法启动的问题。rEFInd可以扫描到Fedora的内核文件
vmlinuz-xxx和initramfs-xxx.img,但是启动到一半会卡住,报错:1 2 3 4 5 6 7Failed to switch root: Specified switch root path /sysroot does not seem to be an OS tree. os-release file is missing. initrd-switch-root.service: Main process exited, code=exited, status=1/FAILURE initrd-switch-root.service: Failed with result 'exit-code'. Failed to start initrd-switch-root.service: Switch Root. Startup finished in 1.073s (kernel) + 1.000s (initrd) + 1.000s (userspace) = 3.073s. initrd-switch-root.service: Triggering OnFailure= dependencies. Started emergency.service - Emergency Shell.在Emergency Shell中查看后发现,
/sysroot目录为空,没有任何文件。而正常情况下,加载内核和文件系统初始化后,/sysroot目录应该包含操作系统的文件。所以这个问题是因为在启动内核和初始化文件系统时,SD卡没有被正确挂载。你可以在Emergency Shell中手动挂载SD卡,然后
exit退出Emergency Shell,系统就可以正常启动了。1 2mount /dev/sda1 /sysroot exit但显然这不是一个好的解决方案,因为每次启动都要手动挂载SD卡。所以正确的解决方案是让rEFInd在启动内核时正确挂载SD卡,这需要给启动选项添加一个
root参数,指定根目录。你可以在rEFInd的配置文件/boot/efi/EFI/refind/refind.conf中添加一个带有options参数的菜单项。1 2 3 4 5 6menuentry "Fedora" { volume "SD-boot" loader /vmlinuz-xxx initrd /initramfs-xxx.img options "root=/dev/sda1" }然而,这个解决方案也不是很好,因为
- 在每次更新内核后,你都需要手动修改rEFInd的配置文件。
- 如果你有多个内核,这个菜单项不能自动生成子菜单,你需要手动添加每个内核的菜单项。
所以,更好的解决方案是让整个
boot分区里的内核文件和引导文件都使用整个选项。做法是在/boot分区的根目录下创建一个refind_linux.conf文件,然后在rEFInd的配置文件/boot/efi/EFI/refind/refind.conf中添加一个root参数。1"Boot with standard options" "root=/dev/sda1"问题终于解决了!
-
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那自然也就是个调整启动引导的小事。然后我就有了下面这个第一次的失败经历。
-
第一次失败的尝试
失败的过程总结起来是这样的:
a. 先在硬盘A上装Fedora 42,成功引导进入系统。
b. 再在硬盘B上装Windows 11。最保险的做法自然是将硬盘A拆下来,只留下硬盘B来安装Windows 11。这样Windows 11就会完全安装在硬盘B上,不会影响硬盘A上的Fedora 42。但是由于我懒得拆机,而且硬盘A那个M.2插槽还被显卡挡住了,拆机更麻烦。所以我就想,在安装Windows 11时能不能把硬盘A给屏蔽掉?
c. 屏蔽硬盘A。首先我想到的是使用BIOS设置来禁用硬盘A,但我发现坑爹的MSI主板居然没有这个功能。我的Z890也算是中高端主板了,居然连这么个功能都没有。于是只能找其他方法屏蔽。经历了一番探索,发现可以通过在Windows安装时使用Diskpart工具来隐藏硬盘A。具体做法是这样的:
-
启动Windows安装程序,在进入第一个安装界面(也就是选择语言那里)时按
Shift + F10,打开命令提示符。 -
在命令提示符中输入以下命令,启动Diskpart工具:
1diskpart -
然后输入以下命令,列出所有磁盘:
1list disk -
找到硬盘A的磁盘编号(例如
Disk 0),然后输入以下命令,选择硬盘A:1select disk 0 -
最后输入以下命令,将硬盘A下线:
1offline disk这样,在本次Windows安装过程中,安装程序都无法看到硬盘A。
-
退出Diskpart工具:
1exit -
关闭命令提示符,继续安装Windows 11。
d. 屏蔽硬盘A后继续运行安装程序。在安装程序运行到末期,需要建立启动引导,然后重启。这时问题来了,Windows 11的引导程序虽然看不到硬盘A,但由于硬盘A的M.2接口离CPU更近,Windows安装程序似乎意识到自己待的这个硬盘B不是第一块启动的硬盘,所以它仍然试图往启动顺序靠前的硬盘写入引导信息。但是硬盘A已经被下线了啊。于是Windows安装程序傲娇地拒绝把引导写在启动顺序靠后的硬盘B上,并报错说
```sh 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就是了。于是就有了下面的操作:
a. 在硬盘B上安装Windows 11,安装时不再将硬盘A下线。这倒是很顺利,能正常安装且正常启动进入Windows系统。
b. Windows 11安装时破坏了Fedora的启动引导,我也懒得修复了,直接重装Fedora。Fedora重装后可以正常进入系统。
c. 但是我在Fedora里试图用
grub2-mkconfig命令重新生成GRUB配置时,发现它并没有自动检测到Windows 11的启动项。这时我才意识到,Windows 11的引导程序并没有将引导信息写入硬盘B,而是仍然试图将其写入硬盘A。而Fedora在安装时将它覆盖掉了!d. 行吧,刚才为了嫌修复Fedora的引导麻烦将其重装,但这下又要修复Windows的引导。但反正这活儿我也熟,于是开始修复:
-
在Fedora系统里调整硬盘B的分区,在里面重新建立一个300M的FAT32分区,并将其命名为
EFI。 -
重新从U盘启动Windows 11的安装程序,在进入第一个安装界面时按
Shift + F10,打开命令提示符。 -
在命令提示符中输入以下命令:
1 2diskpart list disk找到硬盘B的磁盘编号(例如
Disk 1),然后输入以下命令,选择硬盘B:1 2select 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 5select partition 4 assign letter=S select partition 3 assign letter=C exit这样我们就可以将Windows的启动引导程序从系统写入到EFI分区了
1bcdboot C:\Windows /s S: /f UEFI这样就完成了Windows的启动引导程序的修复。
e. 修复完成后,重启电脑,进入BIOS设置,将硬盘B设置为第一启动项。这样就可以正常启动Windows 11了。但是我常用的是Fedora,所以我想把Windows的启动项加到Fedora的Grub里。然后把硬盘A设置为第一启动项,这样默认会进入Fedora,当我想启动Windows时,在Fedora的Grub界面选择Windows就行了。
f. 于是进入Fedora系统,运行
sudo grub2-mkconfig -o /boot/grub2/grub.cfg。然而,Fedora并没有检测到刚才我们修复的Windows启动项。运行sudo os-prober也没有任何输出,表示Fedora就是看不见这个Windows启动项。我百思不得其解,这么明显一EFI分区,就在磁盘B上,我也mount了,它为啥就是视而不见。g. 我发现这个EFI分区跟正常装系统时安装程序自己建的EFI分区有些不一样。具体来说,系统自己建的EFI分区和系统分区在其他系统的文件管理器里默认是显示为一整块硬盘的,但现在这个EFI分区跟同一硬盘上的系统分区却是分开的。我也不知道为啥我手动修复建立的分区就是如此不合群。当然,还有解决方法就是手动修改Grub配置,强行把Windows的启动项添加进去。但这样就不优雅了。
于是,这次尝试又是以失败告终。
-
-
最终解决方案
我意识到Windows就是如此流氓,就是非得把引导分区建立在它所监测到的最先启动的硬盘上。所以要想老老实实让它把系统和启动引导都放在硬盘B上,只能把硬盘B挪到第一个M.2接口上,或者在安装Windows时把第一个M.2接口上的硬盘拆下来。
总之,还是逃不过拆机。
由于Fedora系统本身没问题,所以只需要把硬盘A拆下来。然后在硬盘B上安装Windows 11就行了。装好后再把硬盘A装回主板。
启动进入Fedora系统,这次再运行
os-prober和grub2-mkconfig就可以检测到Windows 11的启动项了。
我是真的没想到在俩硬盘上装Windows/Linux双系统会有如此多的坑。这里的教训就是:
- 如果要在双硬盘上安装双系统,最好把要装Windows的那个硬盘插到启动顺序靠前的那个M.2接口上。
- 如果你非要把要装Linux的那个硬盘插到启动顺序靠前的M.2接口上,那么要么在安装Windows时把第一个硬盘拆下来,要么用其他电脑在硬盘B上安装好Windows,再把硬盘B插到主板上。
-