无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站投放广告、加入VIP会员,请联系 微信:wuyouceo
查看: 32419|回复: 94
打印 上一主题 下一主题

[转贴] 真正的UEFI启动逻辑

    [复制链接]
跳转到指定楼层
#
发表于 2024-8-3 12:37:03 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
现在的电脑基本上都是采取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,没那么死板。

点评

辛苦了  发表于 2024-8-5 11:22

评分

参与人数 5无忧币 +22 收起 理由
Allreal + 5
baby1277 + 5 解决了我困扰许久的问题
yyz2191958 + 2 赞一个!
易广白 + 5 赞一个!!赞同,真相
cuicongyuan + 5 厉害了我的哥

查看全部评分

88#
发表于 2025-12-25 16:44:32 | 只看该作者
涨知识了,多谢楼主分享及各位大佬的回复
回复

使用道具 举报

87#
发表于 2025-12-25 14:30:55 | 只看该作者
厉害,又学到了
回复

使用道具 举报

86#
发表于 2025-12-25 10:09:10 | 只看该作者
感谢,收获了无上的知识
回复

使用道具 举报

85#
发表于 2025-12-25 09:59:32 | 只看该作者
1. 为啥删了 EFI 分区里的 \EFI\BOOT 文件夹,电脑还能正常启动?
因为 NVRAM 里的启动项根本没指向这个文件夹!它直接指向 Windows 或 Linux 自己的启动文件目录(比如 \EFI\Microsoft 或 \EFI\ubuntu)。\EFI\BOOT 里的文件只是个 “备胎”—— 只有当你直接选设备启动,且 NVRAM 里没对应启动项时,才会用到这个备胎。
2. 为啥换了主板,就只能进 Windows 了?
因为 NVRAM 在主板上!换主板等于换了一块新的 “永久记忆”,原来的启动项全没了。而新主板可能会自动检测硬盘里的 Windows 启动文件,自动加个启动项;Linux 没这待遇,所以就只能进 Windows 了。想恢复 Linux 启动项,得用 Linux 引导盘进系统,再用 efibootmgr 命令修复。
3. 为啥先装 Linux 再装 Windows,就看不到 Linux 的启动项了?
不是看不到,是 Windows 装完后,把自己的启动项设成了 NVRAM 里的第一优先级,电脑开机直接进 Windows,根本不给 Linux 露脸的机会。解决办法很简单:进 BIOS 调启动项顺序,把 Linux 调到前面;或者进 Windows 用工具改,根本不用像有些教程说的 “必须先装 Windows”,纯属没必要。
回复

使用道具 举报

84#
发表于 2025-12-22 09:37:21 | 只看该作者
解决了我困扰许久的问题学习了!感谢分享!
回复

使用道具 举报

83#
发表于 2025-8-15 10:37:13 | 只看该作者
学习了!感谢分享!
回复

使用道具 举报

82#
发表于 2025-8-15 10:22:36 | 只看该作者
解决了我困扰许久的问题
回复

使用道具 举报

81#
发表于 2025-8-12 20:00:12 | 只看该作者
知识渊博啊
回复

使用道具 举报

80#
发表于 2025-8-7 21:29:36 来自手机 | 只看该作者
谢谢分享
回复

使用道具 举报

79#
发表于 2025-8-5 18:33:54 | 只看该作者
dayeye 发表于 2024-8-3 13:02
我怀疑我的笔记本没有efi文件也可以启动,(删除EFI\Boot文件夹,同时删除EFI\Microsoft\Boot下的bootmgfw. ...

不用怀疑,有些引导程序确实不需要efi也能启动系统,比如我电脑的主引导用的是xorboot,直接用它来引导别的分区的win系统,或者引导windows的vhd文件都不成问题,此时我的esp分区中只有一个xorboot的efi文件和它的配置文件。
回复

使用道具 举报

78#
发表于 2025-8-5 17:55:11 | 只看该作者
有个疑问,能否启动vhdx里虚拟的esp分区内的efi引导文件
回复

使用道具 举报

77#
发表于 2025-7-30 10:19:15 | 只看该作者
感谢分享!我慢慢看
回复

使用道具 举报

76#
发表于 2025-7-10 13:25:34 | 只看该作者
伪代码?
回复

使用道具 举报

75#
发表于 2025-6-26 08:38:25 来自手机 | 只看该作者
感谢分享
回复

使用道具 举报

74#
发表于 2025-6-25 13:51:15 | 只看该作者
特意前来学习
回复

使用道具 举报

73#
发表于 2025-6-25 13:44:21 来自手机 | 只看该作者
学习一下
回复

使用道具 举报

72#
发表于 2025-6-6 21:49:29 | 只看该作者

感谢分享
回复

使用道具 举报

71#
发表于 2025-5-31 11:11:24 | 只看该作者
感谢分享,虽然没看懂
回复

使用道具 举报

70#
发表于 2025-5-30 22:39:16 来自手机 | 只看该作者
NVRAM中有没有可能除了列表,还有可执行的.efi文件存在?
回复

使用道具 举报

69#
发表于 2025-5-29 10:33:54 | 只看该作者
感谢楼主分享
回复

使用道具 举报

68#
发表于 2025-5-24 07:56:45 | 只看该作者
谢谢分享
回复

使用道具 举报

67#
发表于 2025-5-22 13:12:53 | 只看该作者
近几年的 电脑 能用  uefishell的  bcfg  加驱动 和序列




回复

使用道具 举报

66#
发表于 2025-5-18 15:39:56 | 只看该作者
看了就知道了解的更多了。
回复

使用道具 举报

65#
发表于 2025-5-18 15:17:23 | 只看该作者
谢谢分享
回复

使用道具 举报

64#
发表于 2025-5-18 15:08:36 | 只看该作者
学习一下。
回复

使用道具 举报

63#
发表于 2025-3-24 21:26:35 | 只看该作者
原来UEFI是这样子启动系统的,真是学到了,也赚到了
回复

使用道具 举报

62#
发表于 2025-3-11 20:37:43 | 只看该作者
dayeye 发表于 2024-8-3 13:02
我怀疑我的笔记本没有efi文件也可以启动,(删除EFI\Boot文件夹,同时删除EFI\Microsoft\Boot下的bootmgfw. ...

用xorboot看一下efi启动序列就清楚了,可能有重复的bootmgfm.efi
回复

使用道具 举报

61#
发表于 2025-2-27 18:28:35 | 只看该作者
看得有点费劲,无非就是优先和默认的区别。很多笔电默认就是Windows,所以优先启动/EFI/Microsoft/Boot/bootmgfw.efi,然后才会考虑默认的/EFI/BOOT/bootx64.efi(32位,bootia32.efi)文件。至于Linux等少数系统,也都是通过bootx64.efi链式启动跳转到grubx64.efi,有些linux比如Ubuntu会自己添加默认的启动项,防止bootx64.efi被抢占。
回复

使用道具 举报

60#
发表于 2025-2-27 14:43:39 | 只看该作者
好东西,学习了
回复

使用道具 举报

59#
发表于 2025-2-27 14:39:16 | 只看该作者
学习了,谢谢!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1 )

闽公网安备 35020302032614号

GMT+8, 2026-1-10 08:44

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表