首页 > 系统相关 >ubuntu20.04内核重新编译(5.15.x)

ubuntu20.04内核重新编译(5.15.x)

时间:2024-08-28 16:04:22浏览次数:9  
标签:ubuntu20.04 SYSTEM source certs 内核 模块 5.15 CONFIG

一、源码获取

方法1:

git clone git://git.launchpad.net/~ubuntu-kernel/ubuntu/+source/linux/+git/focal

方法2:

# apt-cache search linux-source
linux-source - Linux kernel source with Ubuntu patches
linux-source-5.4.0 - Linux kernel source for version 5.4.0 with Ubuntu patches
linux-gkeop-source-5.4.0 - Linux kernel source for version 5.4.0 with Ubuntu patches
linux-hwe-5.11-source-5.11.0 - Linux kernel source for version 5.11.0 with Ubuntu patches
linux-hwe-5.13-source-5.13.0 - Linux kernel source for version 5.13.0 with Ubuntu patches
linux-hwe-5.15-source-5.15.0 - Linux kernel source for version 5.15.0 with Ubuntu patches
linux-hwe-5.8-source-5.8.0 - Linux kernel source for version 5.8.0 with Ubuntu patches
linux-intel-5.13-source-5.13.0 - Linux kernel source for version 5.13.0 with Ubuntu patches

选择linux-hwe-5.15-source-5.15.0下载:

apt-get source linux-hwe-5.15-source-5.15.0

如果执行上述命令报错的话,需要编辑 /etc/apt/sources.list ,去掉所有关于deb-src的注释,然后执行 apt-get update 更新下载源的列表,然后再执行 apt-get source linux-hwe-5.15-source-5.15.0 下载kernel源码。

二、源码编译

我们这里按照方法1获取源码,进入到源码目录,执行 git tag 查看各个历史发行版本, git checkout 到某个你想编译的版本,例如: git checkout Ubuntu-hwe-5.15-5.15.0-119.129_20.04.1 。

1.修改Makefile文件

根据 uname -r 的结果,比如我的内核版本是5.15.0-119-generic,那就按照如下方式修改Makefile,保证编译的内核和模块的vermagic版本和当前内核版本一致。

# SPDX-License-Identifier: GPL-2.0
VERSION = 5
PATCHLEVEL = 15
SUBLEVEL = 0
EXTRAVERSION = -119-generic
NAME = Trick or Treat

2. 准备config文件

内核源码编译所用的config文件可以从装有ubuntu系统的机器内部拷贝一份,我们这里从/boot/config-5.15.0-119-generic或者/usr/src/linux-headers-5.15.0-119-generic/.config拷贝。

cp /boot/config-5.15.0-119-generic .config

注意:需要把内核CONFIG_DEBUG_INFO配置关掉,不然会因为编译完安装内核时生成的initrd.img-5.15.0-119-generic太大而导致系统启动时报“out of memory”的错误导致系统起不来。加上debug信息生成的init ramfs大概有1GB左右,太TM大了。

 make menuconfig - - ->  Kernel hacking - - ->   Compile-time checks and compiler options  - - ->  [ ] Compile the kernel with debug info  

去掉 [ ] Compile the kernel with debug info  的同时会顺带去掉内核BTF信息的生成,BTF这个信息太坑了,即使在我编译出的模块的vermagic和module_layout值都和当前内核已加载模块的值相同时(查看模块module_layout值得方法:modprobe --dump-modversions xxx.ko | grep module_layout),仍然不能成功加载编译的模块,就是会报BTF(-22)相关的错误,除非我安装了我重新编译的内核,然后才能正常安装编译出的模块。

3. 编译前到底要不要执行make mrproper?

执行mrproper会删除源码目录下的debian目录、以及.config等文件,根据上一步骤中.config文件的签名相关配置:

#
# Certificates for signature checking
#
CONFIG_MODULE_SIG_KEY="certs/signing_key.pem"
CONFIG_MODULE_SIG_KEY_TYPE_RSA=y
# CONFIG_MODULE_SIG_KEY_TYPE_ECDSA is not set
CONFIG_SYSTEM_TRUSTED_KEYRING=y
CONFIG_SYSTEM_TRUSTED_KEYS="debian/canonical-certs.pem"
CONFIG_SYSTEM_EXTRA_CERTIFICATE=y
CONFIG_SYSTEM_EXTRA_CERTIFICATE_SIZE=4096
CONFIG_SECONDARY_TRUSTED_KEYRING=y
CONFIG_SYSTEM_BLACKLIST_KEYRING=y
CONFIG_SYSTEM_BLACKLIST_HASH_LIST=""
CONFIG_SYSTEM_REVOCATION_LIST=y
CONFIG_SYSTEM_REVOCATION_KEYS="debian/canonical-revoked-certs.pem"
# end of Certificates for signature checking

是需要debian目录下的canonical-certs.pem和canonical-revoked-certs.pem key的。

还有就是生成模块签名的时候,通过执行debian/scripts/sign-module来生成各个模块的签名,所以说需要生成模块签名的话,不能执行 make mrproper 。

不需要生成模块签名的话,就把上述.config里的CONFIG_MODULE_SIG_KEY、CONFIG_SYSTEM_TRUSTED_KEYS和CONFIG_SYSTEM_REVOCATION_KEYS全改为=””即可。

4. 编译前准备:执行make oldconfig

 make oldconfig 会根据源码结构和内容来验证源码目录下的.config是否需要修改,如果.config不需要修改的话,会显示No change。如果需要修改.config配置的话,根据提示进行相应的操作即可,这里我一般全都是输入‘N’然后回车,即不增加新的配置。

5. 编译内核和模块

编译之前先执行一下 chmod +x scripts/* 确保相关脚本都有可执行权限。

make -j8 LOCALVERSION='' all

编译的时候可能会异常结束,往上翻看编译的过程会发现提示没找到canonical-certs.pem和canonical-revoked-certs.pem。

在Linux内核配置中,CONFIG_SYSTEM_TRUSTED_KEYS和CONFIG_SYSTEM_REVOCATION_KEYS是与内核中的签名验证机制相关的配置选项。这些配置通常与Secure Boot和模块签名验证相关。下面详细解释这两个配置选项的作用:

CONFIG_SYSTEM_TRUSTED_KEYS

CONFIG_SYSTEM_TRUSTED_KEYS指定了一个包含受信任公钥的文件,这些公钥用于验证内核模块的签名。当启用模块签名功能(CONFIG_MODULE_SIG)时,内核将使用这些公钥来检查每个加载模块的签名,以确保它们未被篡改且来自可信来源。

例如,CONFIG_SYSTEM_TRUSTED_KEYS="debian/canonical-certs.pem"表示使用`debian/canonical-certs.pem`文件中的公钥作为信任的根证书来验证模块的签名。

CONFIG_SYSTEM_REVOCATION_KEYS

CONFIG_SYSTEM_REVOCATION_KEYS指定了一个包含已撤销公钥的文件。这些撤销的公钥不再被视为有效,任何使用这些公钥签名的模块都将被拒绝加载。这是一种安全机制,用来应对密钥泄露或者其他安全问题,确保不再信任使用这些密钥签名的模块。

例如,CONFIG_SYSTEM_REVOCATION_KEYS="debian/canonical-revoked-certs.pem" 表示内核将拒绝加载任何使用`debian/canonical-revoked-certs.pem`文件中列出的公钥签名的模块。

是否可以移除这些配置?

在编译内核时,如果你不需要使用Secure Boot或者模块签名验证功能,你可以选择不配置这些选项。这可以通过设置:

CONFIG_SYSTEM_TRUSTED_KEYS=""
CONFIG_SYSTEM_REVOCATION_KEYS=""

这样做将禁用这些功能,可能会简化系统配置,减少对特定密钥文件的依赖,特别是在不使用官方预构建内核,或者在一个完全信任的环境中不需要额外的安全验证时。

然而,如果安全性是一个重要考虑因素,特别是在多用户环境或者需要保护系统不被未授权的修改所影响的环境中,建议保留并正确配置这些选项。

如果我们想要保留CONFIG_SYSTEM_TRUSTED_KEYS和CONFIG_SYSTEM_REVOCATION_KEYS这俩配置,但是内核源码目录里并没有canonical-certs.pem和canonical-revoked-certs.pem的话,参考“源码获取-方法2”,把使用方法2下载的源码目录里的debian/canonical-certs.pem和debian/canonical-revoked-certs.pem拷贝到当前源码debian目录下即可。

6. 安装内核和模块

安装模块之前执行一遍 chmod +x debian/scripts/* 给debian/scripts/sign-module加上可执行权限,确保模块的签名能正常生成。

先安装模块:

make module_install

默认安装在/lib/modules/5.15.0-119-generic/目录下,如果想把编译好的模块安装到指定目录的话,执行 make INSTALL_MOD_PATH=/path/to/install modules_install 安装编译好的模块到/path/to/install目录下。

只有在执行 make module_install 的时候才会生成模块的签名信息,模块的签名信息和vermagic可以通过modinfo xxx.ko查看。

也可以手动生成单个模块的签名信息:

scripts/sign-file sha512 ./certs/signing_key.pem ./certs/signing_key.x509 module.ko

 

再安装内核:

make install

然后重启机器, uname -a 查看当前内核的版本和生成时间是否正确。

如果编译安装的内核版本和之前的版本不一致的话,重启机器使用的可能不是最新编译的内核,需要修改/etc/default/grub中的 GRUB_DEFAULT= 为你想加载的内核版本,我们这里 grep menuentry /boot/grub/grub.cfg 查看第一条menuentry是否是我们想要加载的内核,不是的话修改 'GRUB_DEFAULT=Ubuntu, with Linux 5.15.0-119-generic', 并执行update-grub然后重启即可。

7. 结尾

!!!保存好 'certs/signing_key.pem','certs/signing_key.x509','debian/canonical-certs.pem' 和 'debian/canonical-revoked-certs.pem'这四个密钥,别人如果想编译这个版本的内核模块的时候需要用到,不然的话,由于签名验证不通过,别人编译好的模块加载时会报“module verification failed: signature and/or required key missing - tainting kernel”的warning。

标签:ubuntu20.04,SYSTEM,source,certs,内核,模块,5.15,CONFIG
From: https://www.cnblogs.com/wanglouxiaozi/p/18384959

相关文章

  • 树莓派CM4(四):树莓派镜像替换内核
    树莓派镜像替换内核1.为什么要替换内核树莓派官方提供的镜像中,自带的内核版本为6.6.31然而github上提供的内核源码为6.6.40,有些微差别此外,后续很有可能进行内核裁剪定制,替换内核是一个无法绕开的工作2.获取内核源码github地址:https://github.com/raspberrypi......
  • 【JUC并发编程系列】深入理解Java并发机制:从用户态到内核态的探索(一、前置知识)
    文章目录【JUC并发编程系列】深入理解Java并发机制:从用户态到内核态的探索(一、前置知识)1.用户态与内核态区别2.线程安全同步的方式3.传统锁有哪些缺点4.发生CPU上下文切换的原因5.如何避免上下文切换6.详细总结6.1用户态与内核态6.2线程安全同步方式6.3传统锁的......
  • 如何使用Kdrill检测Windows内核中潜在的rootkit
    关于KdrillKdrill是一款用于分析Windows64b系统内核空间安全的工具,该工具基于纯Python3开发,旨在帮助广大研究人员评估Windows内核是否受到了rootkit攻击。需要注意的是,该项目与Python2/3兼容,无其他依赖组件,无需Microsoft符号或网络连接即可执行安全检查。KDrill还......
  • Ubuntu20.04安装ROS,一次成功,详细简洁
     仔细看文档系统要求:Ubuntu20.04ROS安装版本:Noetic首先,最重要的就是ROS软件源,很多小伙伴都是在网上随便复制的软件源和密钥,非常不建议,复制三方的软件源,因为如果出新的,可能旧的官方维护就少了,ROS就容易崩。我是使用中科大的ROS软件源接下来教大家怎么做进这个网址https:/......
  • x86 ubuntu20.04 ros:noetic-perception-focal 镜像测试
    https://hub.docker.com/_/ros/tags?page=&page_size=&ordering=&name=noetic1.启动容器:dockerpullros:noetic-perception-focaldockerrun-it--envDISPLAY=$DISPLAY--volume/tmp/.X11-unix:/tmp/.X11-unix--privileged--gpusall--volume/home/h/doc......
  • Linux内核——内核源码的探索+教你如何系统认识Linux内核源码树(推荐方式+推荐工具+推
    Linux全称GNU/Linux,是一种免费使用和自由传播的类UNIX操作系统,该操作系统是由LinusTorvalds于1991年10月5号首次发布,它主要受到Minix和Unix思想的启发,是一个基于POSIX的多用户、多任务、支持多线程和多CPU的操作系统。严格地讲,Linux单指操作系统的内核,加上用户空间的应用程......
  • Linux 内核源码分析---NIC 数据包接收与发送
    网络接口控制器(networkinterfacecontroller,NIC),又称网络接口控制器,网络适配器(networkadapter),网卡(networkinterfacecard),或局域网接收器(LANadapter),是一块被设计用来允许计算机在计算机网络上进行通信的计算机硬件。由于其拥有MAC地址,因此属于OSI模型的第2层。它使......
  • 【0316】Postgres内核之VACUUM (FULL)运行 portal multi query (11)
    上一篇文章:【0315】Postgres内核之VACUUM(FULL)运行portalquery(10)1.执行portalmultiquery在【0315】Postgres内核之VACUUM(FULL)运行portalquery(10)一文中讲解了Postgres内核运行portal查询的实现。之后通过判断portal->strategy的值(PORTAL_MULTI_QUERY)走到了Po......
  • windows核心编程 内核对象,创建进程(CreateProcess),管道(CreatePipe)
    windows核心编程内核对象,创建进程(CreateProcess),管道(CreatePipe)windows核心编程内核对象,创建进程(CreateProcess),管道(CreatePipe)文章目录windows核心编程内核对象,创建进程(CreateProcess),管道(CreatePipe)主进程创建子进程并运行Ping命令主进程创建子进程并运行Ping......
  • 常见核内核外并行机制
    广义来说并行分为俩种,提高单元效率是时域并行,一般是通过提高utilization,而增加单元数量则是空域并行。现代处理器中往往各种并行机制混合存在,本文旨对不同的并行机制分析归类。大部分并行机制都是针对俩个问题:1)解耦单元之间的依赖关系提高并行度[1],以及2)访存问题,后续并行机制大......