我研究过,在启动过程中,在第一阶段,启动设备的 MBR 中的启动加载程序会查看分区表以查找活动分区的启动扇区,一旦找到活动分区,它就会搜索第二阶段的启动加载程序(例如:GRUB),然后将其加载到 RAM 中。第二阶段的启动加载程序位于 /boot 目录下。
Q1) 如果系统有两个不同的操作系统怎么办?当第一阶段引导加载程序查找活动分区时,是否会显示选择其中一个操作系统的显示菜单?
Q2) 如果系统上的 2 个操作系统是 2 个不同的 Linux 发行版,那么如果两个发行版在其 /boot 目录下都有相同的引导加载程序,那么这些操作系统菜单会在哪个阶段出现供用户选择第一阶段还是第二阶段?
答案1
不,活动分区是 DOS/Windows 的东西 - 它是“可引导”标志。虽然许多/大多数 BIOS 都会寻找它,但在非 x86 硬件上它可能不存在或不在乎。 https://en.wikipedia.org/wiki/Boot_flag
一旦 BIOS(或同等程序)找到了引导加载程序 - 通过搜索标志、在默认位置查找等 - 引导加载程序的配置将确定启动哪个操作系统,或显示菜单等。
这种情况如何发生取决于引导加载程序 - 回到“过去”,为了双启动 Windows NT 4 和 Linux,我们会将 lilo 写入分区/
,然后剥离前 512 个字节dd
放入文件中,并将其放在 Windows 引导加载程序 ( ntldr
) 可以看到的地方,然后在C:\boot.ini
文件中创建一个引用它的条目,并将默认启动选项更改为 Linux。当然,每次新的内核升级都需要重新编写 lilo 并将这 512 个字节重新剥离到文件中...
答案2
过去一两年购买的大多数机器都默认使用 UEFI 来启动系统,其优点是安全启动、操作系统与固件交互的更好方式、远程证明、更好地处理高清加密以及其他一些功能。
UEFI 固件可以通过几种方式选择要启动的内容。
在最兼容模式下,固件将在驱动器上查找分区类型为 UUID C12A7328-F81F-11D2-BA4B-00A0C93EC93B 的 GUID 分区。(在 fdisk 中输入 ef00)。此分区的格式为 FAT32(我不确定这是否是标准中的严格要求,但我不知道有任何实际固件可以启动其他任何东西,但 coreboot 可能会)。在此分区上,固件将运行 /BOOT/EFI/BOOTX64.efi(适用于 x64)。这是引导加载程序,可以做任何它想做的事情。事实上,linux 内核是一个 EFI 可执行文件,运行时它将启动 Linux!
另一种方法是从 EFI NVRAM 读取启动项。这是大多数引导加载程序(如 windows 加载程序或 grub-efi)的方法。这将向特定于固件的启动菜单添加一个条目(通常在启动时通过类似 F12 的命令访问),并且该条目将指向 efi 系统分区上的特定可执行文件。这样,即使有人破坏了 BOOTx64.efi,您仍然可以轻松启动系统。这种方法在某些机器上可能存在很多错误。例如,NVRAM 应该在删除变量后运行一些垃圾收集来回收空间,但某些较旧的固件不会这样做,如果您写入太多变量,它们就会变砖。我自己的联想 X220 固件根本无法从 NVRAM 条目启动,只能加载 bootx64.efi。不过,过去 4 年内生产的任何机器都应该没问题。
大多数 Linux 发行版都会将 grub(或它们使用的任何引导加载程序)安装在 ESP(efi 系统分区)上的某个目录(如 /fedora/...)中,因此您可以从 EFI 引导菜单中选择您喜欢的任何副本。如果您为给定的 Linux 安装了 os-prober,那么它的 grub 版本可能能够找到 Windows 的引导加载程序并从 grub 菜单为您运行它。
判断您是否使用 EFI 启动的一个快速方法是启动 Windows 10,然后查看显示的徽标是 Windows 徽标还是机器制造商的徽标。如果不是 Windows 徽标,则表示您处于 EFI 模式。