操作系统如何改变启动顺序?

操作系统如何改变启动顺序?

在使用 UEFI 和 GRUB 启动的机器上,我亲眼目睹 Windows 决定更改启动顺序。我以为启动顺序只是我和我的主板的事,在引导加载程序、操作系统和所有相关事物的眼中根本就不存在。操作系统如何能够并被允许更改这一点?

关于这种行为的问题之前已经有人问过。

Windows 8 更改启动顺序

这个问题具体是在问“这怎么可能?”而不是“为什么会发生这种情况?”,“这应该发生吗?”或“我可以允许/禁止这种情况发生吗?”。

答案1

嗯,操作系统就是安装首先是引导加载程序,因此显然它对它具有一些控制权。

UEFI 固件有一个集成的启动管理器,它存储菜单选项和其他参数EFI 变量例如Boot0001BootOrderBootNext

它们与其他固件设置存储在同一个 NVRAM 中 - 事实上,许多固件设置也作为 EFI 变量公开 - 操作系统可以通过调用 EFI 代码来读取/写入它们。(这类似于通过旧式中断调用 BIOS,只是 UEFI 接口定义得更好一些。)

# ls /sys/firmware/efi/efivars/Boot*
/sys/固件/efi/efivars/Boot0003-8be4df61-93ca-11d2-aa0d-00e098032b8c
/sys/固件/efi/efivars/Boot0004-8be4df61-93ca-11d2-aa0d-00e098032b8c
/sys/固件/efi/efivars/Boot0005-8be4df61-93ca-11d2-aa0d-00e098032b8c
/sys/固件/efi/efivars/Boot0006-8be4df61-93ca-11d2-aa0d-00e098032b8c
/sys/固件/efi/efivars/BootCurrent-8be4df61-93ca-11d2-aa0d-00e098032b8c
/sys/固件/efi/efivars/BootOrder-8be4df61-93ca-11d2-aa0d-00e098032b8c

# efibootmgr——详细
启动电流:0004
超时:2 秒
启动顺序:0004,0003,0005,0006
Boot0003* Windows 启动管理器 HD(1、GPT、785c8ca2-bb16-48fd-917b-19d69543338f、0x800、0x32000)/文件(\EFI\Microsoft\Boot\bootmgfw.efi)
Boot0004* Linux 启动管理器 HD(1,GPT,785c8ca2-bb16-48fd-917b-19d69543338f,0x800,0x32000)/文件(\EFI\gummiboot\gummibootx64.efi)
Boot0005* 硬盘 BBS(HD,,0x0)P0: ST9640320AS。
Boot0006* CD/DVD 驱动器 BBS(CDROM,,0x0)P1:SlimtypeDVD A DS8A5SH。

# efibootmgr --bootnext 0003
下一个引导:0003
启动电流:0004
超时:2 秒
启动顺序:0004,0003,0005,0006
...

#efivar--打印--名称8be4df61-93ca-11d2-aa0d-00e098032b8c-Boot0004
GUID:8be4df61-93ca-11d2-aa0d-00e098032b8c
名称:“Boot0004”
属性:
    非挥发性
    启动服务访问
    运行时服务访问
价值:
00000000 01 00 00 00 72 00 4c 00 69 00 6e 00 75 00 78 00 |....rLinux|
00000010 20 00 42 00 6f 00 6f 00 74 00 20 00 4d 00 61 00 | .Boot .Ma|
00000020 6e 00 61 00 67 00 65 00 72 00 00 00 04 01 2a 00 |nager....*.|
00000030 01 00 00 00 00 08 00 00 00 00 00 00 00 20 03 00 |............. ..|
00000040 00 00 00 00 a2 8c 5c 78 16 bb fd 48 91 7b 19 d6 |......\x...H.{..|
00000050 95 43 33 8f 02 02 04 04 44 00 5c 00 45 00 46 00 |.C3.....D.\.EF|
00000060 49 00 5c 00 67 00 75 00 6d 00 6d 00 69 00 62 00 |I.\.gummib|
00000070 6f 00 6f 00 74 00 5c 00 67 00 75 00 6d 00 6d 00 |oot\.gumm|
00000080 69 00 62 00 6f 00 6f 00 74 00 78 00 36 00 34 00 |ibootx6.4.|
00000090 2e 00 65 00 66 00 69 00 00 00 7f ff 04 00 |..efi......|

# efivar——打印——名称 8be4df61-93ca-11d2-aa0d-00e098032b8c-BootNext
GUID:8be4df61-93ca-11d2-aa0d-00e098032b8c
名称:“BootNext”
属性:
    非挥发性
    启动服务访问
    运行时服务访问
价值:
00000000 03 00 |..|

该列表通常包含 UEFI 引导加载程序和“BIOS 兼容模式” MBR 磁盘。


在 BIOS 系统中,无法直接访问此配置。但是,操作系统当然可以用自己的引导扇区覆盖现有的引导扇区,事实上,操作系统几乎总是会这样做因为无需配置;例如安装 Windows始终会写入 Windows 启动扇区


附注:“EFI 变量”并非特定于 EFI——类似的技术也存在于ARC 系统Windows NT 最初就是基于此开发的;Windows 使用的 NTLDR 引导加载程序和“boot.ini”文件在某种程度上只是仿真ARC 本身能够提供的功能。

答案2

这是可能的,因为操作系统可以控制引导加载程序。您可能会将引导加载程序与 BIOS 混淆,因为它们完全不同。

当您的计算机启动时,会发生以下情况:

  1. 它进行 POST 检查
  2. 控制权交给 BIOS 来选择设备启动。这是操作系统无法控制的。
  3. 一旦找到要启动的设备,控制权就会传递给该设备。
  4. 该设备加载引导加载程序,使其能够自动或在用户的控制下启动操作系统。
  5. 控制权最终传递给操作系统。

通常,引导加载程序位于硬盘的 MBR 部分(前几个扇区),并且通常引用操作系统本身可访问的文件,因此操作系统随时更改启动顺序。

相关内容