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
写在末尾
至此,我们完成了第十章中三个关键的配置
再次警告:这三个配置务必再三确认,在进一步向前时请务必备份,否则你将前功尽弃。