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这个命令。
 
 