Linux内核编译流程(Ubuntu24.04+Linux Kernel 6.8.12)

news2024/12/12 5:15:20

万恶的拯救者,使用Ubuntu没有声音,必须要自己修改一下Linux内核中的相关驱动逻辑才可以,所以被迫学习怎么修改内核&编译内核,记录如下

准备工作

  • 下载Linux源码:在Linux发布页下载并使用gpg签名验证
    • 即:linux-6.8.0.tar.gzlinux-6.8.0.tar.sign,采用的是分离式签名,将linux-6.8.0.tar.gz解压为linux-6.8.0.tar,再进行验证。
    • 下载Linus的gpg签名:
      • gpg2 --locate-keys torvalds@kernel.org gregkh@kernel.org
    • 使用进行验证gpg2 --verify linux-6.8.tar.sign
    • 验证是为了以防下载的包是个坏的,或者被篡改过的,对于个人玩来说,验证不验证无所谓。
  • 安装依赖
sudo apt install bc binutils bison dwarves flex gcc git gnupg2 gzip libelf-dev libncurses5-dev libssl-dev make openssl pahole perl-base rsync tar xz-utils
  • 更新配置文件,将原系统中的配置文件/boot/config-(uname -r)复制到解压好的Linux源码文件夹,并运行make oddefconfig更新配置。

    • 配置一共有一千多项,如果想要学习Linux可以看一看里面的配置,可以使用make menuconfig可视化修改具体配置,但是自己配置有可能导致系统启动不起来。make help提供了编译帮助,自带了几种不同的target config:defcofig,即默认配置编译,如果是QEMU模拟器,可以选择tinyconfig最小编译。使用 tinyconfig 目标将不会启用构建 DTB(设备树二进制文件) 的选项,如果是Arm或者RISC-V平台,内核很可能无法启动,X86平台不需要DTB文件。
    • 可以使用make localmodconfig来根据当下系统中用到的模块来生成config文件,可以起到精简config的效果,编译更快,但是移植到其他电脑就可能出问题。而且有可能因为当下系统没有运行某些模块导致新编译的内核中没有该模块。
  • 配置一个本地版本号

./scripts/config --file .config --set-str LOCALVERSION "-本地版本号"
# 可选,也可以不配置
  • 本地存储要求:大概有二三十个G的空闲就可以了,用不着特别大空间。

修改内核

找到自己需要的补丁patch,打补丁。

diff -uprN 原版linux目录   修改过的源码目录 >  linux.patch
# 生成补丁,u表示标准格式,p表示显示出函数名信息,
# r用于递归地比较目录及其子目录中的所有文件,N表示不存在的文件当空文件处理
patch -p0 < linux.patch
# 打补丁,p0表示忽略补丁中的0级目录

开始编译

make -j$(nproc) 2>&1 | tee log
# $(nproc)表示可用线程数
# 2>&1 会将 STDOUT 和 STDIN 重定向到相同的文件描述符
# tee表示将标准输入和标准输出写入文件

如果出现报错:

 make[1]*** [downloads/linux-6.8.12/makefile:1921: .] error 2
 # 或者1911行,反正差不多这个位置的报错

可以使用:

scripts/config --disable SYSTEM_REVOCATION_KEYS
# 该指令是关闭安全签名相关的配置,关闭后再运行就没问题了

编译完别急着安装,先看一下自己编译的对不对。正确编译的情况,log中应该记录有driver,sound,net等很长的记录log记录,如果发现log只有很多短,一二十行拿证明config肯定没配置对,就没必要接着安装了,安装了也开不了机器。
在这里插入图片描述

上面是错误案例,只有76行。
下面是正确情况:几百行
在这里插入图片描述

安装:

sudo make modules_install
# 安装模块,先试试不用sudo可以不可以,不行再加sudo
sudo make install
# 安装内核镜像,这个必须用sudo,因为需要将镜像文件放到boot中,必须要有root权限
# 如果出现dkms报错,找到报错的具体驱动,看是什么问题,要么卸载了要么把source文件夹下的dkms.conf文件给改个名字,等安装完再改回来,

dkms是一个驱动配置架构,可以自动根据内核版本编译对应的驱动,只需要写好dkms.conf就可以在添加新内核时自动为新内核编译安装驱动。

已知nvidia的显卡驱动会出问题,因为Makefile里面有个规则:如果安装的内核不是当下的release内核,需要include一个KBuild文件,而Makefile里面写了个include ${src}/KBuild,但是这个src并没有定义,所以会报错,即使改了src,在KBuild内部依旧会报错,所以,要么尝试把KBuild文件内部也改了,要么就按照上面的,把dkms.conf文件给注释掉,等安装完内核,再进入系统后,再使用下面指令进行显卡驱动安装。

如果不确定自己电脑是否有核显&核显驱动,建议先下载好对应的nvidia驱动包,如果没有核显or核显驱动,那显卡驱动掉了开机会进入tty终端,这时如果dkms出问题,可以使用下载的驱动包安装。

sudo dkms install -m nvidia/具体的驱动号
#eg: sudo dkms install -m nvidia/560.35.03    

安装完内核后,reboot一下,就可以了,不需要自己修改grub,make install会默认把当下新安装的内核设置到第一驱动位置。当然,不放心也可以自己再更新一下grub

sudo grub-mkconfig -o /boot/grub/grub.cfg

后手

救机:
如果发现安装完,进不了系统了,有可能是配置出问题了,可以在引导界面选择Advance option for Ubuntu,然后以root身份根据具体开机时的报错拯救。
如果连recovery mode都进不去了,证明编译的内核本身有问题,没得救了,在Advance option for Ubuntu中选择之前的内核版本开机,然后重新编译。
卸载:
自己安装的内核,在dpkg里面是不显示的,需要自己手动卸载。
卸载就没那么多讲究了,直接rm

sudo rm -rf /lib/modules/要删除的内核版本号
# 删除安装的modules
sudo rm /boot/dbt-要删除的内核版本号
# 删除DBT设备树二进制文件,如果有的话
sudo rm -vf /boot/{config,System,vmlinuz}-要删除的内核版本号
# 删除配置文件、内存映射相关信息文件、Linux内核本身
sudo rm /boot/initrd.img-要删除的内核版本号
# 删除该内核对应的初始内存磁盘映像

删除完后需要更新一下grub,取消掉对应的引导项。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【阅读笔记】Android广播的处理流程

关于Android的解析&#xff0c;有很多优质内容&#xff0c;看了后记录一下阅读笔记&#xff0c;也是一种有意义的事情&#xff0c; 今天就看看“那个写代码的”这位大佬关于广播的梳理&#xff0c; https://blog.csdn.net/a572423926/category_11509429.html https://blog.c…

linux下Qt程序部署教程

文章目录 [toc]1、概述2、静态编译安装Qt1.1 安装依赖1.2 静态编译1.3 报错1.4 添加环境变量1.5 下载安装QtCreator 3、配置linuxdeployqt环境1.1 在线安装依赖1.2 使用linuxdeployqt提供的程序1.3 编译安装linuxdeployqt 4、使用linuxdeployqt打包依赖1.1 linuxdeployqt使用选…

【PHP】部署和发布PHP网站到IIS服务器

欢迎来到《小5讲堂》 这是《PHP》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解。 温馨提示&#xff1a;博主能力有限&#xff0c;理解水平有限&#xff0c;若有不对之处望指正&#xff01; 目录 前言安装PHP稳定版本线程安全版解压使用 PHP配置配置文件扩展文件路径…

视觉经典神经网络学习01_CNN(1)

一、概述 卷积神经网络&#xff08;Convolutional Neural Network&#xff0c;CNN&#xff09;是一种专门用于处理具有网格状结构数据的深度学习模型。最初&#xff0c;CNN主要应用于计算机视觉任务&#xff0c;但它的成功启发了在其他领域应用&#xff0c;如自然语言处理等。…

【golang】单元测试,以及出现undefined时的解决方案

单元测试 要对某一方法进行测试时&#xff0c;例如如下这一简单减法函数&#xff0c;选中函数名后右键->转到->测试 1&#xff09;Empty test file 就是一个空文件&#xff0c;我们可以自己写测试的逻辑 但是直接点绿色箭头运行会出问题&#xff1a; 找不到包。我们要在…

DVWA靶场通关——DOM型XSS漏洞

一、DOM型XSS攻击概述 DOM型XSS&#xff08;DOM-based Cross-Site Scripting&#xff0c;DOM XSS&#xff09;是一种跨站脚本攻击&#xff08;XSS&#xff09;的变种&#xff0c;它与传统的反射型XSS&#xff08;Reflected XSS&#xff09;或存储型XSS&#xff08;Stored XSS&a…

【Unity 动画】设置跟运动(Apply Root)模型跟着动画产生位移

一、导入的动画本身必须有跟随动画产生位移或者旋转的效果 二、导入Unity后 在Unity中&#xff0c;根运动&#xff08;Root Motion&#xff09;是指动画中角色根节点的移动和旋转。根节点通常是角色的根骨骼&#xff08;Root Bone&#xff09;&#xff0c;它决定了角色的整体…

Spring AI 框架介绍

Spring AI是一个面向人工智能工程的应用框架。它的目标是将Spring生态系统的设计原则&#xff08;如可移植性和模块化设计&#xff09;应用于AI领域&#xff0c;并推广使用pojo作为AI领域应用的构建模块。 概述 Spring AI 现在(2024/12)已经支持语言&#xff0c;图像&#xf…

C++小问题

怎么分辨const修饰的是谁 是限定谁不能被改变的&#xff1f; 在C中&#xff0c;const关键字的用途和位置非常关键&#xff0c;它决定了谁不能被修改。const可以修饰变量、指针、引用等不同的对象&#xff0c;并且具体的作用取决于const的修饰位置。理解const的规则能够帮助我们…

近几年,GIS专业的五类就业方向!

近二十几年来&#xff0c;地理信息科学毕业生的就业方向在不断发生变化。 早期的地理信息科学技术主要应用于政府部门&#xff0c;因此学生就业主要在高校、交通运输、规划勘测设计、国土、矿业、水利电力、通讯、农林、城市建设、旅游等国家政府部门或事业单位。 随着地理信…

【Maven】继承和聚合

5. Maven的继承和聚合 5.1 什么是继承 Maven 的依赖传递机制可以一定程度上简化 POM 的配置&#xff0c;但这仅限于存在依赖关系的项目或模块中。当一个项目的多个模块都依赖于相同 jar 包的相同版本&#xff0c;且这些模块之间不存在依赖关系&#xff0c;这就导致同一个依赖…

2、Three.js初步认识场景Scene、相机Camera、渲染器Renderer三要素

三要素之间关系&#xff1a; 有了虚拟场景Scene&#xff0c;相机录像Camera&#xff0c;在相机小屏幕上看到的Renderer Scene当前空间 Mesh人在场景 Camera相机录像 Renderer显示器上 首先先描述下Scene&#xff1a; 这个场景为三要素之一&#xff0c;一切需要展示的东西都需…

工厂方法模式的理解和实践

在软件开发中&#xff0c;设计模式是一种经过验证的解决特定问题的通用方案。工厂方法模式&#xff08;Factory Method Pattern&#xff09;是创建型设计模式之一&#xff0c;它提供了一种创建对象的接口&#xff0c;但由子类决定要实例化的类是哪一个。工厂方法让类的实例化推…

Vue教程|搭建vue项目|Vue-CLI2.x 模板脚手架

一、项目构建环境准备 在构建Vue项目之前&#xff0c;需要搭建Node环境以及Vue-CLI脚手架&#xff0c;由于本篇文章为上一篇文章的补充&#xff0c;也是为了给大家分享更为完整的搭建vue项目方式&#xff0c;所以环境准备部分采用Vue教程&#xff5c;搭建vue项目&#xff5c;V…

无人机主控芯片技术与算法详解!

一、无人机主控芯片核心技术 高性能CPU&#xff1a; 无人机需要高性能的CPU来处理复杂的飞行控制算法、图像处理和数据传输等任务。目前&#xff0c;无人机的CPU主要有大疆自研的飞控系统、高通提供的无人机设计平台Snapdragon Flight&#xff0c;以及基于开源平台APM、Px4等…

GaussDB(类似PostgreSQL)常用命令和注意事项

文章目录 前言GaussDB&#xff08;类似PostgreSQL&#xff09;常用命令和注意事项1. 连接到GaussDB数据库2. 查看当前数据库中的所有Schema3. 进入指定的Schema4. 查看Schema下的表、序列、视图5. 查看Schema下所有的表6. 查看表结构7. 开始事务8. 查询表字段注释9. 注意事项&a…

探索AI新世界!热门工具与学习资源免费获取

​抖知书老师推荐&#xff1a; 人工智能技术的迅速发展让人们既充满期待又有些迷茫。有人担忧被AI技术取代&#xff0c;有人却积极拥抱这场科技浪潮。无论你处于哪种心态&#xff0c;人工智能已经深入到我们生活的方方面面。如果你希望轻松掌握最新的AI工具与动态&#xff0c;…

[STM32]从零开始的STM32 FreeRTOS移植教程

一、前言 如果能看到这个教程的话&#xff0c;说明大家已经学习嵌入式有一段时间了。还记得嵌入式在大多数时候指的是什么吗&#xff1f;是的&#xff0c;我们所说的学习嵌入式大部分时候都是在学习嵌入式操作系统。从简单的一些任务状态机再到复杂一些的RTOS&#xff0c;再到最…

基于Java Springboot房屋租赁App且微信小程序

一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术&#xff1a;Html、Css、Js、Vue、Element-ui 数据库&#xff1a;MySQL 后端技术&#xff1a;Java、Spring Boot、MyBatis 三、运行环境 开发工具&#xff1a;IDEA/eclipse 微信…

【docker】9. 镜像操作与实战

镜像操作案例 查找镜像 docker search busybox下载镜像 docker pull busybox:1.36.0查看镜像及列表存储位置 rootLAPTOP-H2EI4I6A:~# docker images busybox REPOSITORY TAG IMAGE ID CREATED SIZE busybox latest 517b897a6a83 2 months a…