8.4. 使用 GRUB 设定引导过程

8.4.1. 概述

[警告]

警告

如果您不小心错误地配置了 GRUB,而且没有 CD-ROM 之类的备用引导设备,可能会导致您的系统完全无法使用。 本节不是引导您的 LFS 系统的唯一方案, 您可能只要修改现有的启动加载器(如 Grub-Legacy、GRUB2 或 LILO) 配置即可引导 LFS。

您务必保证自己拥有一个紧急引导磁盘,它在计算机不可用(无法引导) 时能够 救援 计算机。如果您现在还没有引导设备, 您可以执行以下命令创建一个。在运行下列命令前,您需要跳到 BLFS, 安装包含 xorriso libisoburn 软件包:

cd /tmp 
grub-mkrescue --output=grub-img.iso 
xorriso -as cdrecord -v dev=/dev/cdrw blank=as_needed grub-img.iso
[注意]

注意

为了在使用 UEFI 的宿主系统上引导 LFS ,在构建内核时, 需要启用 CONFIG_EFI_STUB 功能,正如上一节所述。 不过,可以使用 GRUB2 在没有该功能的情况下引导 LFS, 前提是在系统 BIOS 设定中关闭 UEFI 模式和安全引导 (Secure Boot)功能。关于在 UEFI 环境下引导 LFS 的的详细信息, 可以参阅 http://www.linuxfromscratch.org/hints/downloads/files/lfs-uefi.txt

[注意]

译注

以上 hint 版本较老,译者维护了它的更新版本,参阅 http://svn.linuxfromscratch.org/hints/trunk/lfs-uefi-20180409.txt />。

8.4.2. GRUB 命名惯例

GRUB 使用一种独特的命名结构,为驱动器和分区命名。 分区名的形式为 (hdn,m),这里 n 是硬盘驱动器编号,m 是分区编号。硬盘驱动器编号从 0 开始,但分区号对于主分区来说从 1 开始,而对于扩展分区来说从 5 开始。例如,分区 sda1 在 GRUB 中的名字是 (hd0, 1),而 sda3 的名字是 (hd1, 3)。和 Linux 不同, GRUB 不认为 CD-ROM 驱动器属于硬盘驱动器。例如,如果在 hdb 上有一个 CD-ROM 驱动器, 而 hdc 上有一个次要硬盘驱动器,则第二个驱动器仍然名为 hd1

8.4.3. 设定 GRUB 配置

GRUB 的工作方式是,将数据写入硬盘的第一个物理磁道。 这里不属于任何文件系统,在启动时, 第一个物理磁道中的程序从引导分区加载 GRUB 模块, 默认在 /boot/grub 中查找模块。

引导分区的位置由负责进行配置的用户自己决定, 作者推荐创建一个小的(建议大小为 100 MB)分区, 专门存放引导信息。这样,不同的 Linux 系统(无论是 LFS 还是商业发行版)在启动时和启动后都能访问相同的引导文件。 如果您选择这样做,您需要挂载这个单独的分区,将 /boot 中已有的文件(例如上一节中构建的内核)移动到新的分区中。 之后,解除该分区的挂载,并将它挂载为 /boot, 而且还要注意更新 /etc/fstab

直接使用 LFS 分区也是可以的,但这样在配置多系统启动时比较麻烦。

根据以上信息,确定 LFS 根分区(或 boot 分区)的名称。 下面假设 LFS 根分区(或 boot 分区)是 sda2

将 GRUB 文件安装到/boot/grub 并设定引导磁道:

[警告]

警告

以下命令会覆盖当前启动引导器,如果这不是您希望的, 不要运行该命令。例如,如果您使用第三方启动引导器管理主引导记录 (MBR)。

grub-install /dev/sda

8.4.4. 创建 GRUB 配置文件

生成 /boot/grub/grub.cfg

cat > /boot/grub/grub.cfg << "EOF"
# Begin /boot/grub/grub.cfg
set default=0
set timeout=5

insmod ext2
set root=(hd0,2)

menuentry "GNU/Linux, Linux 4.18.5-lfs-8.3" {
        linux   /boot/vmlinuz-4.18.5-lfs-8.3 root=/dev/sda2 ro
}
EOF
[注意]

注意

GRUB的视角来看, 内核文件的位置相对于它使用的分区。如果您使用了单独的 /boot 分区,需要从上面的 linux 行删除 /boot, 然后修改 set root 行, 指向 /boot 分区。

GRUB 是一个很强大的程序,它提供了非常多的选项, 可以支持多种设备、操作系统和分区类型,还有很多用于定制启动屏幕、 声音、鼠标输入等的选项。这些选项的细节超过了本书的范围, 不予讨论。

[小心]

小心

有一个命令 grub-mkconfig 被用于自动创建配置文件。它使用 /etc/grub.d 中的脚本创建新配置文件,这会覆盖您手动编写的 grub.cfg。 这些脚本主要是为非源代码发行版设计的, 在 LFS 中不推荐使用。但是,如果您安装了商业发行版, 它很可能在发行版中被运行,记得备份 grub.cfg 以防它被覆盖。