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

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:

  1. 编辑内核的配置文件
    您需要编辑内核的.config文件,这个文件通常位于内核源代码的根目录下。

  2. 修改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=""
    
  3. 保存并退出配置文件
    保存对.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-runscripts/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

注意:objcopyld 参数值的不同(elf32-86-64elf32_86_64)。

解决方法

假如查看到的工具链不支持需要的目标,只需升级工具链再重新编译内核即可。

小结
  • 64 位处理器运行原生 32 位程序,需要打开内核 CONFIG_X86_X32 选项。

  • CONFIG_X86_X32 选项需要工具链支持编译 elf32_x86_64 目标。

  • objcopy --helpld -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

  1. 理解清楚,GRUB_DEFAULT变量,是在这个文件中: /etc/default/grub ; 这里网上一些位置没有解释清楚。
  2. 直接/boot/grub/grub.cfg修改也是没有问题的。当然不太好。
  3. GRUB_DEFAULT从零开始
  4. 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. 数据库有哪些备份方法 完全备份:全部都备份一遍表备份:只提取数据库中的数据&#xff0…...

私有库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是一个质数&#xff0c;但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#中&#xff0c;工厂模式&#xff08;Factory Pattern&#xff09; 是一种常见的设计模式&#xff0c;它属于创建型模式&#xff0c;主要用于定义一个用于创建对象的接口&#xff0c;让子类决定实例化哪一个类。通过使用工厂模式&#xff0c;客户端代码不需要直接实例化具体…...

告别树莓派原生系统:我在SpotMicro上成功部署ROS Kinetic的完整踩坑记录

从树莓派到ROS Kinetic&#xff1a;SpotMicro四足机器人深度改造实战 当树莓派原生系统在SpotMicro项目上反复报错时&#xff0c;我盯着纹丝不动的前腿舵机&#xff0c;意识到是时候转向更专业的ROS方案了。这不是简单的系统切换&#xff0c;而是一次从底层架构到控制逻辑的全面…...

STM32标准库项目如何用VSCode一键编译下载?详解tasks.json与Makefile的联动配置

STM32标准库项目在VSCode中实现一键编译下载的终极指南 1. 为什么选择VSCode进行STM32开发&#xff1f; 传统嵌入式开发往往依赖于Keil、IAR等商业IDE&#xff0c;但这些工具存在几个明显痛点&#xff1a; 高昂的授权费用&#xff1a;商业IDE的许可证价格让个人开发者和小团队望…...

终极Ghidra安装指南:5分钟在Ubuntu系统快速部署逆向工程神器

终极Ghidra安装指南&#xff1a;5分钟在Ubuntu系统快速部署逆向工程神器 【免费下载链接】ghidra_installer Helper scripts to set up OpenJDK 11 and scale Ghidra for 4K on Ubuntu 18.04 / 18.10 项目地址: https://gitcode.com/gh_mirrors/gh/ghidra_installer 想要…...

基于Vue的沧交食堂食品监管系统[vue]-计算机毕业设计源码+LW文档

摘要&#xff1a;本文阐述了一个基于Vue框架开发的沧交食堂食品监管系统。该系统旨在借助现代Web技术&#xff0c;强化对沧交食堂食品安全的监管力度&#xff0c;提升监管效率与质量。系统涵盖了系统用户管理、新闻数据管理、食品相关业务管理以及评论管理等多方面功能。文章详…...

从if-else到assign:聊聊RTL代码风格如何影响X态传播与电路质量

从if-else到assign&#xff1a;RTL代码风格对X态传播与电路质量的深层影响 在数字IC设计领域&#xff0c;X态就像电路中的"幽灵信号"&#xff0c;它无声无息地潜伏在设计中&#xff0c;直到某个关键时刻突然显现&#xff0c;引发难以追踪的异常行为。对于RTL工程师而…...

MySQL局域网远程连接测试教程

MySQL局域网远程连接测试教程1本地服务器安装MySQL服务器&#xff0c;安装MySQL shell, Workbench(非必须)防火墙配置2远程访问用户电脑配置IP配置安装 Workbench客户端1本地服务器 安装MySQL服务器&#xff0c;安装MySQL shell, Workbench(非必须) 点击右下角的Advanced Opt…...

银河麒麟服务器系统4.02-sp2实战:飞腾架构下的虚拟机优化与远程管理

1. 银河麒麟服务器系统与飞腾架构概述 银河麒麟服务器系统4.02-sp2是国内自主研发的企业级操作系统&#xff0c;特别针对飞腾处理器架构进行了深度优化。飞腾作为国产CPU的代表之一&#xff0c;采用ARMv8指令集&#xff0c;在政务、金融等关键领域广泛应用。这套组合最大的特点…...

本地Cookie导出终极指南:Get cookies.txt LOCALLY 安全使用教程

本地Cookie导出终极指南&#xff1a;Get cookies.txt LOCALLY 安全使用教程 【免费下载链接】Get-cookies.txt-LOCALLY Get cookies.txt, NEVER send information outside. 项目地址: https://gitcode.com/gh_mirrors/ge/Get-cookies.txt-LOCALLY 你是否曾担心浏览器Coo…...

手把手教你用RTABMAP+T265在Windows10上实现室内三维扫描(含标定技巧)

手把手教你用RTABMAPT265在Windows10上实现高精度室内三维扫描 第一次接触室内三维扫描时&#xff0c;我被这项技术深深吸引——它能让物理空间瞬间数字化&#xff0c;就像给现实世界按下"CtrlC"。但真正动手配置RTABMAP和T265相机时&#xff0c;才发现这条路并不平坦…...

从防火墙到AI:企业级网络异常检测方案选型指南(2024最新版)

从防火墙到AI&#xff1a;企业级网络异常检测方案选型指南&#xff08;2024最新版&#xff09; 当某跨国零售企业遭遇持续3天的DDoS攻击导致线上业务瘫痪时&#xff0c;技术团队发现传统防火墙规则库已48小时未更新&#xff1b;而当某金融机构因AI模型误判正常促销流量为异常导…...