在使用 UEFI 和 GRUB 启动的机器上,我亲眼目睹 Windows 决定更改启动顺序。我以为启动顺序只是我和我的主板的事,在引导加载程序、操作系统和所有相关事物的眼中根本就不存在。操作系统如何能够并被允许更改这一点?
关于这种行为的问题之前已经有人问过。
这个问题具体是在问“这怎么可能?”而不是“为什么会发生这种情况?”,“这应该发生吗?”或“我可以允许/禁止这种情况发生吗?”。
答案1
嗯,操作系统就是安装首先是引导加载程序,因此显然它对它具有一些控制权。
UEFI 固件有一个集成的启动管理器,它存储菜单选项和其他参数EFI 变量例如Boot0001
,BootOrder
,BootNext
。
它们与其他固件设置存储在同一个 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 混淆,因为它们完全不同。
当您的计算机启动时,会发生以下情况:
- 它进行 POST 检查
- 控制权交给 BIOS 来选择设备启动。这是操作系统无法控制的。
- 一旦找到要启动的设备,控制权就会传递给该设备。
- 该设备加载引导加载程序,使其能够自动或在用户的控制下启动操作系统。
- 控制权最终传递给操作系统。
通常,引导加载程序位于硬盘的 MBR 部分(前几个扇区),并且通常引用操作系统本身可访问的文件,因此操作系统能随时更改启动顺序。