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

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.kler.cn/a/419091.html

相关文章:

  • 【代码随想录|贪心算法02】
  • CENet及多模态情感计算实战
  • Redis(4):主从复制
  • SE16N 外键校验报错问题
  • 家庭打印机如何连接电脑
  • 嵌入式开发之STM32单片机结构
  • spring boot 调用C#封装的DLL文件中的函数
  • 力扣3372.连接两棵树后最大目标节点数目I
  • 内网使用docker搭建librespeed测速网站
  • 挑战用React封装100个组件【004】
  • UaGateway:实现OPC DA和OPC UA的高效转换
  • FFmpeg一些常用的命令
  • ElasticSearch的学习
  • JAVA中HashMap、TreeMap、LinkedHashMap 的用法与注意事项
  • 简单搭建qiankun的主应用和子应用并且用Docker进行服务器部署
  • AI高中数学教学视频生成技术:利用通义千问、MathGPT、视频多模态大模型,语音大模型,将4个模型融合 ,生成高中数学教学视频,并给出实施方案。
  • MySQL索引与分区:性能优化的关键
  • openbmc dbus架构简析(二)
  • DDR3与MIG IP核详解(一)
  • ESP32-S3模组上跑通ES8388(12)
  • SpringBoot集成swagger3
  • 【Docker】部署nginx
  • 常用元器件使用方法36:USB转串口芯片CH340X
  • 【07】MySQL中的DQL(数据查询语言)详解
  • 【JavaWeb maven基础知识总结】
  • RabbitMQ rabbitmq.conf配置文件详解