所以我有一个支持 UEFI 的主板和三个硬盘:
- /dev/sda——256G SSD(MBR)
- /dev/sdb——230G 硬盘(MBR)
- /dev/sdc——512G SSD(GPT)
由于历史原因,sda 和 sdb 具有 MBR 分区表,它们是较旧的驱动器。sda 驱动器包含一个可运行的 Windows 7 安装,我非常希望保留它,而 sdb 包含大量数据,我也希望保留它...档案和视频等。
sdc 驱动器是我购买的新驱动器,并使用 Windows 磁盘管理器对其进行了分区,以便一半用于 Windows,另一半用于以后的双启动 Linux。我在对其进行分区时没有注意,它创建了一个 GPT 分区表和一个 Microsoft 保留分区。随着时间的推移,sdc 现在包含了大量我不想乱动的数据,是时候安装那个双启动 Linux 了。
由于分区表是 GPT,Grub2 想要在驱动器头部有一个 EFI 系统分区 (ESP)(由 MSR 占用)并且实际上拒绝安装。
我的问题是:
- 我能否将 MSR 从轨道上拆除,然后将其夹在 ESP 和 /boot 中?在安装该硬盘之前,我的 Win7 启动正常,因此我看不出这会有什么影响。
- 如果我将启动顺序更改为使用 UEFI 并从 sdc 启动,它将加载 grub,grub 是否能够从 sda 上的 MBR 进行链式加载(保持 sda 不变)?
(澄清:我并不关心 MSR 占用的空间,它只是妨碍了 ESP 的启动)
答案1
我的问题源于困惑和缺乏知识。我将尝试在这里总结我所学到的知识,希望有人会觉得它有用。
BIOS 与 UEFI 硬件
当您打开计算机电源时,它必须开始执行某个程序。通常,这是主板上包含程序的 ROM,很长一段时间以来,该程序被称为 BIOS,它以特定的(某种程度上)标准方式运行。它控制一些硬件功能等,但最重要的是,它以明确定义的方式将控制权传递给其他介质上的操作系统。
BIOS“标准”程序后来被 UEFI 取代,UEFI 具有相同的用途(大部分),并且它也有将控制权传递给其他媒体上的操作系统的方法。
BIOS 启动
当 BIOS 启动时,它会从主启动设备读取第一个扇区(假定包含引导加载程序)并开始执行它。这个第一个扇区称为主引导记录 (MBR)。假定磁盘使用 DOS 分区方案。
在旧的 DOS 分区方案(有时也称为 MBR)中,MBR 中为引导加载程序保留了高达 446 字节的程序空间。谁会需要超过 446 字节的空间呢?所以,较大的引导加载程序通常会利用 DOS 分区方案的“功能”,即 MBR 后面紧接着有大约 1-2 MB 的未使用空间。引导加载程序将具有“阶段 1”和“阶段 2”,其中阶段 1 存储在 MBR 中,并简单地加载存储在这个“未使用”区域中的阶段 2。
UEFI 启动
当 UEFI 启动时,它假定主启动设备使用 GPT,并寻找具有特定类型的分区,即:“EFI 系统分区”。此分区假定为 FAT 12、16 或 32。一旦找到,它会通过查找名称以 结尾的文件来扫描分区以查找引导加载程序.efi
。
我发现在安装 grub 的上下文中,我读到的文本将 UEFI 启动过程简称为 UEFI,将 BIOS 启动过程简称为 BIOS。这很令人困惑,因为我认为他们谈论的是主板 ROM 上的实际软件。
无论如何,UEFI 主板仍然可以执行 BIOS 启动过程,在 UEFI 设置中通常称为“传统启动”或 CSM。
GPT 和 DOS/MBR
虽然 GPT 与旧的 MBR/DOS 分区方案有很大不同,但它保留了 MBR 分区磁盘上引导加载程序所在的区域。这意味着您可以在 GPT 上的这个保留空间中安装“旧式”引导加载程序并使用 BIOS 引导。但是有一个警告,还记得第 1/2 阶段吗?是的,GPT 没有该“功能”,保留区域仍然只有 446 字节。因此,为了容纳引导加载程序的第 2 阶段,引入了一种特殊的分区类型:“bios_boot”。因此,引导加载程序必须知道它正在安装在 GPT 磁盘上,并找到“bios_boot”分区并将其第 2 阶段放在那里,并让第 1 阶段以某种方式找到这个分区。
概括
因此,有三种方式可以启动:
UEFI 启动 + GPT
创建一个分区来存放引导程序,100 MB 左右应该足够了,将其类型设置为“EFI 系统分区”,使用 FAT 12、16 或 32 格式化。通常将其安装在某个地方/boot/efi
。然后告诉 grub 安装 EFI 加载程序:grub-install --efi-directory=/boot/efi
。
UEFI 启动应该通过查看分区表来找到该分区。
有人告诉我您也可以将 ESP 用于您的“/boot”,但我还没有尝试过。
BIOS 启动 + GPT
创建一个分区来保存加载程序的第 2 阶段,通常为 1-2 MB,并将类型设置为“bios_boot”。您不需要在这个分区上放置文件系统或挂载它,grub 将“拥有”它并执行它需要的操作。此分区在磁盘上的位置应该无关紧要。然后像往常一样在 MBR 上安装 grub。Grubgrub-install /dev/sdx
应该检测到它是一个 GPT 磁盘,找到 bios 启动分区(如果没有找到,它会发出警告!)并安装适当的第 1 阶段和第 2 阶段。
BIOS 启动 + MBR
只需在磁盘上创建一个 DOS 分区方案并用来grub-install /dev/sdx
写入 MBR,不需要 BIOS 启动分区。
使用 GPT 从主驱动器链式加载使用 MBR 的辅助驱动器
因此我发现 grub 出于某种原因不允许从 UEFI 引导加载程序链式加载 BIOS 引导加载程序。我个人不明白为什么这是不可能的,但至少 grub 似乎不支持它。
因此,为了解决我的问题,我在 UEFI 设置中将 GPT 驱动器设置为主启动设备,然后使用 BIOS 启动从 GPT 设备加载 grub,如上所述。这意味着它能够从第一个磁盘上的 MBR 链式加载 Win7。