LFS 11.2(Linux From Scratch)构建过程全记录(十): 使 LFS 系统可引导

写在前面:

本文将对LFS系统进行引导配置,包含对/etc/fstab的配置和grub的配置。

本文将进行linux系统内核的安装。

警告:本文中的每个配置都是关键配置,配置一旦错误将会导致系统无法运行,请打起十二分精神!!!

 

/etc/fstab配置

/etc/fstab是用于确定每个分区含义的配置文件。

在10.2中,文章给了你fstab文件的模板,它长这样:

cat > /etc/fstab << "EOF"
# Begin /etc/fstab
# file-system mount-point type options dump fsck
# order
/dev/<xxx> / <fff> defaults 1 1
/dev/<yyy> swap swap pri=1 0 0
proc /proc proc nosuid,noexec,nodev 0 0
sysfs /sys sysfs nosuid,noexec,nodev 0 0
devpts /dev/pts devpts gid=5,mode=620 0 0
tmpfs /run tmpfs defaults 0 0
devtmpfs /dev devtmpfs mode=0755,nosuid 0 0
# End /etc/fstab
EOF

输入完该命令后,并非万事大吉,因为你还要将<xxx>,<yyy>和<fff>设置为正确的内容

 

其中:

 

<xxx>表示root所对应的分区,注意根目录磁盘是配置好的,新的,用于安装LFS的磁盘

<fff>表示root分区的文件系统类型,笔者的文件系统是ext4

下方的<yyy>对应swap分区

对于sdb,笔者的分区情况如下:

 

因此,<xxx>对应sdb3,<fff>对应ext4,<yyy>对应sdb2

但是,我们还有boot分区,该分区也要一并设置进fstab中,我们还要增加boot的设置

填充后的fstab如下表所示:

cat > /etc/fstab << "EOF"
# Begin /etc/fstab
# filesystem mount-point type options dump fsck
# order
/dev/sdb3  /        ext4     defaults            1 1
/dev/sdb1  /boot    ext4     defaults,noauto     0 2
/dev/sdb2  swap     swap     pri=1               0 0
proc       /proc    proc     nosuid,noexec,nodev 0 0
sysfs      /sys     sysfs    nosuid,noexec,nodev 0 0
devpts     /dev/pts devpts   gid=5,mode=620      0 0
tmpfs      /run     tmpfs    defaults            0 0
devtmpfs   /dev     devtmpfs mode=0755,nosuid    0 0
# End /etc/fstab
EOF

然后,考虑到在接下来的设置中,由于磁盘将会互换(详见第二章中提到的),sdb会变为sda,编号不稳定,我们可以用稳定的UUID进行磁盘确认。

我们可以用以下的指令获取磁盘的UUID,命令和输出如下图所示

我们用sdb1/2/3对应的UUID对上面的fstab进行替换,替换后的fstab如下:

cat > /etc/fstab << "EOF"
# Begin /etc/fstab
# file system mount-point type options dump fsck
# order
#/dev/sda3 is the root
UUID=76f5021a-8167-44a2-b374-0f3d1e29cbd4 / ext4 defaults 1 1
#/dev/sda1 is the boot
UUID=b6113556-ac9b-4b3a-9cbd-6d2ee13a2b71 /boot ext4 defaults,noauto 0 2
#/dev/sda2 is the swap
UUID=fd80d9b0-f028-49b6-958c-342c40f35ec9 swap swap pri=1 0 0
proc /proc proc nosuid,noexec,nodev 0 0
sysfs /sys sysfs nosuid,noexec,nodev 0 0
devpts /dev/pts devpts gid=5,mode=620 0 0
tmpfs /run tmpfs defaults 0 0
devtmpfs /dev devtmpfs mode=0755,nosuid 0 0
# End /etc/fstab
EOF

上文是笔者最终采用的写入fstab的代码

警告:该部分fstab切勿直接复制,请确认自己的LFS上root和swap对应的磁盘号和UUID,再确认是否有boot存在,否则LFS有变砖可能

 

Linux内核安装

和普通的包安装一样,我们先解压,再cd,然后执行以下指令,以确保内核源代码绝对干净

make mrproper
make defconfig

 

随后,运行以下代码,以下代码将会进入内核编译配置界面

make menuconfig

这个指令将会打开一个奇怪的配置界面(有点像BIOS)

然后按照下方的提示去完成,提示长这样:

Processor type and features --->
 [*] Build a relocatable kernel [CONFIG_RELOCATABLE]
 [*] Randomize the address of the kernel image (KASLR) [CONFIG_RANDOMIZE_BASE]
General setup --->
 [ ] Compile the kernel with warnings as errors [CONFIG_WERROR]
 < > Enable kernel headers through /sys/kernel/kheaders.tar.xz [CONFIG_IKHEADERS]
General architecture-dependent options --->
 [*] Stack Protector buffer overflow detection [CONFIG_STACKPROTECTOR]
 [*] Strong Stack Protector [CONFIG_STACKPROTECTOR_STRONG]
Device Drivers --->
 Graphics support --->
 Frame buffer Devices --->
 [*] Support for frame buffer devices ----
 Generic Driver Options --->
 [ ] Support for uevent helper [CONFIG_UEVENT_HELPER]
 [*] Maintain a devtmpfs filesystem to mount at /dev [CONFIG_DEVTMPFS]
 [*] Automount devtmpfs at /dev, after the kernel mounted the rootfs [CONFIG_DEVTMPFS_MOUNT]

对于不同的选项,其存在有缩进,缩进表示的是该菜单的级别(因为有二级甚至三级菜单)

我以Support for frame buffer devices举例,这个是要你在菜单中依次选择Device Drivers——Graphics support——Frame buffer Devices,随后在选项中找到Support for frame buffer devices,并将这个选项选上。

这个菜单只能用键盘进行操控,可用的为键盘的上下左右键,以及Y键和N建(笔者没用到N键)

你需要按照上文的提示,对编译进行配置。

 

如果你是64位系统,你需要进行下列配置

Processor type and features --->
 [*] Support x2apic [CONFIG_X86_X2APIC]
Device Drivers --->
 [*] PCI Support ---> [CONFIG_PCI]
 [*] Message Signaled Interrupts (MSI and MSI-X) [CONFIG_PCI_MSI]
 [*] IOMMU Hardware Support ---> [CONFIG_IOMMU_SUPPORT]
 [*] Support for Interrupt Remapping [CONFIG_IRQ_REMAP]

 

如果你在虚拟机环境中,你还需要将以下选项全部选上

警告:如果在虚拟机环境下,没有选择上述的选项,将会导致vfs unable to mount root fs on unknown-block(0 0)的提示,将会导致LFS无法启动

该部分内容在LFS-BOOK中是没有的,但非常重要

Device Drivers --->
   Generic Driver Options --->
      [*] Maintain a devtmpfs filesystem to mount at /dev
   [*]Network device support --->
      [*]Ethernet Driver support --->
         [*] AMD PCnet32 PCI support
   [*]Fusion MPT device support --->
      <*> Fusion MPT ScsiHost drivers for SAS
      <*> Fusion MPT misc device (ioctl) driver  
      [*] Fusion MPT logging facility 
   SCSI device support --->
      [*] SCSI low-level drivers
File Systems --->
    [*] Ext3 Journaling file system support

以下配置假设你在虚拟机中使用SCSI配置的虚拟磁盘(详见笔者第二章)

如果在GRUB引导启动LFS的过程中,出现了以下提示:

vfs unable to mount root fs on unknown-block(0 0)

则说明在配置linux内核的过程中,没有选上上述的选项,需要重新进行配置,重装linux内核即可解决问题。

(如果你不断地进行VMware的镜像,那么这不是什么大问题,莫慌,笔者也挂了一次)

 

完成上述设置后,运行make

接着,运行make modules_install

 

完成后,我们要完成一些文件的复制,命令如下

cp -iv arch/x86/boot/bzImage /boot/vmlinuz-5.19.2-lfs-11.2
cp -iv System.map /boot/System.map-5.19.2
cp -iv .config /boot/config-5.19.2

如果有需要的话,可以安装一些文档,命令如下

install -d /usr/share/doc/linux-5.19.2
cp -r Documentation/* /usr/share/doc/linux-5.19.2

运行下列命令,确保内核源代码目录中所有文件都属于root

chown -R 0:0 ../linux-5.19.2

和一般的包安装相同,我们cd出去,然后清理该安装包,即完成了linux内核的安装。

 

GRUB安装

警告:不正确的GRUB安装及配置将会导致LFS系统无法启动

无需解压和cd,我们直接运行以下命令

grub-install /dev/<sd?>

注意<sd?>通常设置为sda,因为BIOS只在第一块磁盘中读取GRUB信息。

但是,在笔者的系统中,<sd?>设置为了sdb,这是因为在完成安装后,笔者将会在虚拟机中调换两块硬盘的位置,LFS所在的磁盘将会变成sda

 

创建/boot/grub/grub.cfg

警告:该部分需要结合自己电脑的配置进行,不当设置将会导致LFS变砖

cat > /boot/grub/grub.cfg << "EOF"
# Begin /boot/grub/grub.cfg
set default=0
set timeout=5
insmod ext2
set root=(hd0,1)
menuentry "GNU/Linux, Linux 5.19.2-lfs-11.2" {
 linux /vmlinuz-5.19.2-lfs-11.2 root=/dev/sda3 ro
}
EOF

set root=(hd0,1)的含义为:要在第0块硬盘的第1个分区,作为boot所在的分区(即为sda1)

为何设置为sda1?这是因为LFS中的boot分区设置在sdb1,而且未来将会互换LFS和宿主机的磁盘,sdb1将会变为sda1。

root=/dev/sda3 ro的含义为:在互换LFS和宿主机硬盘后,root分区将会出现在sda3的位置。

备注:以上配置为boot为单独分区的配置,如果你没有设置boot分区,那么/vmlinuz-5.19.2-lfs-11.2前需要加一个/boot

 

写在末尾

至此,我们完成了第十章中三个关键的配置

再次警告:这三个配置务必再三确认,在进一步向前时请务必备份,否则你将前功尽弃。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章