Linux内核编译全流程详解与实战指南
Linux内核编译
一、 实验题目
下载、编译内核源代码[1][2]
启动测试所编译出来的内核
二、 相关原理与知识
Linux内核基本概念
-
内核:操作系统的核心部分,负责管理系统资源、硬件抽象、进程调度等核心功能
内核模块:可动态加载到内核中的代码,扩展内核功能而不需要重新编译整个内核
内核配置:通过配置选项决定哪些功能被编译进内核或作为模块
-
内核编译流程:
获取源代码:从官方仓库下载内核源代码
配置内核:选择需要编译的功能和驱动
编译内核:将源代码编译为可执行的二进制文件
安装内核:将编译好的内核安装到系统中
启动测试:使用新编译的内核启动系统
-
启动过程:
引导加载程序(如GRUB)加载内核映像和initramfs
内核初始化硬件设备
挂载根文件系统
启动init进程(现代系统通常是systemd)
三、实验过程
-
安装依赖工具
sudo apt update
sudo apt install git build-essential ncurses-dev xz-utils libssl-dev bc flex libelf-dev bison zstd openssh-server vim net-tools -y
-
下载内核源代码
进入Linux官网https://www.kernel.org/下载对应版本的内核。我这里下载的是6.14.3最新版的内核。
sudo tar xvf ./linux-6.14.3.tar.xz -C /usr/src/
cd linux-6.14.3/

-
配置内核选项(默认save,然后exit)
make menuconfig

-
编辑.config配置文件。
vim ./.config
将CONFIG_SYSTEM_TRUSTED_KEYS等号右侧字符串置空即可(在开发或测试环境中,我们可能不需要严格的模块签名验证)。将CONFIG_SYSTEM_REVOCATION_KEYS右侧字符串置空。(指定被吊销的密钥文件)如下图所示。

将CONFIG_SYSTEM_EXTRA_CERTIFICATE_SIZE=1024,将数字1024改为4096。(定义了内核可以承载的额外证书空间大小(单位:字节):)
-
编译内核 (build.log:保存编译输出的日志文件)
make -j12 2>&1 | tee build.log

-
编译和安装模块(NSTALL_MOD_STRIP=1移除模块中的调试信息)
make modules
make modules_install INSTALL_MOD_STRIP=1

-
重启检验成果。
reboot

四、 实验结果与分析
make -j12 2>&1 | tee build.log
现象:多线程编译(-j12)时CPU利用率接近100%,输出显示并行构建多个目标文件(如drivers/char/random.o)
原理:
日志记录的重要性:
完整记录编译过程(约5-20MB日志文件)
保留编译警告信息供后续分析
CONFIG_SYSTEM_EXTRA_CERTIFICATE_SIZE 从1024改为4096的原因
背景知识:
这个选项定义了内核可以承载的额外证书空间大小(单位:字节):
用于存储除内置证书外的额外证书
影响内核处理SSL/TLS等加密操作的能力
最终结果:成功更换内核。
我原来的内核为5.15.0

现在为:6.14.3

五、问题总结
-
缺少依赖
下载所有相关的,尤其是zstd,这个是配置文件中使用的,但是虚拟机安装的ubuntu初始版什么都没有,需要自己下载。
sudo apt install build-essential libncurses-dev bison flex libssl-dev
-
内核选项堆栈报警
将CONFIG_SYSTEM_EXTRA_CERTIFICATE_SIZE=1024,将数字1024改为4096。(定义了内核可以承载的额外证书空间大小(单位:字节)。
-
CONFIG_SYSTEM_TRUSTED_KEYS字符验证修改

-
Grup卡在加载load redmisk界面
重新编译下载,按步骤使用:make modules_install INSTALL_MOD_STRIP=1这个命令。
