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

万恶的拯救者,使用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.rhkb.cn/news/481510.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

UE5 打包报错 Unknown structure 的解决方法

在虚幻引擎5.5 打包报错如下&#xff1a; UATHelper: 打包 (Windows): LogInit: Display: LogProperty: Error: FStructProperty::Serialize Loading: Property ‘StructProperty /Game/Components/HitReactionComponent/Blueprints/BI_ReactionInterface.BI_ReactionInterface…

根据导数的定义计算导函数

根据导数的定义计算导函数 1. Finding derivatives using the definition (使用定义求导)1.1. **We want to differentiate f ( x ) 1 / x f(x) 1/x f(x)1/x with respect to x x x**</font>1.2. **We want to differentiate f ( x ) x f(x) \sqrt{x} f(x)x ​ wi…

论文阅读:Dual-disentangled Deep Multiple Clustering

目录 摘要 引言 模型 实验 数据集 实验结果 结论 摘要 多重聚类近年来引起了广泛关注&#xff0c;因为它能够从不同的角度揭示数据的多种潜在结构。大多数多重聚类方法通常先通过控制特征之间的差异性来提取特征表示&#xff0c;然后使用传统的聚类方法&#xff08;如 …

Kafka知识体系

一、认识Kafka 1. kafka适用场景 消息系统&#xff1a;kafka不仅具备传统的系统解耦、流量削峰、缓冲、异步通信、可扩展性、可恢复性等功能&#xff0c;还有其他消息系统难以实现的消息顺序消费及消息回溯功能。 存储系统&#xff1a;kafka把消息持久化到磁盘上&#xff0c…

项目切换Java21

目录 项目启动流程 遇到的问题 目前我们所有的项目都是Java8的&#xff0c;突然交接过来一个Java21的项目&#xff0c;项目启动耗时挺久&#xff0c;本篇记录下问题以及解决方案 项目启动流程 1. 下载Java21 2. 配置Java21 本机环境变量配置 确保path里有Java21路径 3. …

【算法day4】链表:应用拓展与快慢指针

题目引用 两两交换链表节点删除链表的倒数第n个节点链表相交环形链表 1.两两交换链表节点 给你一个链表&#xff0c;两两交换其中相邻的节点&#xff0c;并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题&#xff08;即&#xff0c;只能进行节点交换&am…

电机控制理论基础及其应用

电机控制理论是电气工程和自动化领域中的一个重要分支&#xff0c;它主要研究如何有效地控制电机的运行状态&#xff0c;包括速度、位置、扭矩等&#xff0c;以满足各种应用需求。电机控制理论的基础知识涵盖了电机的工作原理、数学模型、控制策略以及实现技术等方面。下面是一…

【每天一篇深度学习论文】(IEEE 2024)即插即用特征增强模块FEM

目录 论文介绍题目&#xff1a;论文地址&#xff1a; 创新点方法整体结构 即插即用模块作用消融实验结果即插即用模块代码 论文介绍 题目&#xff1a; FFCA-YOLO for Small Object Detection in Remote Sensing Images 论文地址&#xff1a; https://ieeexplore.ieee.org/d…

『 Linux 』数据链路层 - ARP协议及数据链路层周边问题

文章目录 ARP协议ARP欺骗RARP协议 DNS服务ICMP协议ping 命令正向代理服务器反向代理服务器 ARP协议 博客『 Linux 』数据链路层 - MAC帧/以太网帧中提到,当数据需要再数据链路层进行无网络传输时需要封装为MAC帧,而MAC帧的报文结构如下: 帧头部分存在两个字段分别为 “目的地址…

基于Java Springboot Vue3图书管理系统

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

Google Cloud Dataproc 计算 EOD 余额

简介 Google Cloud Dataproc 是 Google Cloud Platform (GCP) 提供的一种完全托管的 Apache Hadoop 和 Apache Spark 服务。它允许用户快速、轻松地在云中创建和管理大数据处理集群&#xff0c;适合需要大规模数据处理、分析和机器学习的场景&#xff0c;能够帮助企业更高效地…

【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…

循环神经网络(RNN)简述

RNN及其变体 1、概述 (一)、概念 RNN(Recurrent Neural Network), 中文称作循环神经网络, 它一般以序列数据为输入, 通过网络内部的结构设计有效捕捉序列之间的关系特征, 一般也是以序列形式进行输出。 RNN的循环机制使模型隐层**上一时间步产生的结果, 能够作为当下时间步…

Conda 管理python开发环境

同步发布于我的网站 &#x1f680; 故事起因: 在公司使用Requests多任务并行开发时遇到了问题&#xff0c;使用 ProcessPoolExecutor 时不能正常发出网络请求&#xff0c;会卡在网络请求发不出去&#xff0c;但是善于用 ThreadPoolExecutor 时是可以的,纠结了很久&#xff0c;一…

python打包深度学习虚拟环境

今天师兄让我把环境打包发给他&#xff0c;我才知道可以直接打包深度学习虚拟环境&#xff0c;这样另一个人就不用辛辛苦苦的去装环境了&#xff0c;我们都知道有些论文他需要的环境很难装上。比如装Apex&#xff0c;装 DCN&#xff0c;mmcv-full 我现在把3090机子上的ppft虚拟…

vue超过三行显示省略号和查看更多按钮

1、超过3行显示省略号和更多按钮&#xff0c;不超过3行正常显示&#xff1b; html: <div class"container"><div style"display: flex;"><div class"content"><div class"text-content" ref"textContentR…

什么是换电系统?驱动新能源汽车发展的“能源驿站”

随着新能源汽车保有量上升&#xff0c;新能源汽车充换电设施需求量同步增加。由于我国土地、电力资源相对紧张&#xff0c;随着车辆保有量继续增加&#xff0c;换电模式有望成为对充电模式的良好补充&#xff0c;具备广阔的中长期发展前景。蔚来是换电领域的先行者&#xff0c;…

最小有向包围盒——2D平面

目录 介绍 主要步骤 代码 __init__.py min_bounding_rect.py min_rect.py qhull_2d.py 结果 介绍 最小有向包围盒算法广泛应用于多个领域&#xff0c;包括&#xff1a; 计算几何&#xff1a;用于分析点集的边界特征。图形学&#xff1a;用于碰撞检测和物体包围。数据…

windows平台使用C#创建系统服务

使用 C# 在 Windows 平台创建和管理系统服务 在 Windows 平台上&#xff0c;系统服务&#xff08;Windows Service&#xff09;是一种运行在后台、无需用户交互的应用程序。系统服务广泛应用于长期任务处理、网络监听、后台调度等场景。本文将详细介绍如何使用 C# 创建一个 Win…

【C++笔记】位图和布隆过滤器

【C笔记】位图和布隆过滤器 &#x1f525;个人主页&#xff1a;大白的编程日记 &#x1f525;专栏&#xff1a;C笔记 文章目录 【C笔记】位图和布隆过滤器前言一. 位图1.1 位图相关面试题1.2 C库中的位图1.3位图优缺点1.4位图相关考察题目 二.布隆过滤器2.1 什么是布隆过滤器…