无忧启动论坛

标题: 真正的UEFI启动逻辑 [打印本页]

作者: plutoshen    时间: 2024-8-3 12:37
标题: 真正的UEFI启动逻辑
现在的电脑基本上都是采取UEFI启动了,之前看过一些资料,大抵都讲道“现在UEFI不需要制作引导分区了,系统会自动从EFI分区下的\EFI\Boot\Bootx64.efi文件启动”,这种说法其实是以偏概全了。导致很多情况下出现了一些奇怪的问题(比如当我准备把操作系统安装到一个移动硬盘上的时候)。

究其错误的原因,从根本上来说是忽略了了主板上NVRAM(非易失性随机访问存储器,主板上自带的一小块配置存储器,不在硬盘上,你把整块硬盘都擦了它还在)中启动配置的存在。

真正的UEFI启动逻辑

  1. def 从EFI文件启动(文件路径):
  2.     根据文件路径加载EFI文件
  3.     if 开启了SecureBoot功能:
  4.         if not SecureBoot校验通过:
  5.             启动失败报错退出 # 一般可以在屏幕上看到错误信息
  6.     执行EFI # 一般来说也就从这里进入了操作系统或者Grub,所以不会返回

  7. def 从存储设备启动(存储设备):
  8.     # 可以是是GPT分区,也可以是MBR分区
  9.     for 分区 in 存储设备:
  10.         # 分区类型在MBR/GPT的分区表中标注,其本质是个普通FAT文件系统分区
  11.         if 分区类型 == EFI系统分区:
  12.             # 注意,FAT文件系统路径不区分大小写,且由于出自Windows,所以其路径习惯用反斜杠\而非斜杠/
  13.             # 对于非x86_64类型的硬件,默认路径也有差异
  14.             if 分区根目录下存在"\EFI\Boot\Bootx64.efi"文件:
  15.                 从EFI文件启动(分区索引 + 该文件在分区下路径)

  16. def 从EFI启动项启动(启动项):
  17.     if 该启动项指向的是一个EFI文件路径:
  18.         从EFI文件启动(启动项所指文件路径)
  19.     elif 启动项指向的是一个存储设备:
  20.         从存储设备启动(启动项所指设备)

  21. def 启动():
  22.     根据主板NVRAM中启动项配置,以及扫描的硬件(比如刚插入装机U盘等),生成启动顺序表
  23.     if 用户无操控:
  24.         for 启动项 in 启动顺序表:
  25.             从EFI启动项启动(启动项) # 成功则返回,失败可能会返回,也可能是报错退出
  26.     else:
  27.         根据启动顺序表选择界面
  28.         if 用户选择了一个启动项:
  29.             # 这对应了手动从列表中选择一个启动设备
  30.             从EFI启动项启动(启动项)
  31.         elif 用户手动选择了一个具体的EFI文件:
  32.             # 这对应了手动浏览EFI分区并选择某一个具体的文件
  33.             从EFI文件启动(文件路径)
  34.     这次启动失败了,死机?退出主界面?或者重新尝试?结果因机器而异


  35. 硬件扫描和准备
  36. 启动()
复制代码


所以,总结说来,UEFI并不是单纯地找到启动设备上的EFI分区里的某固定文件路径就启动了,而是会结合NVRAM中的配置来完成整个过程。NVRAM中的启动配置包括一系列启动项和响应的预设优先顺序,Linux下可以用efibootmgr -v命令查看。它会在以下情况下发生更改:

当安装操作系统完成后,操作系统会自动添加一条启动项,如ubuntu会生成一条名为ubuntu的项目并指向EFI分区的\EFI\ubuntu\shimx64.efi文件,而Windows会生成一条名为Windows Boot Manager的项目指向EFI分区的\EFI\Microsoft\Boot\bootmgfw.efi文件。
在操作系统中通过efibootmgr等工具手动修改,使用grub-install命令时如果没有指定--no-nvram也会添加一个启动项
在BIOS(UEFI不是BIOS,但是习惯上还是管机器的UEFI配置界面叫BIOS)中修改
由于Windows用户实在太多了,有的主板生产商会自动为Windows添加启动项(避免小白搞坏配置),甚至强制将其列为第一优先级(这就很恶心了)
手动从某个设备成功启动后,硬件可能会自动地将其对应的EFI文件加入启动项(因硬件而异)
硬件检测到不存在的设备/文件,自动删除启动项(因硬件而异)
……
总之这个NVRAM中的启动项配置的编辑策略各不相同,甚至不排除可能有的主板出于安全(恰烂钱)考虑拒绝你对它进行编辑,强制你从Windows启动,所以需要根据自己的电脑自行实验。一般来说,台式机自由度比较大,绝大多数都是允许你自行编辑的,且不会强制更改你自定义优先级;而高端或者新的笔记本也和台式机差不多,但是又老又旧的笔记本的坑就比较多了。

因此,到这里就可以解释如下现象了:

为啥删除了EFI分区下的\EFI\BOOT目录也还能正常启动?

因为NVRAM中的启动项配置直接指向\EFI\ubuntu或者\EFI\microsoft目录,不依赖于\EFI\BOOT,\EFI\BOOT下的东西只在直接从该设备启动时生效,相当于作为一个后备。

为啥换了主板后就只能从Windows启动了?

NVRAM在主板上,换了后自然全没了,剩下Windows是因为前面说的有的主板为了方便小白使用自动探测Windows启动项的存在并添加之,Linux就没福气了,这可以需要通过引导盘进入Live环境后用efibootmgr修复。

为什么安装Linux后安装Windows,无法进入Linux(Grub)?

还是能进入的,只不过Windows把自己设置成了第一优先级,默认直接进Windows;所以一般先装Windows再装Linux,这样Linux把自己设置成第一优先级,可以在Grub界面二选一。不过其实这都是小问题,改一下NVRAM配置就行,并不是很多教程说的必须先装Windows,没那么死板。
作者: plutoshen    时间: 2024-8-3 12:39
这才是我笔记本上Windows争夺启动优先权的真相。
作者: yyz2191958    时间: 2024-8-3 12:43
惭愧,我看不懂
作者: dayeye    时间: 2024-8-3 13:02
本帖最后由 dayeye 于 2024-8-3 17:28 编辑

我怀疑我的笔记本没有efi文件也可以启动,(删除EFI\Boot文件夹,同时删除EFI\Microsoft\Boot下的bootmgfw.efi)。怀疑主板会自动添加一个efi用于启动。

折腾中有发现提示没有efi,但是能继续启动进系统,觉得奇怪,没特意测试。所以只能用“怀疑”。

作者: yc2428    时间: 2024-8-3 13:11
谢谢分享
作者: ring8511    时间: 2024-8-3 13:29
这个还真看不懂
作者: 2012andyle113    时间: 2024-8-3 13:43
不知道你在真相什么,只能说你自己没有搞清楚而已,无论什么时代,其实都没变过,肯定是需要主板先把硬件设置检测认出来了,才能进入下一阶段常规系统引导,UEFI无非相比BIOS更加强大功能更多了,可以说是完整的底层小系统了,所以可以接管上层操作系统的一部分功能
作者: plutoshen    时间: 2024-8-3 13:45
dayeye 发表于 2024-8-3 13:02
我怀疑我的笔记本没有efi文件也可以启动,(删除EFI\Boot文件夹,同时删除EFI\Microsoft\Boot下的bootmgfw. ...

你要只是怀疑,可以把esp分区里所有文件都移动到一个文件夹里,包括隐藏的,然后再重启试试。
作者: plutoshen    时间: 2024-8-3 13:47
2012andyle113 发表于 2024-8-3 13:43
不知道你在真相什么,只能说你自己没有搞清楚而已,无论什么时代,其实都没变过,肯定是需要主板先把硬件设 ...

你不应该看不懂。
作者: cutebe    时间: 2024-8-3 14:31
看着挺复杂的。
是要先读主板上启动配置,再根据配置进入不同的启动项吗?
作者: waimaggie    时间: 2024-8-3 14:47
cutebe 发表于 2024-8-3 14:31
看着挺复杂的。
是要先读主板上启动配置,再根据配置进入不同的启动项吗?

就是先读NVRAM里面的引导配置。
作者: cutebe    时间: 2024-8-3 15:11
waimaggie 发表于 2024-8-3 14:47
就是先读NVRAM里面的引导配置。

感谢回答!
作者: wang1126    时间: 2024-8-3 15:17
谢谢分享
作者: ynb168c    时间: 2024-8-3 15:24
谢谢分享
作者: bobo_901    时间: 2024-8-3 15:28
感谢分享。
作者: wcs    时间: 2024-8-3 15:42
好分享,支持了
作者: wondaol    时间: 2024-8-3 15:46
前来学习
作者: fegr    时间: 2024-8-3 15:53
感谢分享
作者: wwwlhp    时间: 2024-8-3 16:08
多谢分享!!!
作者: 13325531750    时间: 2024-8-3 16:13
感谢分享!进来学习一下。
作者: wn168cn@163.com    时间: 2024-8-3 18:20
谢谢分享
作者: 2011medp7060    时间: 2024-8-3 18:25
学习了!
作者: ldg_2    时间: 2024-8-3 18:51
学习下,似懂非懂,感谢分享!
作者: hilsonma    时间: 2024-8-3 19:27
本帖最后由 hilsonma 于 2024-8-3 19:30 编辑

8楼说的启动过程是对的

主要是看主板制造商固化在主板上的引导程序(以前叫bios现在叫uefi),就是rom里面的程序,为了不引起混乱,一般都表达为主板固件

不同的厂家主板固件的内容是不同的,虽然有uefi规范,但厂家不一定完全遵从,或者符合uefi规范了但厂家又做了不同的扩展增强。

所以才会导致从一些设备上得来的经验结论,到另一些设备又不一定符合了。

而nvram则是主板上的存储,相当于以前的cmos,是用来储存一些主板固件检测及设置的数据,也储存了一些系统应用设置的启动数据。

按照uefi规范,uefi启动文件为efi文件,放在fat/fat32分区,路径为
\EFI\发行商目录\
或者
\EFI\发行商目录\Boot\
备用路径为
\EFI\Boot\

U盘使用备用路径

有的主板厂家设定引导分区不局限于fat/fat32,同时支持ntfs等,所以有的主板即使磁盘没有fat/fat32分区也能uefi引导

也有的主板厂家设定不局限于 \EFI\发行商目录,同时支持由用户指定的任意路径,所以有的主板即使引导分区没有 \EFI\Microsoft\Boot 没有\EFI\UOS 没有 \EFI\Boot 这些路径 也能uefi引导

由于uefi规范的存在,\EFI\Boot 这样的路径一般是自动识别的,由于Microsoft是uefi规范发起人之一,所以 \EFI\Microsoft\Boot 一般的主板也是自动识别的,而 \EFI\UOS ,\EFI\Ubuntu 之类通常是由安装程序写到nvram的。

至于优先级及自动改变之类,一般都是主板固件引起的,所以我们要参考uefi规范及主板固件的要求去设置及部署启动文件,尽量做到简单通用。
作者: plutoshen    时间: 2024-8-3 19:47
最可恨的就是不遵守规范胡来的厂家。
作者: ljm008    时间: 2024-8-3 21:13
谢谢,学习下
作者: wsdyleon    时间: 2024-8-4 10:19
确实不错,正想知道的就是这个
网上很多半吊水平的。都会说一些太浅薄的理论,根本没有说明白实质。
作者: wintoflash    时间: 2024-8-4 11:07
本帖最后由 wintoflash 于 2024-8-4 11:10 编辑

是正确的。
其实这些在 UEFI Spec 中都写得很清楚,但很多半桶水的非得自己瞎猜还搞不对。
https://uefi.org/specifications
UEFI Spec 是英文的,但是其实没那么难读,语法都很简单,看不懂的稍微查下就能明白。
作者: plutoshen    时间: 2024-8-4 11:19
wintoflash 发表于 2024-8-4 11:07
是正确的。
其实这些在 UEFI Spec 中都写得很清楚,但很多半桶水的非得自己瞎猜还搞不对。
https://uefi. ...

感谢大佬提供链接。
作者: 邪    时间: 2024-8-4 11:36
其实按规范搞,总没错,一些厂家乱搞,提供的也是额外扩展,总不可能去否定规范标准设计
作者: lbw2007    时间: 2024-8-5 11:12
我想说,很多三线主板根本就不按照uefi开发标准去写,导致启动引导混乱。
至少经验证华硕和微星都是这个逻辑的。支持一下
作者: liujiana    时间: 2024-8-11 01:00
dayeye 发表于 2024-8-3 13:02
我怀疑我的笔记本没有efi文件也可以启动,(删除EFI\Boot文件夹,同时删除EFI\Microsoft\Boot下的bootmgfw. ...

主板自己用shell去找到了,相当于主板内置bootx64.efi
作者: dayeye    时间: 2024-8-11 01:16
liujiana 发表于 2024-8-11 01:00
主板自己用shell去找到了,相当于主板内置bootx64.efi

多次试验,主板只是储存了上次成功启动的BCD菜单。
没有efi时,会自动出现BCD菜单。但不一定能成功启动。
可能成功过,没弄明白原因。


作者: hilsonma    时间: 2024-8-12 06:10
本帖最后由 hilsonma 于 2024-8-12 06:13 编辑
dayeye 发表于 2024-8-11 01:16
多次试验,主板只是储存了上次成功启动的BCD菜单。
没有efi时,会自动出现BCD菜单。但不一定能成功启动 ...

用bootice查看一下UEFI启动序列就知道了
象我的技嘉450MG主板,原来不支持ntfs开机的的,升级l固件后,现在也支持ntfs开机了,不用fat分区也能uefi启动。




作者: ytfqifw    时间: 2024-8-20 14:51
你说的是对的,我就是主板厂商,而且有时放电也不管用,我通常都是刷 BIOS才从彻底从BOOT项里清除这些曾经曾在的值,
作者: wxbxdwq    时间: 2024-8-24 17:11
这个确实值得一看
作者: 假大空    时间: 2024-8-25 19:58
学习了,uefi规范看下
作者: duboy    时间: 2024-10-12 10:27
有种恍然大悟的感觉,感谢楼主分享
作者: 524280981    时间: 2024-10-16 21:21
感谢分享
作者: fdongh    时间: 2024-10-22 08:49

感谢分享
作者: fzzf    时间: 2024-10-22 08:54
谢谢, 值得分享




欢迎光临 无忧启动论坛 (http://wuyou.net/) Powered by Discuz! X3.3