GRUB 2
2018-12-23 21:40:13 阿炯

对于大多数人来说,引导加载程序并不是操作系统中最让人激动的部分,但它们却是极其重要的。没有正常运行的引导加载程序,什么也干不了。现在从老的 Grand Unified Bootloader (GRUB) Legacy 工具到新的 GRUB 2 过渡正在进行。GRUB 2 是 Ubuntu 9.10 中的默认引导加载程序,也是其他许多主流 Linux 发行版的默认引导加载程序。GRUB 是一个多重启动管理器。GRUB 是 GRand Unified  Bootloader 的缩写,它可以在多个操作系统共存时选择引导哪个系统。它可以引导几乎所有的 Unix、Linux、Windows 操作系统。它可以载入操作系统的内核和初始化操作系统,或者把引导权交给操作系统来完成引导。

引导加载程序剖析

下图显示的是 GRUB Legacy 和 GRUB 2 各自实现的启动过程。基本输入/输出系统(BIOS)是计算机运行的第一段代码,它存储在计算机固件中。BIOS 加载启动设备的第一个扇区并运行其包含的代码。对于硬盘,第一扇区就是主引导记录(MBR),它包含引导加载程序的第一步和 MBR 分区表。由于大多数磁盘设备扇区大小为 512 字节,因此第一步引导加载程序代码都很小。大多数引导加载程序,包括 GRUB Legacy 和 GRUB 2,将附加代码放在磁盘其他地方。至于 GRUB Legacy,其附加代码,即 stage 1.5,,一般都放在紧跟 MBR 后的未分配区域。还有其他代码,即 stage 2,存放在 Linux 启动分区(通常是 /boot 目录),尽管图 1 为了简化省略了这些文件。 同样,在多操作系统配置中,次级引导加载程序可能将额外配置文件存放在别处。


GRUB 和 GRUB 2 包含若干按序加载运行的子部件

GRUB 和 GRUB 2 启动过程的结构图,若干子部件按序加载运行。

GRUB 2 与 GRUB Legacy 在大体形式上相似,但它取消了 stage 1.5 并实现了模块化配置方法,其中处理各种分区系统、文件系统和扩展部分的代码存储在磁盘文件中 — 一般是在 /boot/grub。

以上描述的配置的变体在 GRUB Legacy 和 GRUB 2 中都可能。例如,有可能将 GRUB 的 stage 1 代码安装在 Linux 启动分区的第一个扇区,而不是 MBR 中。这种方式下,另一个引导加载程序驻留在 MBR 中,仅当引导加载程序链式加载 GRUB 时才出现 GRUB 菜单。由于 Extensible Firmware Interface (EFI) 最终可能代替 BIOS 作为标准 PC 固件,它提供了内置引导加载程序,GRUB 2 在基于 EFI 的系统中可以使用与此类似的配置。

如果您想在运行的系统中用 GRUB 2 取代 GRUB Legacy,必须安装新的 GRUB 2 包,配置其文件,并执行一个特殊命令用 GRUB 2 等效部分替代现有 GRUB Legacy MBR 及特殊隐藏代码。如果您切换到 GRUB 2 是由于正在安装使用 GRUB 2 作为默认启动程序的新发行版,则无需进行这些步骤。无论那种情况,都必须懂得新的 GRUB 2 配置文件格式以及新启动程序的总体特性。

GRUB 2 改进

对只有 Linux 的系统,GRUB Legacy 处理引导加载程序的工作相当出色。过渡到 GRUB 2 的部分原因是由于引导加载程序的开发。GRUB Legacy 所含的代码让开发人员觉得凌乱不堪难以维护。为了添加新特性,他们宁愿重新编写而不是在原有基础上添加。事实上对系统管理员来说,GRUB 2 有几个特性,现在已经或将来将会相当重要:

    平台支持:GRUB Legacy 只能在 x86 和 x86-64 系统上工作。GRUB 2 的目标是可在更多的架构上工作,尽管除了 x86 和 x86-64,在其他架构上使用 GRUB 2 的文档还相当少。它确实可在 PowerPC® 和 Scalable Process Architecture (SPARC) 系统上工作。
    
    固件支持:GRUB 2 支持额外固件类型,包括 BIOS、EFI 和 OpenFirmware。至于对非通用 CPU 的支持方面,至少有一些对非常用固件的支持,但只能看做试验性质的。
    
    分区表:官方说法是, GRUB Legacy 只支持老的 MBR 分区模式。尽管如此,许多 Linux 软件包,带有包含非正式 GUID Partition Table (GPT) 支持的 GRUB Legacy 版本。GRUB 2 包含正式 GPT 支持。
    
    RAID 和 LVM:GRUB Legacy 不支持基于软件的独立磁盘冗余阵列(RAID)和 Logical Volume Manager (LVM) 配置。这意味着必须有至少一个标准分区(或 RAID 1 配置)文件系统,这样 GRUB Legacy 才能读取配置文件。GRUB 2 支持 Linux 格式的 RAID 和 LVM。因此,只要有 RAID 或 LVM 分区就可配置系统。
    
    文件系统支持:为了读取配置文件,GRUB 必须能读取保存这些文件的文件系统。GRUB Legacy 支持的文件系统很少,包括 Second Extended Filesystem (ext2fs)、File Allocation Table (FAT)、Journaling File System (JFS)、ReiserFS 和 Extents File System (XFS)。对于只有 Linux 的系统,GRUB 2 中的文件支持与 GRUB Legacy 一样;尽管如此,GRUB 2 支持更多的非 Linux 文件系统,例如 Apple 的 Hierarchical File System Plus (HFS+)、Microsoft 的 NTFS 文件系统,以及 Sun 的 ZFS。
    
    内核支持:GRUB Legacy 可以直接启动 Linux、FreeBSD、NetBSD、OpenBSD 及所有遵循 Multiboot Specification 的操作系统。这些包含 GNU HURD 内核、OpenSolaris,还有其他一些内核。GRUB 2 也能启动这些内核,以及 XNU(Mac OS X 和 Darwin 内核)。启动其他操作系统,例如 Windows®,需要 GRUB Legacy 和 GRUB 2 链式加载其他引导加载程序。

配置 GRUB 2

如果您已熟悉 GRUB Legacy,将会发现 GRUB 2 配置文件大体类似,但细节上有差异。您也应当知道配置 GRUB 2 的替代方法。

配置文件示例

GRUB 2 配置文件默认位置是 /boot/grub/grub.cfg。有些 Linux 软件包使用 /boot/grub2/grub.cfg,同时启用 GRUB Legacy 和 GRUB 2 安装程序。清单 1 显示的是 GRUB 2 配置文件示例。

清单 1. GRUB 2 配置文件示例

set timeout=10
set default=0
 
menuentry "Linux (2.6.32.2 kernel)" {
  set root=(hd1,8)
  linux /bzImage-2.6.32.2 ro root=/dev/sdb4
  initrd /initramfs-x86_64-2.6.32.2
}
 
menuentry "Windows 7" {
  set root=(hd1,2)
  parttool (hd0,1) hidden+
  parttool (hd1,5) hidden-
  chainloader +1
}

如果您熟悉 GRUB Legacy,将会发现基本的 GRUB 2 配置文件类似。与 GRUB Legacy 配置文件相似,GRUB 2 文件开始部分是设置各个全局选项 — 本例将超时值设为 10 秒并设置默认菜单项。

文件接下来是一系列菜单项。这些条目的形式与 GRUB Legacy 不同,其目的一样:每一个定义单独的操作系统或启动变量,如不同的 Linux 内核。每个菜单项开始是 menuentry 关键字,然后是出现在 GRUB 2 菜单中的引用标记名。菜单项相关的选项出现在大括号({})中。

配置文件变化

GRUB Legacy 与 GRUB 2 配置文件格式的几处变化值得一提:

    GRUB 2 在选项和值之间使用 set 关键字和等号(=)。而 GRUB Legacy 中同样的选项省略了 set 关键字和等号。
    
    在 GRUB Legacy 中,菜单项以关键字 title 开始,直到行尾的文本都是标题。菜单项定义的其余部分在下面的行中,没有大括号定义;菜单项以下个菜单定义的开始而结束。
    
    GRUB Legacy 使用 kernel 关键字来指定 Linux 内核;GRUB 2 使用 linux。
    
    其他一些具体选项名称也变化了。例如,清单 1 使用的新的 parttool 命令,在 Windows 7 定义中,它可以执行简单的分区操作。清单 1 使用该特性隐藏或显示某个分区,以便控制让 Windows 7 可以列出哪些分区。GRUB Legacy 中同样的命令是 hide 和 unhide。

清单 1 中另一项变化相当重要但不明显:GRUB 2 中分区数字从 1 开始,GRUB Legacy 中从 0 开始。而磁盘编号却没有 实现相同的改变。因此,GRUB Legacy 中第一块磁盘的第一个分区是 (hd0,0),而在 GRUB 2 中是 (hd0,1)。应当注意这个细节,因为它会造成潜在的问题!

使用新的 GRUB 2 特性

GRUB 2 实现了许多新特性,有些对标准 Linux 安装几乎没有什么影响或不会直接影响配置文件。一些需要调整的重要选项如下:

    GRUB 2 的模块化性质意味着您可以显式加载模块支持各种特性。insmod 模块加载已命名的模块,比如,insmod lvm 用于加载 LVM 支持。模块保存在 /boot/grub中,其文件名称以 .mod 结束。很多情况下,不必要显式使用 insmod ,这是因为 GRUB 2 自动加载很多模块;尽管如此,有时可能需要手动加载。
    
    GRUB 2 实现了新的脚本特性,可以启用保存数据、根据情况执行等等。关于这些特性的文档很少;尽管如此,它们在语法上与 bash 脚本特性类似。

重新设置 GRUB 2 的替代方法

Ubuntu 9.10 使用 grub-mkconfig 工具和 /etc/grub.d 中匹配的脚本自动重写系统安装程序中的 /boot/grub/grub.cfg 文件。该脚本在内核升级或其他动作后自动运行,无需干预。因此,如果手动修改,应该注意备份 grub.cfg 文件。

有些情况下,也可以主动运行 grub-mkconfig。如果已有默认配置,并在系统中刚加入新内核,只要在 GRUB 2 配置文件中检测并添加新内核就行了。如果还要进行其他特定更改,只需直接编辑 /etc/grub.d 中的文件。这些文件实际是 bash 脚本。每个脚本都告诉系统如何定位内核或操作系统的具体类型并将相应的条目添加到 /boot/grub/grub.cfg 中。

另一个由 grub-mkconfig 引用的文件是 /etc/default/grub。该文件保存最终的 /boot/grub/grub.cfg 文件的全局默认值。也有第三方编写的工具和脚本来帮助管理 GRUB 2 安装程序,例如 StartUp Manager。该图形用户界面(GUI)工具随 Ubuntu 发布,并提供点选式界面来管理 GRUB Legacy 和 GRUB 2 安装程序。

安装和使用 GRUB 2

GRUB 2 与 GRUB Legacy 一样,只能安装一次。然后,引导加载程序读取 /boot/grub/grub.cfg 文件并显示启动菜单。但在安装之前,您可能会考虑分区规划。安装完 GRUB 2,您应该知道启动时操作的一些基本特性。

为 GRUB 2 准备分区

使用 MBR 分区模式的磁盘在安装 GRUB 2 时无需特别准备。从技术上讲,GPT 也是一样;尽管如此,如果一个 GPT 磁盘包含 BIOS 启动分区,GRUB 2 将在该分区存放额外的代码。如果 BIOS 启动分区未显示,GRUB 2 将依赖 /boot 目录中文件对应的一组磁盘扇区。如果您调整过该文件系统,扇区列表将会无效,导致 GRUB 不能启动。因此,强烈建议在 GPT 磁盘中使用 BIOS 启动分区。

BIOS 启动分区应该至少有 31KB。更大一些没有坏处,因为如果 GRUB 需求在以后改变,将会很有用。在近期的 GNU Parted 版本中,可以将分区上的 bios_grub 选项设成 BIOS 启动分区。在 GPT fdisk 中,将分区类型代码改成 EF02。

安装 GRUB 2

用与 GRUB 同样的方法将 GRUB 2 安装到磁盘的 MBR,使用 grub-install 命令(有些发行版将命令重命名为 grub2-install)。将想要安装的磁盘设备名传递给命令 — 通常是 /dev/sda 或 /dev/hda。

通常可以通过输入以下内容将 GRUB Legacy 安装到分区的启动扇区(如 /dev/sda4):
grub-install /dev/sda4

(根据需要改变分区设备文件名。)但这对 GRUB 2 不起作用。输入以下内容可能 会解决这个问题:
grub-setup --force /dev/sda4

(根据需要改变分区设备文件名。)尽管如此,这个方法不总是有效。

运行时 GRUB 2 使用

在常规使用过程中,GRUB 2 与 GRUB Legacy 类似:启动计算机时,当 BIOS 执行检查后,操作系统和内核选项菜单会出现。使用方向键选择想要启动的项,然后按下 Enter。如果未选择,将会启动默认项,这取决于配置文件选项。

如果某项不起作用,可以通过使用 GRUB 2 的编辑模式对其做一次性修改。与按下 Enter 键启动不同的是,按下 E 键编辑。您将会看到一个建议编辑器,它接受类似 Emacs 的编辑选项。完成后,按下 Ctrl-X 按照修改过的选项启动。

如果 GRUB 2 不能定位到其配置文件,它将会显示 grub> 提示。可以输入 GRUB 2 命令,包括那些将在配置文件的菜单项中使用的命令。如果您对 GRUB 2 足够熟悉,就可以启动计算机。不幸的是,关于使用 GRUB 2 的命令行模式进行故障排查的详细描述内容,其长度将会是本文的好几倍。

是否应该使用 GRUB 2

使用 GRUB 2 最令人信服的理由是您正使用默认安装它的发行版或您需要访问它不常用的特性,如直接启动 XNU 内核的能力。其余大多情况下,GRUB 2 几乎没有强于 GRUB Legacy 的优势。一个介于两者之间的情况是您在基于 BIOS 的电脑上使用 GPT。GRUB 2 支持这种配置,但标准 GRUB Legacy 不支持。可以使用带 GPT 支持的 GRUB Legacy 补丁版本,多数现代发行版都附带这个版本,但您可能宁愿使用带正式 GPT 支持的引导加载程序。

基本原则是:如果您已经安装的版本工作正常,最好保持现状。改变引导加载程序可能导致系统无法启动,而修改该问题将会是件苦差事。这就是说,GRUB 2 可能取代 GRUB Legacy 向前发展,因此如果您想熟悉一下 GRUB 2,最好用测试系统或虚拟机。您迟早会发现 GRUB 配置文件格式已改变,因为发行版已改变其引导加载程序。提前了解一些相关知识将帮助您平稳适应变化,而不会感到惊讶。

Grub2是目前比较流行的一款boot loader,其中有部分为二进制可执行文件,另外为脚本文件。比较常用的有grub2-mkimage,grub2-mkfont,grub2-mkstandalone,grub2-install,grub2-mkconfig,grub2-mknetdir等。各种可执行文件配合模块文件,能够发挥grub2的最大功效。见下表:
命令解析
grub2-install将grub2直接安装到硬盘、U盘等可引导介质中。
grub2-mkconfig针对存有内核镜像的介质,生成grub.cfg配置文件。
grub2-mkimage配置并生成grub.efi文件。
grub2-mkfont配置并生成grub2可识别的字体。
grub2-mkstandalone配置并生成grub.efi文件,可以将任意文件增添到grub.efi中。
grub2-mknetdir配置并生成用于在PXE启动中的文件架构。


最新版本:2.0
GRUB 2.04 发布了,距 GRUB 上一次发布 2.02 版本已两年有余,再上一个版本 2.0 则发布于 2012 年。新版本带来的一些新功能:
支持 GCC 8 和 9
Gnulib 整合大修
支持 RISC-V
支持 Xen PVH
支持本机 UEFI 安全启动
UEFI TPM 驱动程序
新的 IEEE 1275 obdisk 驱动程序
支持 Btrfs RAID 5 和 RIAD 6
支持 PARTUUID
支持 VLAN
支持本地 DHCP
许多 ARM 和 ARM64 修复
许多 SPARC 修复
许多 IEEE 1275 修复
以及大量其他修复
更多详情请参阅发行公告

GRUB 2.06 已于2021年6月上旬发布,上一次的 GRUB 2.04 版本发布是在 2019 年。GRUB 2.06 原计划于 2020 年发布,在延时了一年后则终于正式面世;事实上,其候选版本从 3 月开始就可以进行测试,直至现如今才被认为足够稳定。新版本带来的一些新功能如下:
GCC 10 支持
clang 10 支持
SBAT 支持
LUKS2 支持
删除 small MBR gap 支持
支持 Xen 安全模块(XSM/FLASK)
类似于 Linux 内核的锁定机制
默认情况下禁用 os-prober
GRUB 的许多 backport 发行版都有特定的补丁
BootHole 和 BootHole2 的修复
以及大量的其他修复


参考来源:

迁移到 GRUB 2

ArchLinux-GRUB

在UEFI平台通过grub2引导各种介质操作系统