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) 是一种常见的设计模式,它属于创建型模式,主要用于定义一个用于创建对象的接口,让子类决定实例化哪一个类。通过使用工厂模式,客户端代码不需要直接实例化具体…...

【入坑系列】TiDB 强制索引在不同库下不生效问题
文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...

【JVM】- 内存结构
引言 JVM:Java Virtual Machine 定义:Java虚拟机,Java二进制字节码的运行环境好处: 一次编写,到处运行自动内存管理,垃圾回收的功能数组下标越界检查(会抛异常,不会覆盖到其他代码…...

CentOS下的分布式内存计算Spark环境部署
一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架,相比 MapReduce 具有以下核心优势: 内存计算:数据可常驻内存,迭代计算性能提升 10-100 倍(文档段落:3-79…...
Qt Http Server模块功能及架构
Qt Http Server 是 Qt 6.0 中引入的一个新模块,它提供了一个轻量级的 HTTP 服务器实现,主要用于构建基于 HTTP 的应用程序和服务。 功能介绍: 主要功能 HTTP服务器功能: 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...
【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验
系列回顾: 在上一篇中,我们成功地为应用集成了数据库,并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了!但是,如果你仔细审视那些 API,会发现它们还很“粗糙”:有…...
Rust 异步编程
Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...
leetcodeSQL解题:3564. 季节性销售分析
leetcodeSQL解题:3564. 季节性销售分析 题目: 表:sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...
在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?
uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件,用于在原生应用中加载 HTML 页面: 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...

招商蛇口 | 执笔CID,启幕低密生活新境
作为中国城市生长的力量,招商蛇口以“美好生活承载者”为使命,深耕全球111座城市,以央企担当匠造时代理想人居。从深圳湾的开拓基因到西安高新CID的战略落子,招商蛇口始终与城市发展同频共振,以建筑诠释对土地与生活的…...

Chrome 浏览器前端与客户端双向通信实战
Chrome 前端(即页面 JS / Web UI)与客户端(C 后端)的交互机制,是 Chromium 架构中非常核心的一环。下面我将按常见场景,从通道、流程、技术栈几个角度做一套完整的分析,特别适合你这种在分析和改…...