编译、安装、调试Linux内核

news2024/11/19 2:39:28

这里写目录标题

  • 编译安装内核
    • 下载内核
    • 安装依赖
    • 更改.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/699800.html

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

相关文章

Redux的讲解与教程

我们在学习和使用React做项目的时候&#xff0c;肯定离不开Redux的使用。那么 “Redux” 是什么呢&#xff1f;。它有什么作用&#xff1f;它帮助我解决什么问题&#xff1f;我为什么要使用它&#xff1f;搞懂这些能让我们更好的理解和使用Redux。 Redux 是什么&#xff1f; R…

setjmp和longjmp

使用这两个函数时&#xff0c;一定要牢记&#xff0c; longjmp函数是有去无回的&#xff0c;后面还有两个错误的使用示例。 #include <setjmp.h> int setjmp(jmp_buf env); void longjmp(jmp_buf env, int val); 基础例子&#xff1a; #include <setjmp.h> #inc…

XHbuilder 需要的 ipa 签名,超详细的教程,你不看吃亏的是自己!

今天使用 hbuilder 运行到 ios 真机的时候&#xff0c;突然发现还需要 ipa 签名&#xff0c;这是什么东东呢&#xff1f; 1、IPA 签名是什么&#xff1f; 因苹果公司禁止企业证书用于非企业内部开发者。所以开发者无法再使用DCloud的企业证书签名的标准运行基座。 运行标准基…

预约直播 | 展心展力MetaApp:基于DeepRec的稀疏模型训练实践

MetaApp-推荐广告研发部&#xff0c;主要负责 MetaApp 拳头产品 233 乐园的首页信息流的推荐和广告系统&#xff0c;是比较传统的推广搜组。本次议题介绍了 MetaApp-推荐广告研发部 从传统的TensorFlow&#xff08;cpu&#xff09;自研分布式ps方案&#xff0c;逐步迁移到使用…

智能安全配电装置伙房食堂中的应用

【摘要】伙房食堂是高频用火用电场所&#xff0c;用火用电设备集中&#xff0c;同时人流量密集&#xff0c;如果没有做好预防工作&#xff0c;则容易引发火灾&#xff0c;造成人员伤亡。智能安全配电装置作为一种安全配电产品&#xff0c;可以有效预防电气事故的发生&#xff0…

HttpRunner_参数化进阶

目录 一.获取返回包数据 二.调用其他接口返回值 三.yml文件 四.设置全局变量并引用 五.调用函数 六.参数化驱动(最简单的方式) 七.参数化驱动(复杂的方式)   八.使用指定的报告模板指定报告生成路径 九.保存测试过程数据 十.单独使用HttpRunner 一.获取返回包数据 …

QCN6274 QCN9274 What is the difference?|WIFI7 Solution|Wallys

QCN6274 QCN9274 What is the difference?|WIFI7 Solution|Wallys Q:QCN6274 QCN9274 What is the difference? A:The QCN6274 is a Qualcomm WiFi 7 chip, and Wallys is currently in the process of developing a WiFi module integrated with the QCN9274 chip. Its imp…

Pytorch实现多GPU并行训练(DDP)

Pytorch实现并行训练通常有两个接口&#xff1a;DP&#xff08;DataParallel&#xff09;和DDP&#xff08;DistributedDataParallel&#xff09;。目前DP&#xff08;DataParallel&#xff09;已经被Pytorch官方deprecate掉了&#xff0c;原因有二&#xff1a;1&#xff0c;DP…

浅聊Android性能优化~

作者&#xff1a;一只修仙的猿 前言 关于性能优化&#xff0c;可能我们的第一反应是这是高手做的事情&#xff0c;一直以来我也是这样认为的。但在最近一段时间&#xff0c;在公司项目上做了一些框架的性能优化&#xff0c;让我初步掀开了性能优化的面纱&#xff0c;也对他有了…

VirtualBox 部署 KVM 虚拟化

什么是KVM技术&#xff1f; KVM&#xff08;Kernel-based Virtual Machine&#xff09;是一种开源的虚拟化技术&#xff0c;它是Linux内核的一部分。KVM通过将Linux内核转换为Hypervisor&#xff0c;允许在同一物理主机上运行多个虚拟机实例&#xff0c;每个实例可以独享一部分…

JAVA学习之String学习

1.底层是用什么实现的&#xff1f; JDK8用的char数组&#xff0c;JDK9开始使用byte数组,而且都是final型&#xff0c;所以不同字符串&#xff08;值&#xff09;的地址必然不同。 char和byte的区别&#xff1a;char是2个字节表示&#xff0c;而byte是一个字节。 JDK17中&…

Vue3解决:[Vue warn]: Failed to resolve component: el-table(或el-button) 的三种解决方案

1、问题描述&#xff1a; 其一、报错为&#xff1a; [Vue warn]: Failed to resolve component: el-table If this is a native custom element, make sure to exclude it from component resolution via compilerOptions.isCustomElement. at <App> 或者&#xff1a; …

网络安全(黑客)自学

建议一&#xff1a;黑客七个等级 黑客&#xff0c;对很多人来说充满诱惑力。很多人可以发现这门领域如同任何一门领域&#xff0c;越深入越敬畏&#xff0c;知识如海洋&#xff0c;黑客也存在一些等级&#xff0c;参考知道创宇 CEO ic&#xff08;世界顶级黑客团队 0x557 成员&…

kubectl-ai:K8S资源清单的GPT助手

琦彦&#xff0c;在 **云原生百宝箱 **公众号等你&#xff0c;与你一起探讨应用迁移&#xff0c;GitOps&#xff0c;二次开发&#xff0c;解决方案&#xff0c;CNCF生态&#xff0c;及生活况味。 kubectl-ai 项目是一个kubectl使用 OpenAI GPT 生成和应用 Kubernetes 清单的插件…

【APP自动化测试必知必会】Appium之微信小程序自动化测试

本节大纲 H5 与小程序介绍 混合 App 元素定位环境部署 混合 App 元素操作 Airtest 测试 App 01.H5与小程序介绍 H5概述 H5 是指第 5 代 HTML &#xff0c;也指用 H5 语言制作的一切数字产品。 所谓 HTML 是“超文本标记语言”的英文缩写。我们上网所看到网页&#xf…

Oculus创始人谈Vision Pro:苹果在硬件设计、营销都做对了选择

早在Vision Pro正式发布之前&#xff0c;Oculus创始人Palmer Luckey就已经体验过早期版本&#xff0c;并给出了极高的评价。Luckey指出&#xff0c;苹果在XR头显上的策略是明智的&#xff0c;先打造出每个人预期中的头显&#xff0c;然后再去考虑如何让大家买得起。 Vision Pro…

远程控制电脑软件VNC安装使用教程:Windows系统

什么是VNC&#xff1f; VNC (Virtual Network Console)&#xff0c;即虚拟网络控制台&#xff0c;它是一款基于 UNIX 和 Linux 操作系统的优秀远程控制工具软件&#xff0c;由著名的 AT&T 的欧洲研究实验室开发&#xff0c;远程控制能力强大&#xff0c;高效实用&#xff…

【python】python编程基础

基础工具包 python 原生数据结构元组 Tuple列表 list集合 set字典 dictionary NumPy 数据结构数组 Ndarray矩阵 Matrix Pandas 数据结构序列 Series &#xff08;一维&#xff09;数据框 DataFrame &#xff08;二维&#xff09; Matplotlib 数据可视化绘制饼图绘制折线图绘制直…

《Linux操作系统编程》 第六章 Linux中的进程监控: fork函数的使用,以及父子进程间的关系,掌握exec系列函数

&#x1f337;&#x1f341; 博主 libin9iOak带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——libin9iOak的博客&#x1f390; &#x1f433; 《面试题大全》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33…

一文读懂高分文章必备分析-GSEA

Gene Set Enrichment Analysis 或称 GSEA&#xff0c;是一种常用于转录组基因表达分析的数据挖掘技术&#xff0c;已经在《nature》、《Cell》、《ISME》、《Molecular Cell》、《Bioactive Materials》等高分杂志中发表多篇文章&#xff0c;涉及转录组及多组学内容。 凌恩生物…