一文搞懂Linux kernel编译步骤

一、前言

什么是Linux的内核编译呢?简单来说,Linux内核编译是一个将内核源代码转换成可在特定的硬件架构上运行的二进制文件的过程。通过编译内核,我们可以根据自己的需求和兴趣对内核进行定制和优化,以满足特定的应用场景。下文则是Linux内核编译的详细流程:

注: 在ubuntu20.04.3 LTS中以kernel 6.11.6为编译版本

二、 内核编译流程

2.1 准备工作

  • 1.安装必要的编译工具
    安装gcc编译器、make工具、ncurses库(用于make menuconfig)等编译工具

    sudo apt install make gcc git  libncurses5-dev
    sudo apt install  fakeroot build-essential xz-utils libssl-dev bc flex libelf-dev bison  ccache zstd dwarves(解决btf生成问题)
    
  • 2.获取内核源代码
    可以从官方网站或源代码仓库中获取Linux内核的源代码,我们可以选择下载最新版本的源代码,或者根据我们的需求选择特定版本的源代码,可以通过git clone或者直接下载来获取内核源代码。
    官网地址: https://kernel.org/

  • 3.解压内核源代码
    如果下载的是压缩包,需要使用相应的命令将压缩包解压到你需要的目录。

2.2 配置内核

  • 4.复制默认配置
    将默认的内核配置文件复制到我们下载好的内核源代码的目录中,并重命名为.config文件。

    cp /boot/config-$(uname -r) .config
    

    在这里插入图片描述

  • 5.修改默认配置
    打开config
    修改 CONFIG_SYSTEM_TRUSTED_KEYS,将其赋空值。

    vim .config   
    CONFIG_SYSTEM_TRUSTED_KEYS=""
    
  • 6.打开内核配置界面
    通过make menuconfig命令在终端中打开内核配置界面。在配置界面中,可以选择启用或禁用特定的功能、模块和设备驱动程序。还可以调整内核的参数和选项,以满足我们特定的需求。

     make menuconfig
    
  • 7.保持配置
    配置完成后,保存并退出菜单。这将生成一个包含所选配置信息的.config文件。

2.3 编译内核

  • 8.开始编译
    在内核源码目录中运行make命令开始编译内核。这个过程需要一段时间,具体取决于系统配置和计算机性能。

    make -j8  //-j代表CPU的个数
    //查看CPU的个数
    screenfetch
    

    在这里插入图片描述

  • 9.安装内核模块
    编译完成后,将编译生成的内核模块安装到系统中。

    sudo make modules_install //可能有问题,如果有问题,则执行下面的语句
    sudo make INSTALL_MOD_STRIP=1 modules_install -j8  (INSTALL_MOD_STRIP=1一定要加上,否则会有initrd.img-xxx文件太大的问题,导致开机一直卡在加载映像到磁盘,无法开机)
    

    在这里插入图片描述

  • 10.安装内核镜像
    运行make install命令将编译生成的内核镜像(如vmlinuz)和initramfs或initrd 镜像(如果需要的话)复制到/boot目录下。

    sudo make install
    

    在这里插入图片描述

    检查一下/boot/initrd.img-xxx大小是否太大,正常一般不超过100M,如果太大就执行(make INSTALL_MOD_STRIP=1 modules_install -j8)的命令,然后再执行:

    mkinitramfs /lib/modules/6.11.xxxx/ -o /boot/initrd.img-6.11xxx
    

    注意: 当我们编译并安装了新的内核后,通常需要为新的内核创建一个匹配的initrd映像文件。这是因为新的内核可能需要不同的驱动程序和配置来访问存储介质和挂载根文件系统。在这种情况下,我们就可以使用mkinitramfs命令来创建新的initrd映像文件,并确保它与新的内核版本相匹配。

2.4 验证和测试

  • 11.重新启动计算机
    选择新编译的内核启动。
  • 12.验证内核编译是否成功
    使用uname-a命令查看当前系统的信息,确认内核名称、版本号和发布日期是否正确。
    uname-a
    
    在这里插入图片描述

三、注意事项

  • 备份
    在进行内核编译之前,建议将备份当前的系统和内核配置,以防万一编译失败或出现其他问题的时候我们可以及时回退。
  • 依赖关系
    确保系统配置和硬件支持所选择的内核选项,在编译过程中,如果遇到依赖关系错误,可以检查并安装缺失的依赖包。这个一般我们将编译错误复制在浏览器中查询一般就可以找到缺失的依赖包了。

四、具体内核编译问题

4.1 编译内核报错:No rule to make target ‘debian/canonical-certs.pem‘

  • 报错描述

    make[1]: *** No rule to make target 'debian/canonical-certs.pem', needed by 				'certs/x509_certificate_list'.  Stop.
    make: *** [Makefile:1053: certs] Error 2
    
  • 问题原因

    缺少证书

  • 问题解决

    方法一: 打开.config文件注释掉这一行或将其赋空值

    CONFIG_SYSTEM_TRUSTED_KEYS="debian/certs/benh@debian.org.cert.pem"
    

    方法二: 执行完下面的语句后make clean,然后重新编译

    scripts/config --disable SYSTEM_TRUSTED_KEYS
    

    后续遇到的一些实际错误也会在下面接着进行补充,大家感兴趣和以关注加收藏。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/909808.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

IDEA构建JavaWeb项目,并通过Tomcat成功运行

目录 一、Tomcat简介 二、Tomcat安装步骤 1.选择分支下载 2.点击下载zip安装包 3.解压到没有中文、空格和特殊字符的目录下 4.双击bin目录下的startup.bat脚本启动Tomcat 5.浏览器访问Tomcat 6.关闭Tomcat服务器 三、Tomcat目录介绍 四、WEB项目的标准结构 五、WEB…

消息通知——公众号、小程序、短信对比

消息通知——公众号、小程序、短信对比 引言 在数字化时代,高效、准确的消息通知对于提升用户体验、增强用户粘性至关重要。本报告将深入分析三种常见的消息通知方式:微信公众号推送、微信小程序推送以及手机短信推送,从实现方式、优缺点及细…

三维测量与建模笔记 - 3.2 直接线性变换法标定DLT

DLT - Direct Linear Transform 上图中,透视成像对应的公式是共线方程,可以参考以下链接: https://zhuanlan.zhihu.com/p/101549821https://zhuanlan.zhihu.com/p/101549821 对于标定来说,需要找到。已知量是。 (u,v)是…

消息队列面试——打破沙锅问到底

消息队列的面试连环炮 前言 你用过消息队列么?说说你们项目里是怎么用消息队列的? 我们有一个订单系统,订单系统会每次下一个新订单的时候,就会发送一条消息到ActiveMQ里面去,后台有一个库存系统,负责获取…

【论文复现】KAN卷积:医学图像分割新前沿

📝个人主页🌹:Eternity._ 🌹🌹期待您的关注 🌹🌹 ❀知识图谱推理 1. 概述2. 核心创新点3. 模块介绍KANUNext模块 4. 本文主要结构5. 主要代码6. 数据集7. 结果展示8. 参考文献 前言:…

Oracle与SQL Server的语法区别

1)日期和日期转换函数。 SQL: SELECT A.*, CASE WHEN NVL(PAA009,) OR PAA009 >Convert(Varchar(10), SYSDATE,120) THEN Y ELSE N END AS ActiveUser FROM POWPAA A WHERE PAA001admin or PAA002admin Oracle: SELECT A.*, CASE WHEN NVL(PAA009,) or PAA009&…

基于TRIZ理论的便携式光伏手机充电装置创新

随着智能手机功能的日益强大,电量消耗问题也日益凸显,尤其是在户外活动时,电量告急常常让人措手不及。面对这一挑战,基于TRIZ(发明问题解决理论)的创新思维,一款全新的便携式光伏手机充电装置应…

Vue3父传子

1. App.vue - 父组件 咱们先来看左边的 App.vue&#xff0c;它扮演的是“父亲”角色——你可以想象它是一位热心的老爸&#xff0c;手里拿着一条消息&#xff0c;正准备把这条消息送到“儿子”那里。 <script setup> // 这个 setup 就像一个神奇的开关&#xff0c;一开…

前端 算法 双指针

文章目录 三数之和移动零盛最多水的容器接雨水 三数之和 leetcode 三数之和 题目链接 给你一个整数数组 nums &#xff0c;判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k &#xff0c;同时还满足 nums[i] nums[j] nums[k] 0 。请你返回所有…

EPSON机械手与第三方相机的校准功能设计By python

EPSON机械手与第三方相机的校准功能设计By python 使用Python来实现EPSON机械手与第三方相机的校准功能是一个复杂但可行的任务。这通常涉及以下几个步骤:硬件接口通信、图像处理、标定算法实现和控制逻辑编写。 1. 环境准备 首先,库 pip install numpy opencv-python pyse…

NPU 可不可以代替 GPU

结论 先说结论&#xff0c;GPU分为可以做图形处理的传统意义上的真GPU&#xff0c;做HPC计算的GPGPU和做AI加速计算的GPGPU&#xff0c;所以下面分别说&#xff1a; 对于做图形处理的GPU&#xff0c;这个就和NPU 一样&#xff0c;属于DSA&#xff0c;没有替代性。当然&#xf…

python画图|hist()函数画直方图进阶

【1】引言 前序已经学习了hist()函数画直方图的基础教程&#xff0c;相关文章见下述链接&#xff1a; python画图|hist()函数画直方图初探-CSDN博客 在这里我们初步认识了hist()函数&#xff0c;并使用该函数画出了8个直方图。 之后又用bar(&#xff09;函数进行对比&#…

推荐一款非常好用的C/C++在线编译器

C/C作为一门底层、高效的编程语言&#xff0c;广泛应用于系统开发、游戏引擎、嵌入式系统等领域。然而&#xff0c;C/C的开发环境配置会让开发者把部分时间消耗在这件事上&#xff0c;也经常会遇到各种各样的环境问题。 本地开发的痛点 环境配置复杂&#xff1a;C/C的开发环境…

kafka如何获取 topic 主题的列表?

大家好&#xff0c;我是锋哥。今天分享关于【kafka如何获取 topic 主题的列表&#xff1f;】面试题&#xff1f;希望对大家有帮助&#xff1b; kafka如何获取 topic 主题的列表&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 在Kafka中&#xff0c;可以…

用示例来看C2Rust工具的使用和功能介绍

C2Rust可以将C语言的源代码转换成Rust语言的源代码。下面是一个简单的C语言代码示例&#xff0c;以及使用c2Rust工具将其转换为Rust安全代码的过程。 C语言源代码示例 // example.c #include <stdio.h>int add(int a, int b) {return a b; }int main() {int result a…

数据结构排序之直接选择排序--堆排序

堆排序 堆排序 (Heapsort) 是指利用堆积树&#xff08;堆&#xff09;这种数据结构所设计的一种排序算法&#xff0c;它是选择排序的一种。它是通过堆来进行选择数据。需要注意的是排升序要建大堆&#xff0c;排降序建小堆。 直接选择排序的特性总结&#xff1a; 1. 堆排序使…

使用DJL和PaddlePaddle的口罩检测详细指南

使用DJL和PaddlePaddle的口罩检测详细指南 完整代码 该项目利用DJL和PaddlePaddle的预训练模型&#xff0c;构建了一个口罩检测应用程序。该应用能够在图片中检测人脸&#xff0c;并将每张人脸分类为“戴口罩”或“未戴口罩”。我们将深入分析代码的每个部分&#xff0c;以便…

【go从零单排】go三种结构体:for循环、if-else、switch

Don’t worry , just coding! 内耗与overthinking只会削弱你的精力&#xff0c;虚度你的光阴&#xff0c;每天迈出一小步&#xff0c;回头时发现已经走了很远。 for循环是go语言唯一的循环语句&#xff0c;没错&#xff0c;在go中再也不会看到while true package mainimport …

python怎么去掉换行符

换行符与其他字符并没有区别&#xff0c;由于换行符总是最后一个字符&#xff0c;所以直接选择除去最后一个字符的所有字符即可。 x abc\n x[:-1] 也可以使用字符串的strip()方法 但是strip()方法除了会去掉换行符&#xff0c;还会去掉空格等其他字符。 x.strip()

集中管理用户名和密码,定期修改密码快捷方便

在运维工作中&#xff0c;凭证管理是一项至关重要的任务。随着系统复杂性的增加和安全性要求的提高&#xff0c;如何有效地管理用户名和密码成为了运维团队面临的一大挑战。本文将介绍新版本中的凭证管理功能&#xff0c;并探讨其在运维行业中的应用和最佳实践。 一、凭证管理…