%general-entities; ]> kernel &linux-version;
&linux-url;
Linux-&linux-version; Linux <para>Linux 软件包包含 Linux 内核。</para> <segmentedlist> <segtitle>&buildtime;</segtitle> <segtitle>&diskspace;</segtitle> <seglistitem> <seg>&linux-ch8-sbu;</seg> <seg>&linux-ch8-du;</seg> </seglistitem> </segmentedlist> </sect2> <sect2 role="installation"> <title>安装内核 构建内核需要三步 —— 配置、编译、安装。 阅读内核源代码树中的 README 文件, 了解不同于本手册的内核配置方法。 运行以下命令,准备编译内核: make mrproper 该命令确保内核源代码树绝对干净, 内核开发组建议在每次编译内核前运行该命令。 尽管内核源代码树在解压后应该是干净的,但这并不完全可靠。 下面通过菜单界面配置内核,阅读 了解关于内核配置的一般信息。 BLFS 的某些软件包需要特定内核配置,阅读 了解它们。另外在 也有一些关于配置和构建内核的信息。 一个较好的初始内核配置可以通过运行 make defconfig 获得。 它会考虑您的当前系统体系结构,将基本内核配置设定到较好的状态。 一定要按照以下列表启用/禁用/设定其中列出的内核特性, 否则系统可能不能正常工作,甚至根本无法引导: 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] 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] 尽管 The IPv6 Protocol (IPv6 协议支持) 并不是严格要求的,但是 systemd 开发者强烈推荐启用它。 There are several other options that may be desired depending on the requirements for the system. For a list of options needed for BLFS packages, see the BLFS Index of Kernel Settings (&lfs-root;blfs/view/&short-version;/longindex.html#kernel-config-index). 如果您的硬件平台使用 UEFI,则 make defconfig 命令也会自动加入一些 EFI 相关的内核选项。 为了允许从宿主系统的 UEFI 引导环境引导 LFS 内核, 您必须选择一个内核选项: Processor type and features ---> [*] EFI stub support [CONFIG_EFI_STUB] 在 LFS 中管理 UEFI 环境的较完整说明包含在 lfs-uefi.txt 中, 它位于 上述配置选项的含义: Support for uevent helper 如果启用了该选项,它可能干扰 Udev/Eudev 的设备管理。 Maintain a devtmpfs 该选项会使内核自动创建设备节点,即使 Udev 没有运行。 Udev 之后才在这些设备节点的基础上运行, 管理它们的访问权限并为它们建立符号链接。 所有 Udev/Eudev 用户都需要启用该选项。 make menuconfig 以上命令中可选的 make 环境变量及含义: LANG=<host_LANG_value> LC_ALL= 它们根据宿主使用的 locale 建立 locale 设定。 在 UTF-8 Linux 文本终端下,有时必须这样做才能正确绘制 基于 ncurses 的配置菜单接口。 在这种情况下,一定要将 <host_LANG_value> 替换成宿主环境中的 $LANG 变量值。您也可以使用宿主环境中 $LC_ALL$LC_CTYPE 的值代替。 某些情况下,make oldconfig 更为合适。 阅读 README 文件了解更多信息。 如果希望的话,也可以将宿主系统的内核配置文件 .config 拷贝到解压出的 linux-&linux-version; 目录(前提是可以找到该文件)。然而我们不推荐这样做, 一般来说,浏览整个配置目录,并从头创建内核配置是更好的选择。 编译内核映像和模块: make 如果要使用内核模块,可能需要在 /etc/modprobe.d 中写入模块配置。讨论模块和内核配置的信息位于 linux-&linux-version;/Documentation 目录下的内核文档中。另外 modprobe.d(5) 也可以作为参考。 如果内核配置使用了模块,安装它们: make modules_install 在内核编译完成后,需要进行额外步骤完成安装, 一些文件需要拷贝到 /boot 目录中。 如果宿主系统有单独的 /boot 分区,需要将这些文件拷贝到该分区中。 最简单的方法是将宿主系统的 /boot (在 chroot 之外)绑定到 /mnt/lfs/boot 再拷贝文件,在宿主系统中, 以 root 身份执行: mount --bind /boot /mnt/lfs/boot 指向内核映像的路径可能随机器平台的不同而变化。 下面使用的文件名可以依照您的需要改变, 但文件名的开头应该保持为 vmlinuz, 以保证和下一节描述的引导过程自动设定相兼容。 下面的命令假定是机器是 x86 体系结构: cp -iv arch/x86/boot/bzImage /boot/vmlinuz-&linux-version;-lfs-&version; cp -iv arch/x86/boot/bzImage /boot/vmlinuz-&linux-version;-lfs-&versiond; System.map 是内核符号文件, 它将内核 API 的每个函数入口点和运行时数据结构映射到它们的地址。 它在调查分析内核出现的问题时被使用。执行以下命令安装该文件: cp -iv System.map /boot/System.map-&linux-version; make menuconfig 生成的内核配置文件 .config 包含编译好的内核的所有配置选项。 最好能将它保留下来以供日后参考: cp -iv .config /boot/config-&linux-version; 安装 Linux 内核文档: install -d /usr/share/doc/linux-&linux-version; cp -r Documentation/* /usr/share/doc/linux-&linux-version; 需要注意的是,在内核源代码目录中可能有不属于 root 的文件。在以 root 身份解压源代码包时(就像我们在 chroot 环境中所做的那样), 这些文件会获得它们之前在软件包创建者的计算机上的用户和组 ID。 这一般不会造成问题,因为在安装后通常会删除源代码目录树。 然而,Linux 源代码目录树一般会被保留较长时间, 这样创建者当时使用的用户 ID 就可能被分配给本机的某个用户, 导致该用户拥有内核源代码的写权限。 之后在 BLFS 中安装软件包时往往需要修改内核配置。 因此,和其他软件包不同,我们在安装好内核后可以不移除源代码树。 如果要保留内核源代码树,对目录 linux-&linux-version; 执行 chown -R 0:0,以保证其中所有文件都属于 root 有的内核文档建议创建符号链接 /usr/src/linux 指向内核源代码目录,这仅仅适用于 2.6 系列之前的内核。 在 LFS 系统上绝对不要创建它, 因为在构建完基本 LFS 系统后,它可能在您构建其他软件包时引起问题。 在系统 include 目录(即 /usr/include 中的内核头文件应该总是与构建 Glibc 时使用的内核头文件一致,即保持为 中安装的净化头文件。 换句话说,永远不要用原始内核头文件, 或其他版本内核的净化头文件替换它们。 配置 Linux 内核模块加载顺序 /etc/modprobe.d/usb.conf 多数情况下 Linux 内核模块可以自动加载,但有时需要指定加载顺序。 负责加载内核模块的程序 modprobeinsmod/etc/modprobe.d 下的配置文件中读取加载顺序,例如,如果 USB 驱动程序 (ehci_hcd、ohci_hcd 和 uhci_hcd)被构建为模块, 则必须按照先加载 echi_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 Linux 的内容 安装的文件 安装的目录 config-&linux-version;, vmlinuz-&linux-version;-lfs-&version;, vmlinuz-&linux-version;-lfs-&versiond;, 以及 System.map-&linux-version; /lib/modules 和 /usr/share/doc/linux-&linux-version; 简要描述 config-&linux-version; 包含所有内核配置选项的值 /boot/config-&linux-version; vmlinuz-&linux-version;-lfs-&version; vmlinuz-&linux-version;-lfs-&versiond; Linux 系统的引擎,在启动计算机时, 它是操作系统中被最早加载的部分。它检测并初始化计算机硬件, 将它们以目录树的形式提供给软件, 并将单个 CPU 封装成多任务系统, 使多个用户程序看上去在同时执行。 lfskernel-&linux-version; System.map-&linux-version; 地址和符号列表,将函数和数据结构映射为入口点和地址 /boot/System.map-&linux-version;