欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

UEFI下Windows启动引导的顺序(附带linux双系统)

程序员文章站 2022-06-01 16:23:20
...

这里均以64位系统(windows和linux均是),gpt分区,UEFI引导作为例子,现在基本上不会不支持吧。

windows下UEFI引导文件的载入顺序

主板启动windows的一般有两种方法:

  1. windows boot manager启动
  2. 硬盘直接引导启动
    UEFI下Windows启动引导的顺序(附带linux双系统)

主板bios中分别是途中前两项(第二项是你自己的硬盘名称,我这里是vmware虚拟机的SCSI硬盘,后面的四个不用管)

在安装windows的时候,系统会位我们建立一个ESP分区,大约200M到300M左右,里面的目录结构大概是这样的:(使用diskgenius等软件可以读取内部文件)

EFI
├── Boot
│ └── bootx64.efi
└── Microsoft
 ├── Boot
 │ ├── BCD
 │ ├── bootmgfw.efi
 └── Recovery

这里我省略了一些字体等其他文件,只列出了主要的文件

方法1,即windows boot manager 进入系统

① 启动程序会找到指定GPT硬盘的fat格式的分区(fat32、fat16等),即esp、efi分区(别名而已)
注意是指定的GPT硬盘,这里是windows创建它的boot manager时已经写入了nvram,告诉他去哪块硬盘找。
② 寻找EFI/Microsoft/Boot/bootmgfw.efi 文件
③ bootmgfw.efi文件去寻找 EFI/Microsoft/Boot/BCD 文件
通常,bcd文件中里面可以放入一些不同的启动项供用户选择启动,如windows双系统,PE等的启动项,具体看下图:
UEFI下Windows启动引导的顺序(附带linux双系统)

④ 当你选择了启动windows后,BCD文件会找到对应分区(大部分人应该是C盘)下的\Windows\system32\winload.efi 文件
⑤ 由winload.efi加载完成windows系统

方法2,即选择硬盘启动

① 启动程序会寻找这块硬盘的的EFI分区
② 寻找EFI/Boot/bootx64.efi 文件
③ bootx64.efi文件去寻找 EFI/Microsoft/Boot/BCD 文件
接下来步骤和方法1一样。

按照上面的步骤来看,bootx64.efi和bootmgfw.efi好像是同一个文件,实际上他们确实是同一个文件,即想要正常启动系统,BCD文件是必须有的,而bootx64.efi和bootmgfw.efi两个文件二选一保留下来就行了。
同样,当你把硬盘拔下来插入别的电脑,一般可以直接使用方法2启动硬盘里的windows(这里忽视了驱动问题)

接下来就是安装linux,这里我安装的是archlinux
根据arch的官方wiki安装,我这里分出了三个分区
swap分区、根目录分区、home目录分区
已经存在的EFI分区挂载点为/boot/efi
即这样顺序(这里以上文说的bootx64.efi的路径为例子):/boot/efi/EFI/boot/bootx64.efi

最后生成grub引导的代码,两行

grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=archlinux
grub-mkconfig -o /boot/grub/grub.cfg

这些代码再Arch Linux的官方wiki都可以找到
重启进入主板bios会发现多了个archlinux的启动项,等级和性质和windows boot manager一样
并且你会发现EFI分区下的EFI文件夹下多了个archlinux文件夹

接下来进入linux系统

sudo vim /boot/grub/custom.cfg

在里面加入windows的启动项(就是把上文的两个efi文件任意一个加入linux的grub引导中):

menuentry "windows 10" {
    search --no-floppy --fs-uuid --set=root 自己的fs_uuid
    chainloader /EFI/Microsoft/Boot/bootngfw.efi
}

其中“自己的fs_uuid”使用blkid命令查看,如图:
UEFI下Windows启动引导的顺序(附带linux双系统)
这里我的efi分区为/dev/sda1,所以可以看到是38A0-4EA3
我这里是使用bootngfw.efi文件,你也可以使用bootx64.efi,但是有时候该文件可能会被你新装的linux更改成指向linux系统,比如安装manjaro(archlinux分支,图形安装界面),一路下一步后,安装完,EFI文件夹里面会多一个manjaro文件夹,以及顺带着把bootx64.efi文件改了,导致你用方法2启动系统默认进入的是linux系统。

同时可以加入

menuentry "System shutdown" {
  echo "System shutting down..."
  halt
}
menuentry "System restart" {
  echo "System rebooting..."
  reboot
}

分别是关机和重启选项,以下是效果图
UEFI下Windows启动引导的顺序(附带linux双系统)