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

article/2025/10/25 3:51:57

这里写目录标题

  • 编译安装内核
    • 下载内核
    • 安装依赖
    • 更改.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 menuconfigmake -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=10GRUB_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 debuggingCompile-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://chatgpt.dhexx.cn/article/1AeGdiKi.shtml

相关文章

linux内核编译及添加系统调用(详细版)

linux内核编译及添加系统调用 注&#xff1a;文章共四部分&#xff0c;分别是 1、编译更换内核 2、添加一个简单系统系统调用 3、添加读取/修改nice值的系统调用 4、自己设计简单&#xff08;真的简单&#xff09;系统调用 注&#xff1a;四个部分结构相似&#xff0c;请…

打造自己的专属linux(四):Linux内核编译过程简介

linux在前不久刚发布了最新的3.0内核&#xff0c;在linux的学习中&#xff0c;了解内核的编译是一个必不可少的功课。前几天&#xff0c;学习了linux内核的编译流程&#xff0c;在此总结下&#xff0c;大家来一起学习。 以最新的3.0内核为例&#xff0c;我下载的是linux3.0.1 …

Linux内核开发_1_编译LInux内核

目录 1. 准备工作 1.1 学习环境 1.2 下载Linux内核源码 1.3 解压Linux内核 1.4 目录结构介绍 2. Linux内核配置 2.1 配置选项 1. make config 2. make menuconfig 3. make gconfig 3 开始配置 1. 配置解释 General setup 通用选项 Enable loadable module support…

ubuntu上编译Linux内核步骤

一、虚拟机的准备 1.下载Ubuntu镜像 Enterprise Open Source and Linux | Ubuntu 在最左边Ubuntu Desktop处点22.04LTS下载iso文件 2.在VMware上创建新的虚拟机 Ubuntu 20.04 虚拟机安装教程_柯基的博客-CSDN博客_虚拟机安装ubuntu20.04 特别注意: 在"指定磁盘容量&…

Microsoft Outlook 2019 for mac(电子邮件和日历工具) v16.45Beta中文激活版

Microsoft Outlook 2019 for Mac版是一款非常好用的电子邮件和日历工具&#xff0c;Outlook是office办公软件套装的组件之一&#xff0c;可以帮助您收发电子邮件、管理联系人信息、记日记、安排日程与分配任务&#xff0c;文件视图&#xff0c;保持连接并提升生产效率等.

取消Outlook脱机工作

在运维过程中&#xff0c;有时候会收到用户这样的抱怨&#xff1a;为什么别人发给我的邮件我都收不到&#xff0c;我的邮件也发不出去了&#xff1f; 这种情况有时候是因为Outlook正在脱机工作&#xff0c;在Outlook右下角可以看到这样的信息&#xff1b; 针对这种情况&#x…

Outlook 365 添加企业Exchange邮箱(亲测)

关注公众号及时获取文章更新 前言&#xff1a;Outlook 是微软免费的电子邮件和日历管理工具&#xff0c;在日常工作中&#xff0c;经常需要以邮件的形式来传递信息和文件&#xff0c;是一种必不可少的沟通方式。 问题&#xff1a;在使用Outlook 365 直接配置企业Exchange邮箱时…

安装Windows Outlook邮箱客户端

本文以安装Outlook2010为例。下载iso文件 ed2k://|file|SW_DVD5_Office_Professional_Plus_2010w_SP1_64Bit_ChnSimp_CORE_MLF_X17-76742.iso|1612515328|032320121E0EE36D8F0C32EC89CA0AB9|/ 打开下载好的iso文件点击“steup”进入安装界面。 然后在新的界面里勾上“我接受此…

WIN10设置OUTLOOK开机自启

转载&#xff1a;https://www.cnblogs.com/catherinehu/p/14266890.html 由于开机总是忘记打卡outlook&#xff08;主要是懒&#xff09; 于是想搞个自启动&#xff0c;应该也是很简单 结果在网上搜索了很多 并在多次尝试了之后 并没有成功...... 网上能搜索到的最多的办…

outlook添加账号后,版本更新,无法连接的问题

outlook添加账号后&#xff0c;版本更新&#xff0c;无法连接的问题 必须的版本&#xff1a;16.0.4600.1000 网上关于这个问题的回复 我发现回复的答案中的链接中没有合适更新包 我找到的可以用的下载连接

1、登录——邮件发送激活链接

我们在这里输入账号、密码、邮箱后&#xff0c;后端的service层会判断账号、邮箱是否已被注册。如果没有&#xff0c;则会向邮箱中发送激活链接 在我们点击注册按钮之后&#xff0c;在service层中存入数据库&#xff0c;然后通过数据库中用户的id&#xff0c;来生成激活链接&…

Windows10-Outlook使用教程

介绍 Microsoft Office Outlook是微软办公软件套装的组件之一&#xff0c;它对Windows自带的Outlook express的功能进行了扩充。Outlook的功能很多&#xff0c;可以用它来收发电子邮件、管理联系人信息、记日记、安排日程、分配任务。最新版为Outlook 2020。 我公司自己搭建…

office(word、powerpoint、excel、outlook、onenote、publisher、access)下载安装(由于卡顿打不开重装,已激活)

一、打开以下网址 https://account.microsoft.com/services/ 二、登录账户 在已购买的产品&#xff08;买电脑时送的&#xff09;中选择安装下载 三、office下载安装 下载&#xff08;以下为使用IDM下载&#xff0c;正常情况下直接下载&#xff09; 下载后&#xff0c;双击…

win10 outlook邮件设置

首先在控制面板下–>用户账户–>选择outlook 邮箱设置 邮件设置选择配置文件 选择添加新配置文件 输入邮箱账户密码配置 点击下一步再次输出密码便可生成配置文件 可返回常规设置选择配置文件作为默认系统邮箱 再次打开outlook会显示所配置的邮箱以及所收到的邮件 注释&a…

Outlook2019版本的收发邮件设定

Outlook2019版本的收发邮件设定 邮件设置&#xff1a;1.进入Outlook2019界面&#xff0c;选择规则&#xff0c;选择管理规则及通知。选择新增规则。2.检查条件不用选择&#xff0c;直接按下一步。3.处理邮件方式勾选 “移动到特定资料夹”&#xff0c;该资料夹请选择你本机个人…

outlook插件

详细规划工作安排&#xff0c;会议提前规定 文章目录 outlook下载安装登录使用说明关于outlook日历的使用 outlook outlook插件是一款适应于腾讯会议软件使用的工具栏插件&#xff0c;该插件可以提前发起或预定一场会议&#xff0c;并且能在插件日历中显示&#xff0c;同时日历…

Outlook无法更新,提示键入Exchange密码并连接

问题表现1&#xff1a; ​ 问题表现2&#xff1a; 当尝试删除该账号&#xff0c;重新添加到outlook时&#xff0c;无法添加成功&#xff0c;提示错误代码&#xff1a;CAA20002&#xff0c;如下图&#xff1a; 解决办法&#xff1a; 如是win10或win11&#xff0c;则从系统开始…

outlook客户端 outlook.com邮箱设置方法

登录网页版的outlook.com电子邮箱&#xff0c;找到设置项进行配置&#xff0c;里面有配置POP服务器及端口信息&#xff0c;如下图&#xff1a; outlook客户端配置&#xff0c;如下图&#xff1a; 出上以上测试状态&#xff0c;表示配置成功&#xff0c;点击下一步&#xff0c;完…

Outlook邮箱注册教程 不信你看完还不懂

Outlook作为Microsoft Office家族的办公软件套装之一&#xff0c;关联着很多微软的其他产品。而且Outlook是欧美地区认可度比较高的&#xff0c;不仅可以用于一些境外联络还可以拿来注册Instagram、Twitter、Facebook等各种社交媒体平台。龙哥在这里就给大家出一份详细的Outloo…