Linux内核的编译、安装、调试

news2024/11/16 13:33:26

这里写目录标题

  • 编译安装内核
    • 下载内核
    • 安装依赖
    • 更改.config
    • 编译内核
    • 安装
      • 首先安装模块
      • 安装内核
      • 更改引导
      • 更改`grub`
      • 重启
    • 其他操作
      • 清理内核源目录
      • 卸载安装的内核
      • 修改内核配置菜单实现对新加入内核源码的控制
    • 常见问题
      • 1. Module.symvers is missing
      • 2. No rule to make target ‘debian/canonical-certs.pem‘, needed by ‘certs/x509_certificate_list‘
      • 3. FAILED:load BTF from vmlinux:No such file or directory
      • 4. 安装完内核之后无法显示`GRUB`用以选择内核启动<a name="GRUB"/>
      • 5. 内核启动卡在`loading initial ramdisk`<a name="ramdisk"/>
      • 6. sign-file: : No such file or directory
      • 7. zstd: not found
    • 单独编译Linux内核的某一个模块
  • qemu+gdb调试linux内核
    • 安装qemu
    • 配置调试版内核
    • 构建initramfs根文件系统
    • 调试
  • 参考

编译安装内核

下载内核

Linux内核下载The Linux Kernel Archives

安装依赖

sudo apt-get install gcc g++ libncurses5-dev build-essential kernel-package libssl-dev libc6-dev bin86 flex bison qttools5-dev libelf-dev

更改.config

#拷贝现有ubuntu的.config至编译内核的目录
cp -v /boot/config-$(uname -r) .config
make menuconfig
  1. 打开.config更改CONFIG_SYSTEM_TRUSTED_KEYS CONFIG_SYSTEM_REVOCATION_KEYS
CONFIG_SYSTEM_TRUSTED_KEYS=''
CONFIG_SYSTEM_EXTRA_CERTIFICATE_SIZE=2048
CONFIG_SYSTEM_REVOCATION_KEYS=""
  1. 更改CONFIG_DEBUG_INFO_BTF
CONFIG_DEBUG_INFO_BTF=n
  1. 注释掉CONFIG_X86_X32
#CONFIG_X86_X32=y

编译内核

#基于文本选单的配置界面,字符终端下推荐使用
make menuconfig

make -j$(nproc)

make all

# 编译模块
make -j$(nproc) modules

安装

首先安装模块

这里加上INSTALL_MOD_STRIP=1是为了避免内核启动时卡在 loading initial ramdisk

sudo make INSTALL_MOD_STRIP=1 modules_install

安装内核

make bzImage
sudo make install

更改引导

sudo update-initramfs -c -k 5.10.0

更改grub

修改文件

sudo vi /etc/default/grub
#GRUB_TIMEOUT_STYLE=hidden
GRUB_TIMEOUT=10

更新

sudo update-grub

重启

reboot

GRUB页面选择Advanced options for Ubuntu

在这里插入图片描述

选择需要启动的内核版本

在这里插入图片描述

在这里插入图片描述

安装新内核之前的内核版本

在这里插入图片描述

安装新内核之后

若重启未看到选择内核的页面参考

其他操作

清理内核源目录

# make mrproper会删除配置的.config以及其他备份
sudo make mrproper
# make clean会删除编译过程中生成的中间文件和内核镜像文件
sudo make clean

卸载安装的内核

获取所有安装的内核版本

dpkg --get-selections | grep linux

选择要卸载的版本,卸载下列安装包

sudo apt remove linux-image-<版本>-generic
sudo apt remove linux-headers-<版本>
sudo apt remove linux-headers-<版本>-generic
sudo apt remove linux-modules-<版本>-generic

卸载源码版本

sudo rm /boot/vmlinuz-5.10.0
sudo rm /boot/initrd.img-5.10.0
sudo rm /boot/System.map-5.10.0
sudo rm /boot/config-5.10.0
sudo rm -rf /lib/modules/5.10.0

更新启动引导

sudo update-grub

修改内核配置菜单实现对新加入内核源码的控制

  1. 将源码拷贝到内核对应的文件夹下

  2. 为配置界面添加控制新加入源代码的内容

    在加入源码的目录下创建Kconfig文件,便添加相应控制内容

  3. 修改上层Kconfig文件,包含新加入源码的Kconfig文件。

  4. 修改Makefile文件

  5. 修改上一级目录的Makefile

make[1]: *** No rule to make target 'debian/canonical-certs.pem', needed by 'certs/x509_certificate_list'.  Stop.
make: *** [Makefile:1868: certs] Error 2

解决方法(104) how to fix the error "No rule to make target ‘debian canonical certs pem’, needed by 'certs x509 cer - YouTube:

nano .config
查找到debian/canonical-certs.pem和debian/canonical-revoked-certs.pem字符串删除
BTF: .tmp_vmlinux.btf: pahole (pahole) is not available

解决方法

sudo apt install dwarves

常见问题

1. Module.symvers is missing

WARNING: Symbol version dump "Module.symvers" is missing.
         Modules may not have dependencies or modversions.
         You may get many unresolved symbol warnings.

执行

make modules_prepare

2. No rule to make target ‘debian/canonical-certs.pem‘, needed by ‘certs/x509_certificate_list‘

可以修改config:

vim .config

修改CONFIG_SYSTEM_TRUSTED_KEYS,将其置空: CONFIG_SYSTEM_TRUSTED_KEYS=""也可能需要设置CONFIG_SYSTEM_REVOCATION_KEYS为空。

3. FAILED:load BTF from vmlinux:No such file or directory

vim .config

修改CONFIG_DEBUG_INFO_BTF,将其置n

4. 安装完内核之后无法显示GRUB用以选择内核启动

进入命令行之后执行

sudo vi /etc/default/grub

注释掉

# GRUB_TIMEOUT_STYLE=hidden

修改

GRUB_TIMEOUT=10

GRUB_COMLINE_LINUX_DEFAULT="text"

执行

sudo update-grub

在这里插入图片描述

5. 内核启动卡在loading initial ramdisk

编译内核过程中,当安装内核模块时未使用

INSTALL_MOD_STRIP=1

标注,会导致initrd文件过大,Ubuntu 20.04所用的Grub 2.04无法支持过大的initrd文件(如500M),导致内核启动时卡在“loading initial ramdisk”(Can’t allocate initrd)

可行的办法:

安装模块时加上INSTALL_MOD_STRIP=1

sudo make INSTALL_MOD_STRIP=1 modules_install

6. sign-file: : No such file or directory

报错信息:

在这里插入图片描述

解决方法:

.configCONFIG_MODULE_SIG_KEY="cert/signing_key.pem"恢复后解决。

CONFIG_MODULE_SIG_KEY="cert/signing_key.pem"

7. zstd: not found

ZSTD22  arch/x86/boot/compressed/vmlinux.bin.zst
/bin/sh: 1: zstd: not found
make[2]: *** [arch/x86/boot/compressed/Makefile:134:arch/x86/boot/compressed/vmlinux.bin.zst] 错误 127
make[2]: *** 正在删除文件“arch/x86/boot/compressed/vmlinux.bin.zst” make[1]: *** [arch/x86/boot/Makefile:115:arch/x86/boot/compressed/vmlinux] 错误 2

解决方法

在配置内核时更改Kernel compression modeLZMA

General setup  --->
	Kernel compression mode (LZMA)  --->

保存后重新编译安装即可。

单独编译Linux内核的某一个模块

找到对应的模块文件夹,找到需要编译的文件,确认编译的config文件

make CONFIG_INFINIBAND=m -C <源码> M=<模块文件夹> modules

qemu+gdb调试linux内核

安装qemu

sudo apt install qemu

配置调试版内核

对内核进行调试需要解析符号信息,所以得编译一个调试版内核。

cd linux-5.15
make menuconfig

这里需要开启内核参数CONFIG_DEBUG_INFOCONFIG_GDB_SCRIPTS。GDB提供了Python接口来扩展功能,内核基于Python接口实现了一系列辅助脚本,简化内核调试,开启CONFIG_GDB_SCRIPTS参数就可以使用了。

Kernel hacking  --->
    [*] Kernel debugging
    Compile-time checks and compiler options  --->
        [*] Compile the kernel with debug info
        [*]   Provide GDB scripts for kernel debugging

构建initramfs根文件系统

Linux系统启动阶段,boot loader加载完内核文件vmlinuz后,内核紧接着需要挂载磁盘根文件系统,但如果此时内核没有相应驱动,无法识别磁盘,就需要先加载驱动,而驱动又位于/lib/modules,得挂载根文件系统才能读取,这就陷入了一个两难境地,系统无法顺利启动。于是有了initramfs根文件系统,其中包含必要的设备驱动和工具,boot loader加载initramfs到内存中,内核会将其挂载到根目录/,然后运行/init脚本,挂载真正的磁盘根文件系统。

这里借助BusyBox构建极简initramfs,提供基本的用户态可执行程序。

编译BusyBox,配置CONFIG_STATIC参数,编译静态版BusyBox,编译好的可执行文件busybox不依赖动态链接库,可以独立运行,方便构建initramfs。

cd busybox-1.28.0
make menuconfig
Settings  --->
    [*] Build static binary (no shared libs)
make -j 20
make install

会安装在_install目录:

ls _install
bin  linuxrc  sbin  usr

创建initramfs,其中包含BusyBox可执行程序、必要的设备文件、启动脚本init。这里没有内核模块,如果需要调试内核模块,可将需要的内核模块包含进来。init脚本只挂载了虚拟文件系统procfssysfs,没有挂载磁盘根文件系统,所有调试操作都在内存中进行,不会落磁盘。

mkdir initramfs
cd initramfs
cp ../_install/* -rf ./
mkdir dev proc sys
sudo cp -a /dev/{null, console, tty, tty1, tty2, tty3, tty4} ./dev/
rm linuxrc
vim init
chmod a+x init
ls
bin   dev  init  proc  sbin  sys   usr

init文件的内容

#!/bin/sh
mount -t proc none /proc
mount -t sysfs none /sys
echo -e "\nBoot took $(cut -d' ' -f1 /proc/uptime) seconds\n"
exec /bin/sh

打包initramfs

find . -print0 | cpio --null -ov --format=newc | gzip -9 > ../initramfs.cpio.gz

调试

cd busybox-xxx
qemu-system-x86_64 -s -kernel /path/to/vmlinux -initrd initramfs.cpio.gz -nographic -append "console=ttyS0"
  • -s-gdb tcp::1234的缩写,监听1234端口,在GDB中通过target remote localhost:1234连接;
  • -kernel 指定编译好的调试内核vmlinux路径;
  • initrd 指定制作好的initramfs
  • -nographic取消图形输出窗口,试qemu成简单的命令行程序。
  • -append "console=ttyS0"将输出重定向到console,将会显示在标准输出stdio。

启动后的根目录

/ ls
bin   dev  init  proc  root  sbin  sys   usr

参考

使用QEMU和GDB调试Linux内核 | Consen

Linux下使用内核源码单独编译某一模块 - tycoon3 - 博客园 (cnblogs.com)

内核错误: No rule to make target ‘debian/canonical-certs.pem‘, needed by ‘certs/x509_certificate_list‘_no rule to make target 'debian/canonical-certs.pem_蓝天居士的博客-CSDN博客

Linux 内核 下载 编译 安装 2021 ubuntu_yaoxinJJJ的博客-CSDN博客

内核Module.symvers文件揭秘 - Linux内核编程 | 宅学部落 (zhaixue.cc)

如何编译安装Linux内核 - LightningStar - 博客园 (cnblogs.com)

ubuntu上更新和卸载Linux内核 - 广漠飘羽 - 博客园 (cnblogs.com)

关于Ubuntu内核(更新和卸载内核、取消自动更新) · Issue #1 · chiwent/blog (github.com)

自行编译内核,启动内核卡在“loading initial ramdisk”_启动卡在initrd_奇妙之二进制的博客-CSDN博客

linux——编译内核(ubuntu18.04+linux-5.6.4)

编译内核 make modules_install报错SSL error:02001002:system library:fopen:No such file or directory_ssl: error:02001002_酱山楂的博客-CSDN博客

中文翻译 — The Linux Kernel documentation Linux内核中文文档。

[arch/x86/boot/compressed/vmlinux.bin.lzma] Error 1_sustwct的博客-CSDN博客


🚍
🥙
🍥

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/700773.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Revit三维视图:第一人称的视角看模型,生成局部三维视图

​  一、Revit中怎么以第一人称的视角看空间效果 我们创建一栋完整的楼模型后&#xff0c;会不会想说假设在里面看看是什么效果呢&#xff0c;就是说想看看第一视角的空间效果&#xff0c;那么如何可以看第一人称的空间效果图呢?以下看步骤&#xff1a; 1、 打开楼层平面图 …

系统架构设计师 6:数据库设计

一、数据库系统 数据库系统&#xff08;DataBase System, DBS&#xff09;是一个采用了数据库技术&#xff0c;有组织地、动态地存储大量相关联数据&#xff0c;从而方便多用户访问的计算机系统。广义上讲&#xff0c;DBS包括了数据库管理系统&#xff08;DBMS&#xff09;。 …

详细认识二叉树【图片+代码】

目录 一、树的概念及结构 1.1树的概念 1.2树的相关概念 1.3树的表示 1.4树在实际中的应用&#xff08;目录树&#xff09; 二、二叉树概念及结构 2.1概念 2.2特殊的二叉树 2.3二叉树的性质 2.4二叉树存储结构 三、二叉树的顺序结构及实现 3.1二叉树的顺序结构 3…

Redis6之集群

集群&#xff0c;就是通过增加服务器的数量&#xff0c;提供相同的服务&#xff0c;从而让服务器达到一个稳定、高效的状态 必要性 单个redis存在不稳定性。当redis服务宕机了&#xff0c;就没有可用的服务了。而且单个redis的读写能力是有限的。使用redis集群可以强化redis的…

PIL.Image 调色板模式处理标签数据

文章目录 1 使用PIL.Image库进行调色板模式2 转回原来的色彩3 效果参考 1 使用PIL.Image库进行调色板模式 基本步骤&#xff1a; 自定义调色板&#xff0c;数据格式是一个Nx3的二维数组&#xff0c;一维数组的位置为分类的下标数据类型为np.uint8转化为调色板模式后img.conve…

想知道音频怎么转文字吗?

随着数字化技术的不断发展&#xff0c;我们生活中产生的各种音频越来越多&#xff0c;例如会议录音、采访录音等等。虽然音频记录信息方便&#xff0c;但它们在信息处理、存储和分享方面也存在问题。比如当我们需要对音频中的内容进行编辑或整理时&#xff0c;手动打字出现漏字…

Eclipse中项目的配置

1、修改本地运行时Tomcat对应的JRE版本 老项目升级JDK&#xff0c;在eclipse修改了项目的jdk、编译等级&#xff0c;但还是启动失败&#xff0c;报“java.lang.UnsupportedClassVersionError”。 观察发现&#xff0c;启动日志&#xff0c;tomcat还是使用的jdk1.5&#xff0c;…

编程题分享:有⼀堆糖果,其数量为n,现将糖果分成不同数量的堆数

背景 近期面试遇到一家公司的编程题&#xff0c;觉得挺有参考价值 此处使用 PHP语言&#xff0c;进行编码测试&#xff0c; 编码之前要进行思路分析&#xff0c;避免无头苍蝇&#xff0c;走一步看一步 最后&#xff0c;希望后期面试顺利&#xff01;欢迎指摘 . 题目&#xff1…

形态学操作之膨胀

note // 膨胀原理&#xff1a;操作过程中&#xff0c;若膨胀因子某点是1&#xff0c;且原图该点为1&#xff0c;则锚点位置为1 code // 膨胀 // 膨胀原理&#xff1a;操作过程中&#xff0c;若膨胀因子某点是1&#xff0c;且原图该点为1&#xff0c;则锚点位置为1 typedef e…

gma 2 教程(一)概述:1.GMA 简介

地理与气象分析库&#xff08;Geographic and Meteorological Analysis. gma&#xff09;&#xff0c;是一个基于 Python 的地理、气象数据快速处理分析和地理制图函数包。构建过程参考了ArcGIS和QGIS的操作逻辑和特点&#xff0c;并添加诸多独创性、独有的功能&#xff0c;具有…

QT Creator上位机学习(三)QString及其相关控件介绍

系列文章目录 文章目录 系列文章目录字符串QStringQLableQLineEditQString的常用功能 字符串QString QSting类&#xff0c;用于处理字符串&#xff0c;进行字符串和数字之间的转化 转换函数&#xff1a; //字符串转数字 QString str......; int numstr.toInt(); float num2s…

微信项目IO优化:Jetpack DataStore 与MMKV实现高效持久化

咱们一起来看看mmkv 腾讯微信团队于2018年9月底宣布开源 MMKV &#xff0c;原理上基于 mmap的一个高性能key-value 组件&#xff0c;数据的序列化/反序列化使用 protobuf 实现&#xff0c;主打高性能和稳定性&#xff0c;也支持了Android 平台。 **MMKV最新源码托管地址&#…

Mybatis【核心配置文件说明】

配置解析 1、核心配置文件 mybatis-config.xml 注意&#xff1a; 在配置 mybatis-config.xml 时&#xff0c;要注意标签的顺序&#xff1a; 2、环境变量&#xff08;environments&#xff09; MyBatis 可以配置成适应多种环境 不过要记住&#xff1a;尽管可以配置多个环境…

现代操作系统(下)

第六章 死锁 在计算机系统中有很多独占性的资源&#xff0c;在任一时刻它们都只能被一个进程使用。两个进程同时使用同一文件系统表中的表项会引起文件系统的瘫痪。正因为如此&#xff0c;操作系统都具有授权一个进程&#xff08;临时&#xff09;排他地访问某一种资源的能力。…

【AcWing】夏季每日一题2023 -- 4382. 快速打字 -- Java Version

题目链接&#xff1a;https://www.acwing.com/problem/content/4385/ 1. 题解&#xff08;4382. 快速打字&#xff09; y总视频讲解&#xff1a;https://www.acwing.com/video/4743/ 类似题目&#xff1a;AcWing 2816. 判断子序列 1.1 双指针&#xff1a;判断子序列 ⭐ 时间复…

一文吃透MAUI、WinUI3和WPF的优势及劣势

引言&#xff1a; 在应用程序开发领域&#xff0c;选择合适的框架对于开发人员和业务来说至关重要。本文将比较并对比三个流行的用户界面框架&#xff1a;MAUI&#xff08;Multi-platform App UI&#xff09;、WinUI 3和WPF&#xff08;Windows Presentation Foundation&#x…

element ui table表格(表头、表体)样式

效果图如下 1.表头样式&#xff1a;header-cell-stayle 2.表体样式 在methods中写 在style中

使用Qt/C++实现WGS84、高德GCJ-02、百度BD-09坐标系间相互转化

在做地图相关开发时候&#xff0c;绕不开不同坐标系间的转化&#xff0c;因此我根据查阅相关资料后将不同坐标系间的转换封装到一个GeoTranslate类中&#xff0c;该类转换函数不仅支持Qt/C调用&#xff0c;同时可在QML中直接调用&#xff0c;配合上QML/Map很方便&#xff0c;我…

大咖培训讲座|高性能计算专场 认识真正的高性能计算,探究如何成为高性能计算工程师 ...

猿代码科技高性能计算讲座原文——OpenBLAS创始人无保留分享 我们如何成为一个高性能计算的工程师&#xff0c;或者这种性能优化的这一部分的软件工程师。 我其实想了一下&#xff0c;这一部分的入门的基础其实没那么难。 就是更主要的话&#xff0c;我还是在于兴趣和自驱力…

idea自定义类注释以及方法注释,无警告

背景 idea&#xff1a;IntelliJ IDEA 2023.1.3 (Ultimate Edition) 效果 类 方法 正式&#xff1a;类 设置 代码 /** * author: 你的名字* date: ${DATE} on ${TIME}* desc: $NAME*/注意&#xff0c;请全部复制&#xff0c;空行也要&#xff0c;看设置截图选中部分 …