8.4. 使用 GRUB 设置启动过程

8.4.1. 简介

[警告]

警告

对 GRUB 进行错误的配置可能会导致在没有外置启动设备(某些USB设备,某些 CD-ROM 等)的情况下无法正常的启动。你可能仅仅需要修改当前正在使用的引导器(比如:Grub-Legacy,GRUB2 或 LILO 等)的配置。

一定要确保你有一个可以引导的光盘或者是 U 盘以备不时之需,否则万一电脑真的不能启动谁都救不了你。如果你需要建立可引导的设备,可以按照以下方法操作(跳转到 BLFS 从 libisoburn 软件包安装 xorriso)。

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)功能。详细参见文件 lfs-uefi.txt

8.4.2. GRUB 命名约定

GRUB 对于硬盘和分区自有一套命名规则 (hdn,m),其中 n 是硬盘数,m 是分区号。硬盘数 N 从 0 开始计数,分区数需要区别对待——主分区从 1 开始计数而扩展分区从 5 开始计数。需要注意的是,和早期版本相比,计数方式都有所变化。例如,分区 sda1(hd0,1)sdb3(hd1,3)。Linux 下,并不将 CD-ROM 设备假想为硬盘。例如,就算已有 CD 设备挂载为 hdb,第二块硬盘挂载为 hdc,GRUB 依旧将第二块硬盘称为 (hd1)

8.4.3. 配置配置文件

GRUB 会将一些数据写入硬盘的第一个物理扇区。这一部分不属于任何一个操作系统,在启动时,该部分数据激活,然后寻找 Grub 的模块,Grub 模块的默认位置为 /boot/grub/。

一种建议是使用一个独立的小分区(建议大小 100MB)专用于引导信息。那样的话,每一个发行版,不论是 LFS 还是其他的商业发行版,都能访问相同的引导文件而且任何已经启动的系统都能访问它。如果你选择这么做,你需要挂载这个独立分区,移动所有的文件从当前的 /boot 目录(比如说你上一节刚编译的 Linux 内核)到新的分区。你然后要卸载这个新分区,重新挂载它为 /boot。如果你这么做,一定要更新 /etc/fstab

使用当前的 lfs 分区也没有什么问题,但是在配置多系统启动的时候有些不同。

从以上信息可知,需要确定根分区的磁盘位置(如果使用单独的分区,则需要知道引导分区的磁盘位置),以下假定根分区(或者是磁盘分区)是 sda2

将 GRUB 文件安装到 /boot/grub 然后设置启动扇区:

[警告]

警告

以下命令将会覆盖已有的引导器。如无需要,请勿运行(比如已经有第三方引导器管理 MBR)。

grub-install /dev/sda
[注意]

注意

如果系统是通过 UEFI 引导的,grub-install 将会尝试将文件安装至 x86_64-efi,但是这些文件并未在第 6 章中安装。如果是在这种情况下,在上述命令后面追加 --target i386-pc

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 5.2.8-lfs-9.0" {
        linux   /boot/vmlinuz-5.2.8-lfs-9.0 root=/dev/sda2 ro
}
EOF
[注意]

注意

GRUB 的角度看,内核文件相当于一个分区,所以假如你使用单独的 /boot 分区,请不要在 linux 行添加 /boot。此外还需要将 set root 行指向 /boot 所在的实际分区。

GRUB 功能十分强大,它提供了大量的用于从种类繁多的设备和操作系统、以及不同的分区类型启动的选项。此外还可以定制启动页、播放声音或者是鼠标等。很遗憾的是,这些功能超出本文的范畴,我们一概不予讨论。

[小心]

小心

grub-mkconfig 命令可以自动建立配置文件。它使用位于 /etc/grub.d/ 下的一组脚本且将会忽略用户的设置。这些命令主要用于那些非源码编译的发行版,所以不建议 LFS 用户使用此命令。如果你使用商业发行版,你可以试着运行这个命令(运行之前记得备份原来的 grub.cfg 文件)。