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) 是一种常见的设计模式,它属于创建型模式,主要用于定义一个用于创建对象的接口,让子类决定实例化哪一个类。通过使用工厂模式,客户端代码不需要直接实例化具体…...
网络编程(Modbus进阶)
思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...
未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?
编辑:陈萍萍的公主一点人工一点智能 未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战,在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...
<6>-MySQL表的增删查改
目录 一,create(创建表) 二,retrieve(查询表) 1,select列 2,where条件 三,update(更新表) 四,delete(删除表…...
2025年能源电力系统与流体力学国际会议 (EPSFD 2025)
2025年能源电力系统与流体力学国际会议(EPSFD 2025)将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会,EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...
【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器
——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的一体化测试平台,覆盖应用全生命周期测试需求,主要提供五大核心能力: 测试类型检测目标关键指标功能体验基…...
在rocky linux 9.5上在线安装 docker
前面是指南,后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...
WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)
一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解,适合用作学习或写简历项目背景说明。 🧠 一、概念简介:Solidity 合约开发 Solidity 是一种专门为 以太坊(Ethereum)平台编写智能合约的高级编…...
3403. 从盒子中找出字典序最大的字符串 I
3403. 从盒子中找出字典序最大的字符串 I 题目链接:3403. 从盒子中找出字典序最大的字符串 I 代码如下: class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...
ArcGIS Pro制作水平横向图例+多级标注
今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作:ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等(ArcGIS出图图例8大技巧),那这次我们看看ArcGIS Pro如何更加快捷的操作。…...
【Oracle】分区表
个人主页:Guiat 归属专栏:Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...
