内核

5.1.1 安装内核

  • 大致构建用时: 5.0 - 125.0 SBU(通常约为 9 SBU)
  • 所需磁盘空间: 1200- 6750 MB(通常约为 1500 MB) 解压并进入软件包:
tar -xf linux-5.8.3.tar.xz
cd linux-5.8.3

首先,为保证内核树的绝对干净,执行如下命令:

make mrproper

接着,根据当前系统的架构生成一份基础配置:

make defconfig

然后,展开可视化配置界面:

make menuconfig

可视化配置界面的上部介绍了操作方法:方向键控制上下左右,回车进入子菜单,Y 是选中,N 是取消选中。此外,还有“/”用于搜索。一个个翻找会耗费大量时间,使用搜索可以很快确认完必要的配置。

确认以下的选项的选中情况,请务必保持一致,即有要确保选中,没有的确保不要选中,不然可能会导致最终系统无法启动。 需要注意的选项 System V 版本和 systemd 版本有所不同,先来看 System V 版本。

Device Drivers  --->
  Generic Driver Options  --->
   [ ] Support for uevent helper [CONFIG_UEVENT_HELPER]
   [*] Maintain a devtmpfs filesystem to mount at /dev [CONFIG_DEVTMPFS]

Kernel hacking  --->
       Choose kernel unwinder (Frame pointer unwinder)  ---> [CONFIG_UNWINDER_FRAME_POINTER]

接着是 systemd 版本,如果构建的是 systemd 版本,那么以下的选项状态需要注意。

General setup -->
   [ ] Enable deprecated sysfs features to support old userspace tools [CONFIG_SYSFS_DEPRECATED]
   [ ] Enable deprecated sysfs features by default [CONFIG_SYSFS_DEPRECATED_V2]
   [*] open by fhandle syscalls [CONFIG_FHANDLE]
   [ ] Auditing support [CONFIG_AUDIT]
   [*] Control Group support [CONFIG_CGROUPS]
Processor type and features  --->
   [*] Enable seccomp to safely compute untrusted bytecode [CONFIG_SECCOMP]
Networking support  --->
  Networking options  --->
   <*> The IPv6 protocol [CONFIG_IPV6]
Device Drivers  --->
  Generic Driver Options  --->
   [ ] Support for uevent helper [CONFIG_UEVENT_HELPER]
   [*] Maintain a devtmpfs filesystem to mount at /dev [CONFIG_DEVTMPFS]
   [ ] Fallback user-helper invocation for firmware loading [CONFIG_FW_LOADER_USER_HELPER]
Firmware Drivers  --->
   [*] Export DMI identification via sysfs to userspace [CONFIG_DMIID]
File systems  --->
   [*] Inotify support for userspace [CONFIG_INOTIFY_USER]
   <*> Kernel automounter version 4 support (also supports v3) [CONFIG_AUTOFS4_FS]
  Pseudo filesystems  --->
   [*] Tmpfs POSIX Access Control Lists [CONFIG_TMPFS_POSIX_ACL]
   [*] Tmpfs extended attributes [CONFIG_TMPFS_XATTR]
Kernel hacking  --->
       Choose kernel unwinder (Frame pointer unwinder)  ---> [CONFIG_UNWINDER_FRAME_POINTER]

如果是实机安装的需要注意是否使用 UEFI 进行引导,如果是的话,需要保证选中下列选项。

Processor type and features  --->
   [*]   EFI stub support  [CONFIG_EFI_STUB]

这里举个例子,比如需要检索了 EFI 相关的那个条目,按“/”然后输出 CONFIG_EFI_STUB,然后按回车检索会得到下面的结果。

很幸运,只检索出了一个条目,我们可以看到:

(1)   -> EFI runtime service support (EFI [=y])

如果有其他条目,除了这个(1)以外,还会有(2)(3),按相应的数字就可以进入条目进行修改。 当然,如果只是想了解条目的选中情况,第一行已经告诉我们,该条目处于未选中状态。请使用这个方法,根据上述分版本列出的条目全部确认一下。如果有更改的话,记得保存变更。

Symbol: EFI_STUB [=n]

修改完配置后,我们开始编译内核:

make

并安装模块:

make modules_install

我们需要将一些文件复制到/boot 目录下。如果/boot 有独立分区,那么文件就应该复制到/boot 分区中去。简单的解决方法就是在执行前将/boot 分区绑定到宿主的/mnt/lfs/boot。以宿主系统中的 root 用户运行:

mount --bind /boot /mnt/lfs/boot

内核映像文件所在的实际目录根据主机系统架构会有所不同。文件名也可以根据个人喜好修改,不过为了兼容配置引导过程中的自动设定,最好以 vmlinuz 开头。下面的命令假设主机是 x86 架构:

cp -iv arch/x86/boot/bzImage /boot/vmlinuz-5.8.3-lfs-10.0

System.map 是内核的符号文件,映射了每一个内核 API 函数的入口,以及内核运行时的数据结构地址,是调查内核问题时的资源。运行下面的命令复制映射文件:

cp -iv System.map /boot/System.map-5.8.3

指令 make menuconfig 中生成的内核配置文件.config 包含了当前编译的内核的所有配置。最好能保存下来留作参考,这里我们将其复制一份以为备用:

cp -iv .config /boot/config-5.8.3

安装 Linux 内核文档:

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

需要注意,内核源代码目录下文件的所有者并不是 root。在以 root 用户解压软件包的时候(我们在 chroot 环境里解压的),解压出来的文件会拥有解压该软件包的电脑中的用户和组。在安装其他包的时候这并不是问题,因为它们的源代码在安装完后就删除了。不过,Linux 内核的源代码经常会保留比较长时间。这样的话,就有可能会把软件包作者的用户 ID 对应到本机的某个用户上,从而导致某潜在用户拥有内核源代码写权限的可能。

不同于其他的软件包,由于在构建 BLFS 的时候需要更新内核,在构建结束后并不一定要删除内核源码的目录。

如果想要保留内核的源目录,请在 linux-5.8.3 目录下运行 chown -R 0:0 来确保所有文件的所有者都 root。

注意,一些内核文档里建议创建符号链接/usr/src/linux 指向内核源代码目录。这是 Linux 2.6 及以前版本内核的特定要求,而在 LFS 系统中一定不要创建这个链接。因为这样的话,反而会导致在往构建完成后的基础 LFS 系统中安装某些软件包时的不便。

注意,系统 include 目录(/usr/include)下的头文件应该总是和编译 Glibc 时用到的头文件保持一致。这里的头文件就是在 4.2.1 节整理过的头文件。

5.1.2 配置 Linux 模块加载顺序

虽然大多数情况下,Linux 模块会被自动加载,但是有时候需要特别指定加载顺序。modprobe 或 insmod 在加载模块时会读取/etc/modprobe.d/usb.conf。如果将 USB 设备(ehci_hcd、ohci_hcd 和 uhci_hcd)编译为模块,则需要此文件,这样它们就会以正确的顺序加载。ehci_hcd 需要在 ohci_hcd 和 uhci_hcd 之前加载,否则在系统启动过程中将会输出警告。 运行以下命令建立/etc/modprobe.d/usb.conf 文件:

install -v -m755 -d /etc/modprobe.d
cat > /etc/modprobe.d/usb.conf << "EOF"
# Begin /etc/modprobe.d/usb.conf

install ohci_hcd /sbin/modprobe ehci_hcd ; /sbin/modprobe -i ohci_hcd ; true
install uhci_hcd /sbin/modprobe ehci_hcd ; /sbin/modprobe -i uhci_hcd ; true

# End /etc/modprobe.d/usb.conf
EOF