对 GRUB 进行错误的配置可能会导致在没有外置启动设备(某些USB设备,某些 CD-ROM 等)的情况下无法正常的启动。你可能仅仅需要修改当前正在使用的引导器(比如:Grub-Legacy,GRUB2 或 LILO 等)的配置。
一定要确保你有一个可以引导的光盘或者是 U 盘以备不时之需,否则万一电脑真的不能启动谁都救不了你。如果你需要建立可引导的设备,可以按照以下方法操作(跳转到 BLFS 从 libisoburn
软件包安装 xorriso
)。
(译者注:其实你手头可以备一个其它发行版的 LiveCD
制作的可引导 U盘,以备不时之需。Ubuntu、Fedora之类的都是上佳之选。)
cd /tmp grub-mkrescue --output=grub-img.iso xorriso -as cdrecord -v dev=/dev/cdrw blank=as_needed grub-img.iso
GRUB 对于硬盘和分区自有一套命名规则(hdN,M),其中 N 是硬盘数,M 是分区号。硬盘数 N 从 0
开始计数,分区数需要区别对待——主分区从 1 开始计数而扩展分区从 5
开始计数。需要注意的是,和早期版本相比,计数方式都有所变化。例如,分区 sda1
是 (hd0,1),sdb3
是 (hd1,3)。Linux
下,并不将 CD-ROM 设备假想为硬盘。例如,就算已有 CD 设备挂载为hdb
,第二块硬盘挂载为 hdc
,GRUB
依旧将第二块硬盘称为(hd1)。
(译者注:为什么这里扩展分区从 5 计数,可以查看 mbr 的相关知识。早期版本的 GRUB
是什么计算磁盘和分区数,我忘记了,不过,大家就记住新的就好啦。)
GRUB 会将一些数据写入硬盘的第一个物理扇区。这一部分不属于任何一个操作系统,在启动时,该部分数据激活,然后寻找 Grub 的模块,Grub 模块的默认位置为 /boot/grub/。
一种建议是使用一个独立的小分区(建议大小 100MB)专用于引导信息。那样的话,每一个发行版,不论是
LFS 还是其他的商业发行版,都能访问相同的引导文件而且任何已经启动的系统都能访问它。如果你选择这么做,你需要挂载这个独立分区,移动所有的文件从当前的
/boot 目录(比如说你上一节刚编译的 Linux 内核)到新的分区。你然后要卸载这个新分区,重新挂载它为 /boot。如果你这么做,一定要更新
/etc/fstab。
使用当前的 lfs 分区也没有什么问题,但是在配置多系统启动的时候有些不同。
从以上信息可知,需要确定根分区的磁盘位置(如果使用单独的分区,则需要知道引导分区的磁盘位置),以下假定根分区(或者是磁盘分区)是
sda2
。
将 GRUB 文件安装到 /boot/grub
然后设置启动扇区:
以下命令将会覆盖已有的引导器。如无需要,请勿运行(比如已经有第三方引导器管理 MBR)。
grub-install /dev/sda
(译者注:如果实在不知道怎么编写 grub.cfg 文件,或者担心误操作导致系统遭到破坏,可以在宿主系统中安装旧版本的内核,如果有新版本内核也可以直接更新,安装内核的时候它会自动寻找可启动的操作系统,并把它们添加到 fstab 文件中,这样,如果 LFS 配置都正确的话就会找到这个 LFS 系统并添加到 fstab 文件中,重启之后就可以发现 GRUB 菜单中已有 LFS 条目。之后可以再删除这里安装的内核。)
创建 /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 3.19-lfs-7.7-systemd" {
linux /boot/vmlinuz-3.19-lfs-7.7-systemd root=/dev/sda2 ro
}
EOF
从 GRUB 的角度看,内核文件相当于一个分区,所以,假如你使用单独的 /boot 分区,请不要在 linux 行添加 /boot。此外,还需要将 root 行指向 /boot 所在的实际分区。
GRUB 功能十分强大,它提供了大量的用于从种类繁多的设备和操作系统以及不同的分区类型启动的选项。此外还可以定制溅射屏幕、播放声音或者是鼠标等。很遗憾的是,这些功能超出本文的范畴,我们一概不予讨论。
grub-mkconfig 命令可以自动建立配置文件。它使用位于 /etc/grub.d/ 下的一组脚本且将会忽略用户的设置。这些命令主要用于那些非源码编译的发行版,所以不建议 LFS 用户使用此命令。如果你使用商业发行版,你可以试着运行这个命令(运行之前记得备份原来的 grub.cfg文件)。