当前位置: 首页 > news >正文

Linux内核编译全流程详解与实战指南

Linux内核编译

一、 实验题目

下载、编译内核源代码[1][2]

启动测试所编译出来的内核

二、 相关原理与知识

Linux内核基本概念
  1. 内核:操作系统的核心部分,负责管理系统资源、硬件抽象、进程调度等核心功能

内核模块:可动态加载到内核中的代码,扩展内核功能而不需要重新编译整个内核

内核配置:通过配置选项决定哪些功能被编译进内核或作为模块

  1. 内核编译流程:

获取源代码:从官方仓库下载内核源代码

配置内核:选择需要编译的功能和驱动

编译内核:将源代码编译为可执行的二进制文件

安装内核:将编译好的内核安装到系统中

启动测试:使用新编译的内核启动系统

  1. 启动过程:

引导加载程序(如GRUB)加载内核映像和initramfs

内核初始化硬件设备

挂载根文件系统

启动init进程(现代系统通常是systemd)

三、实验过程

  1. 安装依赖工具
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
  1. 下载内核源代码

进入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/
  1. 配置内核选项(默认save,然后exit)
make menuconfig
  1. 编辑.config配置文件。
vim ./.config

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

将CONFIG_SYSTEM_EXTRA_CERTIFICATE_SIZE=1024,将数字1024改为4096。(定义了内核可以承载的额外证书空间大小(单位:字节):)

  1. 编译内核 (build.log:保存编译输出的日志文件)
make -j12 2>&1 | tee build.log
  1. 编译和安装模块(NSTALL_MOD_STRIP=1移除模块中的调试信息)
make modules
make modules_install INSTALL_MOD_STRIP=1
  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

五、问题总结

  1. 缺少依赖

下载所有相关的,尤其是zstd,这个是配置文件中使用的,但是虚拟机安装的ubuntu初始版什么都没有,需要自己下载。

sudo apt install build-essential libncurses-dev bison flex libssl-dev
  1. 内核选项堆栈报警

将CONFIG_SYSTEM_EXTRA_CERTIFICATE_SIZE=1024,将数字1024改为4096。(定义了内核可以承载的额外证书空间大小(单位:字节)。

  1. CONFIG_SYSTEM_TRUSTED_KEYS字符验证修改
  1. Grup卡在加载load redmisk界面

重新编译下载,按步骤使用:make modules_install INSTALL_MOD_STRIP=1这个命令。

http://www.xdnf.cn/news/104509.html

相关文章:

  • 汇编语言与二进制分析:从入门到精通的学习路径与实践指南
  • 对流对象的理解
  • 电商行业下的Java核心、Spring生态与AI技术问答
  • MsQuick编译和使用
  • postman 删除注销账号
  • 一种免费的离线ocr-汉字识别率100%
  • 【每日八股】复习 Redis Day2:Redis 的持久化(下)
  • 基于深度学习的信号滤波:创新技术与应用挑战
  • 1.1 java开发的准备工作
  • Hadoop 集群扩容新增节点操作文档
  • DasViewer软件视图设置
  • leetcode-位运算
  • 人工智能华迪杯比赛项目推荐
  • 二进制部署Kubernetes1.32.4最新版本高可用集群及附加组件
  • Postman忘记密码访问官网总是无响应
  • 三轴云台之平衡系统篇
  • 【动态规划】树形dp
  • 【网络入侵检测】Suricata之入侵防御(IPS)模式
  • RedisTemplate序列化器
  • 物体识别(1)
  • 【Maven】特殊pom.xml配置文件 - BOM
  • vue2+Vant 定制主题
  • 拆解大模型“越狱”攻击:对抗样本如何撕开AI安全护栏?
  • 数据结构(四)-双向链表
  • C++入门基础(2)
  • 智能配送机器人控制系统设计
  • 边缘计算在工业自动化中的应用:开启智能制造新时代
  • 【ASR学习笔记】常见VAD模型识别语音活动的方式对比
  • Pthon流程控制
  • Ubuntu 环境下控制蓝牙适配器