本文分为两部分:
* BIOS + MBR + GRUB * BIOS + GPT + GRUB
这两种模式下有所区别,下面会一层层的解释这两种方式。通常GPT与UEFI一起使用,因为UEFI只能使用GPT分区表,GPT是UEFI的一部分,但是本文本文讨论的是GPT + BIOS的方式,目前并不涉及UEFI相关的内容。
# 启动原理简述
GRUB由几个镜像文件组成,其中最重要的是:
# boot.img,此图像是GRUB的第一部分。 由于大小限制,它不了解文件系统。它的唯一功能是从本地磁盘加载core.img文件。要使BIOS读取它,此镜像将写入MBR中或分区的引导扇区。
# core.img,它包含足够的模块来访问/boot/grub目录,并在运行时从文件系统加载其他所有内容(包括菜单处理,加载目标操作系统的能力等)。此镜像可以安装在磁盘上的不同区域,具体取决于是使用MBR分区表还是GPT分区表。
所以,就引导来说,这两种模式的主要区别还是在与core.img的位置。
# BIOS + MBR + GRUB
有两个位置用来安装core.img镜像:
# 在MBR后的“空隙”中:“空隙”是MBR和第一个分区之间的区域。由于MBR是512字节,并且第一个分区通常以1MiB(2048个扇区)偏移对齐,因此为core.img留下了足够的空间。
# 在文件系统中,在这种情况下,包含core.img的块列表可以存储在该分区的第一扇区中。需要注意的是,这些块可能会被文件系统移动。 因此,不建议在此处放置core.img镜像。
# BIOS + GPT + GRUB
可以在GPT磁盘上为GRUB保留整个分区,称为「BIOS引导分区」。然后,可以将GRUB嵌入到该分区中,而不会被其他软件覆盖,也不会被包含在可能移动其块的文件系统中。
BIOS引导分区的大小至少应为31KiB。在扇区大小为512字节的GPT磁盘上,第一个可用扇区通常为34。因为:
LBA 0: Protective MBR. LBA 1: GPT header. LBA 2-33: Partition Entry Array.
并且第一个分区通常以1MiB(2048个扇区)偏移对齐。这留下了类似于MBR磁盘上的间隙,可以将它作为「BIOS引导分区」使用。 但是,也可以在磁盘上的不同偏移处创建「BIOS引导分区」。
「BIOS引导分区」还必须具有正确的分区类型,即在gdisk中设置为EF02,或者在parted中设置bios_grub标志。这也是下面错误的原因:
# grub-install /dev/sdd Installing for i386-pc platform. grub-install: warning: this GPT partition label contains no BIOS Boot Partition; embedding won't be possible. grub-install: error: embedding is not possible, but this is required for RAID and LVM install.
你需要创建一个「BIOS引导分区」,专门用于保存core.img镜像。
# 创建BIOS引导分区
下面是在parted中操作:
#!/bin/sh # 假设我们的硬盘是/dev/sdd # parted /dev/sdd GNU Parted 3.2 Using /dev/sdd Welcome to GNU Parted! Type 'help' to view a list of commands. (parted) print Model: Samsung SSD 860 QVO 2TB (scsi) Disk /dev/sdd: 2000GB Sector size (logical/physical): 512B/512B Partition Table: gpt Disk Flags: Number Start End Size File system Name Flags 1 1049kB 1075MB 1074MB ext4 Linux filesystem bios_grub 2 1075MB 538GB 537GB Linux LVM lvm (parted) set 1 bios_grub on (parted) q Information: You may need to update /etc/fstab. # 关键命令是「set 1 bios_grub on」,其中参数「1」是分区编号。 # 另外,「BISO引导分区」不用这么大。我是因为一开始并不懂,所以才分配了这么大。同样1MiB足够了。
!!!「BIOS引导分区」是一个单独的分区,用于存放core.img镜像,不能格式化,不能用作其他的用途。
# 安装GRUB引导
接下来的任务就是安装GRUB引导:
#!/bin/sh grub install /dev/sda update-grub
# 验证
有个Shell脚本,「Boot Info Script」,用于查看系统的引导信息。执行该命令后,他会输出boot.img和core.img镜像的位置。
参考文献
Grub failing to install on Debian/Ubuntu with GPT partitions
GRUB on a BIOS System
gpt/bios grub2 boot problem, diagnostic and tools
Booting from GPT
Legacy BIOS Issues with GPT