「GRUB」- 在BIOS系统上的GRUB引导

  CREATED BY JENKINSBOT

本文分为两部分:

	* 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.imgcore.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