linux内核编译启动总结
linux kernel 编译 升级汇总
- 写在前面
- 内核编译
- 获取kernel代码
- 开始前的准备工作
- 编译过程
- 1\.解压与净化
- 将下载好的linux内核解压至`/usr/src`
- 2\. 得到源代码后,将其净化
- 3\. 配置要进行编译的内核
- 4.编译内核. (15分钟)
- 5.编译模块.
- 方法1:
- 方法2:
- 6.安装模块
- 源码分析
- 查看工具链支持的编译目标
- 解决方法
- 小结
- 7.打包
- 8.到此为止,构建内核完毕,把内核映象和System.map拷贝到/boot/下
- DWARF
- grub
- 升级
- 还原到旧的版本
写在前面
收集自己编译内核的一些信息
版本:5.15.126
为什么选这个版本:该版本的lttng可以正常工作。
内核编译
这个文章相对交清楚
https://blog.csdn.net/weixin_62882080/article/details/124260136
获取kernel代码
到哪里下代码,尽管似乎现在倾向于基于github来下kernel代码和编译,但我认为,还是传统的方式更正确,对大部分人来说。
www.kernel.org
www.kernel.org/pub/linux/kernel/v5.x/
开始前的准备工作
输入下面命令完成安装需要的包
sudo apt-get install libncurses5-dev openssl libssl-dev
sudo apt-get install build-essential openssl
sudo apt-get install pkg-config
sudo apt-get install libc6-dev
sudo apt-get install bison
sudo apt-get install flex
sudo apt-get install libelf-dev
sudo apt-get install zlibc minizip
sudo apt-get install libidn11-dev libidn11
还有:
sudo apt-get update
sudo apt-get install flex
sudo apt-get install bison
sudo apt-get install zstd
编译过程
先切换到root用户
1.解压与净化
将下载好的linux内核解压至/usr/src
tar -xavf linux-5.15.126.tar.xz -C /usr/srccd /usr/src/linux-5.15.126
2. 得到源代码后,将其净化
这步,目前来看,最好不要做。
make mrproper
然后可以git init
git add .
git commit -s -m “init”
如果还没有配置用户:
git config --global user.name “YourName”
git config --global user.email “YourName@qq.com”
3. 配置要进行编译的内核
cp /boot/config-`uname -r` ./.configmake menuconfig
4.编译内核. (15分钟)
make bzImage -j$(nproc)
_(-j表示加速,$(nproc)代表着线程数,或占用核数量)
5.编译模块.
make modules -j4
遇到如下错误:
root@xylxperf:/usr/src/linux-5.15.126# make modules -j4DESCEND objtoolDESCEND bpf/resolve_btfidsCALL scripts/atomic/check-atomics.shCALL scripts/checksyscalls.shCHK include/generated/compile.h
make[1]: *** No rule to make target 'debian/canonical-certs.pem', needed by 'certs/x509_certificate_list'. Stop.
make[1]: *** Waiting for unfinished jobs....
make: *** [Makefile:1905: certs] Error 2
make: *** Waiting for unfinished jobs....CHK kernel/kheaders_data.tar.xz
以及,如果报错 canonical-revoked-certs.pem:
make[1]: *** No rule to make target 'debian/canonical-revoked-certs.pem', needed by 'certs/x509_revocation_list'. Stop.
make: *** [Makefile:1868: certs] Error 2
方法1:
https://blog.csdn.net/m0_47696151/article/details/121574718
debian/canonical-certs.pem
scripts/config --disable SYSTEM_TRUSTED_KEYS
canonical-revoked-certs.pem
scripts/config --disable SYSTEM_REVOCATION_KEYS
通常是由于内核配置中包含了对debian/canonical-certs.pem文件的引用,但是该文件在您的系统中不存在。为了解决这个问题,
方法2:
-
编辑内核的配置文件:
您需要编辑内核的.config文件,这个文件通常位于内核源代码的根目录下。 -
修改CONFIG_SYSTEM_TRUSTED_KEYS配置项:
在.config文件中找到CONFIG_SYSTEM_TRUSTED_KEYS这一行,将其设置为空值。修改前可能是这样的:CONFIG_SYSTEM_TRUSTED_KEYS="debian/canonical-certs.pem"修改后应该是:
CONFIG_SYSTEM_TRUSTED_KEYS=""如果存在
CONFIG_SYSTEM_REVOCATION_KEYS配置项,并且它也被设置为包含debian/canonical-revoked-certs.pem,同样将其设置为空值:CONFIG_SYSTEM_REVOCATION_KEYS="" -
保存并退出配置文件:
保存对.config文件的更改后退出编辑器。
这个问题,有许多解决的办法。原本我记得,只需要配置几个变量即可。
6.安装模块
make INSTALL_MOD_STRIP=1 modules_install
这里需要斟酌一下。
如果我们还需要调试符号,就应当指明strip的内容放在哪里:
export MODLIB=/usr/lib/modules/$(uname -r)/.debug
make INSTALL_MOD_STRIP=1 modules_install
报这个错
arch/x86/Makefile:142: CONFIG_X86_X32 enabled but no binutils support
sed: can't read modules.order: No such file or directory
make: *** [Makefile:1544: __modinst_pre] Error 2
root@xylxperf:/usr/src/linux-5.15.126# get install --reinstall binutils
Command 'get' not found, but there are 18 similar ones.
root@xylxperf:/usr/src/linux-5.15.126# apt get install --reinstall binutils
E: Invalid operation get
要么重装,
root@xylxperf:/usr/src/linux-5.15.126# apt install --reinstall binutils
要么关闭32位支持
禁用CONFIG_X86_X32:如果您不需要x32支持,可以通过编辑内核的.config文件,注释掉CONFIG_X86_X32这一行,然后重新编译内核。
注意,这个issue只在特定版本上出。很难解决,是个很顽固的bug,对,我是说这是个bug.因为我的binutils版本是大于要求版本的。而且64位运行32位程序,是个正常需求。
我认为正确的解决应当是这个
https://blog.csdn.net/weixin_33755557/article/details/92246999
CONFIG_X86_X32 enabled but no binutils support
源码分析
在内核源码中搜索上述警告,定位到 arch/x86/Makefile:
ifdef CONFIG_X86_X32x32_ld_ok := $(call try-run,\/bin/echo -e '1: .quad 1b' | \ $(CC) $(KBUILD_AFLAGS) -c -x assembler -o "$$TMP" - && \ $(OBJCOPY) -O elf32-x86-64 "$$TMP" "$$TMPO" && \ $(LD) -m elf32_x86_64 "$$TMPO" -o "$$TMP",y,n)ifeq ($(x32_ld_ok),y)CONFIG_X86_X32_ABI := yKBUILD_AFLAGS += -DCONFIG_X86_X32_ABIKBUILD_CFLAGS += -DCONFIG_X86_X32_ABI else$(warning CONFIG_X86_X32 enabled but no binutils support)endifendif
此段代码即是根据 try-run 的运行结果确定工具链是否支持 elf32_x86_64,如果支持则定义 CONFIG_X86_X32_ABI,否则输出前述编译警告。
try-run 在 scripts/Kbuild.include 中定义:
# output directory for tests belowTMPOUT := $(if $(KBUILD_EXTMOD),$(firstword $(KBUILD_EXTMOD))/)# try-run# Usage: option = $(call try-run, $(CC)...-o "$$TMP",option-ok,otherwise)# Exit code chooses option. "$$TMP" serves as a temporary file and is# automatically cleaned up.try-run = $(shell set -e; \TMP="$(TMPOUT).$$$$.tmp"; \TMPO="$(TMPOUT).$$$$.o"; \ if ($(1)) >/dev/null 2>&1; \then echo "$(2)"; \ else echo "$(3)"; \fi; \rm -f "$$TMP" "$$TMPO")
其作用是执行第一个入参指定的命令,如果成功则输出第二个入参,失败则输出第三个入参,最后删除临时目录下的两个临时文件。
结合 arch/x86/Makefile 的使用情况,完成如下三个操作:
-
将一行汇编语句使用
gcc编译成.$$$$.tmp; -
使用
objcopy将.$$$$.tmp转换为elf32-x86-64格式的.$$$$.o; -
最后使用
ld将.$$$$.o链接为elf32_x86_64目标的.$$$$.tmp(复用此文件名)。
假如三个操作都没有错误发生,表明目标工具链支持 x32 ABI 对应的选项,则 x32_ld_ok 变量赋值为 y,否则赋值为 n。
其中要编译的汇编语句仅有一行,作用是定义一个值为 1 的 64 比特数值,仅用于后续的选项测试,没有实际功能:
1: .quad 1b
查看工具链支持的编译目标
在 objcopy --help 的最后可查看其支持的目标,其中包括 elf32-86-64,各个目标可作为 -O 参数传入:
objcopy: supported targets: elf64-x86-64 elf32-i386 elf32-iamcu elf32-x86-64 pei-i386 pei-x86-64 elf64-l1om elf64-k1om elf64-little elf64-big elf32-little elf32-big pe-x86-64 pe-bigobj-x86-64 pe-i386 plugin srec symbolsrec verilog tekhex binary ihex
ld -V 可查看其支持的目标,其中包括 elf32_86_64,各个目标可作为 -m 参数传入:
# ld -VGNU ld (GNU Binutils for Ubuntu) 2.31.1Supported emulations:elf_x86_64elf32_x86_64elf_i386elf_iamcuelf_l1omelf_k1omi386pepi386pe
注意:objcopy 和 ld 参数值的不同(elf32-86-64 和 elf32_86_64)。
解决方法
假如查看到的工具链不支持需要的目标,只需升级工具链再重新编译内核即可。
小结
-
64 位处理器运行原生 32 位程序,需要打开内核
CONFIG_X86_X32选项。 -
CONFIG_X86_X32选项需要工具链支持编译elf32_x86_64目标。 -
objcopy --help和ld -V可查看两个命令支持的目标格式。
7.打包
这个命令的作用是把/lib/modules/5.17.3中对应的.ko驱动打包到initrd.img文件中。
8.到此为止,构建内核完毕,把内核映象和System.map拷贝到/boot/下
mkinitramfs /lib/modules/5.17.3 -o /boot/initrd.img-5.17.3-generic
DWARF
sudo apt-get install libdw-dev
sudo apt-get install libelf-dev
sudo apt-get install dwarves
#cp /usr/src/linux-5.15.126/arch/x86/boot/bzImage /boot/vmlinuz-5.15.126-generic#cp /usr/src/linux-5.15.126/System.map /boot/System.map-5.15.126
grub
升级
升级很简单,只要确保编译之后的文件放在指定位置:/boot
然后
sudo update-grub
即完成。
自动将当前最新的排在0的位置
还原到旧的版本
这步就需要了解一些内容。
如何更换,这一篇是最好的
https://www.cnblogs.com/qusixing/p/17995926
- 理解清楚,GRUB_DEFAULT变量,是在这个文件中: /etc/default/grub ; 这里网上一些位置没有解释清楚。
- 直接/boot/grub/grub.cfg修改也是没有问题的。当然不太好。
- GRUB_DEFAULT从零开始
- GRUB_DEFAULT="1>2"表示大菜单项的,第2个小项。这里好像有点问题,虽然我成功了,但显示的启动菜单,完全不是我们想要的样子。
相关文章:
linux内核编译启动总结
linux kernel 编译 升级汇总 写在前面内核编译获取kernel代码开始前的准备工作 编译过程1\.解压与净化将下载好的linux内核解压至/usr/src 2\. 得到源代码后,将其净化3\. 配置要进行编译的内核4.编译内核. (15分钟)5.编译模块.方法1:方法2: 6…...
Android Studio的AI工具插件使用介绍
Android Studio的AI工具插件使用介绍 一、前言 Android Studio 的 AI 工具插件具有诸多重要作用,以下是一些常见的方面: 代码生成与自动补全 代码优化与重构 代码解读 学习与知识获取 智能搜索与资源推荐实际使用中可以添加注释,解读某段代…...
本地部署 WireGuard 无需公网 IP 实现异地组网
WireGuard 是一个高性能、极简且易于配置的开源虚拟组网协议。使用路由侠内网穿透使其相互通讯。 第一步,服务端(假设为公司电脑)和客户端(假设为公司外的电脑)安装部署 WireGuard 1,点此下载(…...
asyncio.ensure_future 与 asyncio.create_task:Python异步编程中的选择
asyncio.ensure_future 与 asyncio.create_task:Python异步编程中的选择 引言asyncio.ensure_futureasyncio.create_task两者的区别参数接受范围任务调度的保证代码可读性 哪个更好?使用asyncio.create_task使用asyncio.ensure_future 结论参考 引言 在…...
CTF之密码学(密码特征分析)
一.MD5,sha1,HMAC,NTLM 1.MD5:MD5一般由32/16位的数字(0-9)和字母(a-f)组成的字符串 2.sha1:这种加密的密文特征跟MD5差不多,只不过位数是40(sha256:64位;sha512:128位) 3.HMAC:这…...
JVM调优篇之JVM基础入门AND字节码文件解读
目录 Java程序编译class文件内容常量池附录-访问标识表附录-常量池类型列表 Java程序编译 Java文件通过编译成class文件后,通过JVM虚拟机解释字节码文件转为操作系统执行的二进制码运行。 规范 Java虚拟机有自己的一套规范,遵循这套规范,任…...
EXCEL截取某一列从第一个字符开始到特定字符结束的字符串到新的一列
使用EXCEL中的公式进行特定截取 假设列A是一组产品的编码,我们需要的数据是“-”之前的字段。 我们需要在B1单元格输入公式“LEFT(A1,SEARCH("-",A1)-1)”然后选中B1至B4单元格,按“CTRLD”向下填充,就可以得出其它几行“-”之前的…...
数据库期末复习题库
1. Mysql日志功能有哪些? 记录日常操作和错误信息,以便了解Mysql数据库的运行情况,日常操作,错误信息和进行相关的优化。 2. 数据库有哪些备份方法 完全备份:全部都备份一遍表备份:只提取数据库中的数据࿰…...
私有库gitea安装
一 gitea是什么 Gitea是一款自助Git服务,简单来说,就是可以一个私有的github。 搭建很容易。 Gitea依赖于Git。 类似Gitea的还有GitHub、Gitee、GitLab等。 以下是安装步骤。 二 安装sqilite 参考: 在windows上安装sqlite 三 安装git…...
关于最近win11不能使用ie,而不能使用考试客户端的解决方法
弄ie的那个我感觉是非常难的,所以我的是另一种的方法 下载360浏览器(不是360全家桶)360安全浏览器-全面保护上网安全,4亿用户共同选择(上面的是官网,不要下载错了,还有安装界面注意不要勾选一下…...
深度学习之Mask-R-CNN
1.1 Mask-RCNN 的网络结构示意图 其中黑色部分为原来的Faster-RCNN,红色部分为在Faster网络上的修改: 1)将ROI Pooling层替换成了ROIAlign; 2)添加并列的FCN层(Mask层); …...
css包含块
包含块 出现 在css中一些属性的计算可能超出你的预料,在普遍情况下会认为定位属性和百分比的宽高是根据父元素计算的,但是准确来说他们都是根据元素所在的包含块来计算的,所以掌握包含块的知识是非常关键的。 内容 在CSS中,“…...
混沌工程/混沌测试/云原生测试/云平台测试
背景 私有云/公有云/混合云等具有复杂,分布式,环境多样性等特点,许多特殊场景引发的线上问题很难被有效发现。所以需要引入混沌工程,建立对系统抵御生产环境中失控条件的能力以及信心,提高系统面对未知风险得能力。 …...
研发设计数字化:PLM、PDM、ERP介绍及其区别
一、产品全生命周期管理的定义 1.1 产品全生命周期(PLM)发展背景 目前,数字化设计与制造的技术(如CAX、DFX等)已经在产品开发中得到广泛应用,而各种企业和产品管理软件(如ERP、SCM、PDM、CRM等…...
Python练习51
Python日常练习 题目: 调用函数fun判断一个三位数是否“水仙花数”。 在main函数中从键盘输入一个三位数,并输 出判断结果。请编写fun函数。 说明: 所谓“水仙花数”是指一3位数,其各位数字立方和 等于该数本…...
Qt 前置课程 QtNFC
文章目录 详解 Qt NFC 模块(QtNFC)1. 什么是 NFC?2. NFC 的原理2.1 主动设备与被动设备2.2 三种工作模式2.3 数据交换 3. QtNFC 模块概述4. 使用 QtNFC 模块4.1 配置 .pro 文件 5. NFC 的常见应用场景6. QtNFC 模块的主要类6.1 QNearFieldMan…...
【论文阅读】 Learning to Upsample by Learning to Sample
论文结构目录 一、之前的上采样器二、DySample概述三、不同上采样器比较四、整体架构五、设计过程(1)初步设计(2)第一次修改(3)第二次修改(4)第三次修改 六、DySample四种变体七、复…...
堆排序(含证明)
引言 前面我们讲过堆的基本操作的实现,现在给定一个int类型的数组,里面存放的数据是无序的,我们如何利用堆的思想来实现数组内数据的升序排列或降序排列呢? 通过前面讲到的堆的实现,我们可以想到,我们再开…...
蓝桥杯模拟题不知名题目
题目:p是一个质数,但p是n的约数。将p称为是n的质因数。求2024最大质因数。 #include<iostream> #include<algorithm> using namespace std; bool fun(int x) {for(int i 2 ; i * i < x ; i){if(x % i 0)return false;}return true; } int main() …...
C#中的工厂模式
在C#中,工厂模式(Factory Pattern) 是一种常见的设计模式,它属于创建型模式,主要用于定义一个用于创建对象的接口,让子类决定实例化哪一个类。通过使用工厂模式,客户端代码不需要直接实例化具体…...
SpringBoot-17-MyBatis动态SQL标签之常用标签
文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...
微信小程序之bind和catch
这两个呢,都是绑定事件用的,具体使用有些小区别。 官方文档: 事件冒泡处理不同 bind:绑定的事件会向上冒泡,即触发当前组件的事件后,还会继续触发父组件的相同事件。例如,有一个子视图绑定了b…...
ES6从入门到精通:前言
ES6简介 ES6(ECMAScript 2015)是JavaScript语言的重大更新,引入了许多新特性,包括语法糖、新数据类型、模块化支持等,显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var…...
学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1
每日一言 生活的美好,总是藏在那些你咬牙坚持的日子里。 硬件:OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写,"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...
CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)
漏洞概览 漏洞名称:Apache Flink REST API 任意文件读取漏洞CVE编号:CVE-2020-17519CVSS评分:7.5影响版本:Apache Flink 1.11.0、1.11.1、1.11.2修复版本:≥ 1.11.3 或 ≥ 1.12.0漏洞类型:路径遍历&#x…...
向量几何的二元性:叉乘模长与内积投影的深层联系
在数学与物理的空间世界中,向量运算构成了理解几何结构的基石。叉乘(外积)与点积(内积)作为向量代数的两大支柱,表面上呈现出截然不同的几何意义与代数形式,却在深层次上揭示了向量间相互作用的…...
VSCode 使用CMake 构建 Qt 5 窗口程序
首先,目录结构如下图: 运行效果: cmake -B build cmake --build build 运行: windeployqt.exe F:\testQt5\build\Debug\app.exe main.cpp #include "mainwindow.h"#include <QAppli...
GB/T 43887-2024 核级柔性石墨板材检测
核级柔性石墨板材是指以可膨胀石墨为原料、未经改性和增强、用于核工业的核级柔性石墨板材。 GB/T 43887-2024核级柔性石墨板材检测检测指标: 测试项目 测试标准 外观 GB/T 43887 尺寸偏差 GB/T 43887 化学成分 GB/T 43887 密度偏差 GB/T 43887 拉伸强度…...
AT模式下的全局锁冲突如何解决?
一、全局锁冲突解决方案 1. 业务层重试机制(推荐方案) Service public class OrderService {GlobalTransactionalRetryable(maxAttempts 3, backoff Backoff(delay 100))public void createOrder(OrderDTO order) {// 库存扣减(自动加全…...
【AI News | 20250609】每日AI进展
AI Repos 1、OpenHands-Versa OpenHands-Versa 是一个通用型 AI 智能体,通过结合代码编辑与执行、网络搜索、多模态网络浏览和文件访问等通用工具,在软件工程、网络导航和工作流自动化等多个领域展现出卓越性能。它在 SWE-Bench Multimodal、GAIA 和 Th…...
