Linux内核编译(Ubuntu)

实验内容:在系统中下载统一发行版本的版本号较高的内核,编译之后运行自己编译的内核,并使用uname-r命令查看是否运行成功。

实验步骤:

1.查看实验环境和内核版本

图1 实验环境

VMware中虚拟机Ubuntu(24.04)、内存8G、CPU(8核)、磁盘128G(下载Ubuntu虚拟机的时候一定要注意分配足够的磁盘空间,建议100G)。

2 查看内核版本

初始内核版本是6.11.0。

为了提升下载速度,换源:

我打算换清华源,从清华大学开源软件镜像站得知:从 Ubuntu 24.04 开始,Ubuntu 的软件源配置文件变更为 DEB822 格式,路径为 /etc/apt/sources.list.d/ubuntu.sources

换源思路:将系统自带的对应文件做个备份,然后根据格式的选择做网页中(ubuntu | 镜像站使用帮助 | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror)对应的内容替换,即可使用选择的软件源镜像。

3 查看Ubuntu版本

执行了lsb_release -a 命令,获取到系统信息:这是 Ubuntu 24.04.2 LTS 版本 ,代号为noble 。接下来换清华源,步骤如下:

备份源文件:

4 备份源文件

执行sudo cp /etc/apt/sources.list.d/ubuntu.sources备份当前软件源配置文件。这样就能正确找到源文件并将其备份到用户主目录下,文件名是ubuntu.sources.bak 。

5 Ubuntu上没有安装vim

图5告诉我们Ubuntu上还没有vim,并且提供了安装不同版本vim的命令。

Vim是从vi发展出来的一个文本编辑器,最初的简称是Vi IMitation,随着功能的不断增加,正式名称改成了Vi IMproved。

下载vim:

6 更新apt

在终端执行sudo apt update,因为软件包列表可能不是最新的,会导致找不到对应软件包。

7 安装vim-gtk3

在Ubuntu软件包搜索中,与vim-gtk匹配的软件包是vim-gtk3,在终端执行 sudo apt-get install vim-gtk3 -y。什么是gtk3?因为这是vim安装的图形化界面。

Vim还需要进行配置,这不是本实验的内容,参考博客:基于 Ubuntu 系统的 Vim 全面配置(持续更新)_ubuntu vim-CSDN博客。(已配置vim到自动补全符号)。之后安装了VMware Tools。

前面已完成了备份,接下来要换清华源:

获取清华源配置:

访问清华大学开源软件镜像站(https://mirrors.tuna.tsinghua.edu.cn/ ),找到 Ubuntu 镜像使用帮助,获取适用于 Ubuntu 24.04(代号noble )的清华源配置内容 。

8 原有内容

在终端执行sudo vim /etc/apt/sources.list.d/ubuntu.sources ,删除原有内容,粘贴清华源配置(在上文给出的链接里面就有清华源配置内容)后按ESC退出插入模式,进入正常模式,输入:wq按回车键保存退出。

执行sudo apt update ,更新软件包索引,之后即可基于清华源进行软件安装、升级等操作 。

进入Linux 内核的官网,下载最新版本,或者其它版本的内核代码。在Linux系统中,只需要在命令行输入如下命令就可以下载Linux内核压缩包了。

2.下载内核

9 执行“wget 下载链接

3.解压

下载后在终端输入sudo tar-xvflinux-6.13.1.tar.xz解压缩。

10 解压完成

之后要将解压的文件移动到/usr/src路径下。

11 将解压缩文件移动到/usr/src

也可以直接执行tar xf linux-6.13.1.tar.xz -C /usr/src,这样完成了解压并且放置到/usr/src路径下。

4.安装编译工具和依赖的软件包

接下来安装编译工具以及其它依赖的软件包,执行sudo apt-get install build-essential libncurces-dev bison flex libssl-dev zstd、sudo apt-get install libelf-dev。

a

(b)

12安装编译工具以及依赖的软件包

按下Y接着执行即可。

5.配置内核

     在编译内核之前,对内核源代码进行配置。配置的目的主要是确定哪些模块会编译到内核当中。执行sudo make menuconfig进行配置。

13 进入配置界面

对每个配置选项可通过点击<Select>来选择:

<*>或[*]:将该功能编译进内核;

[]:不将该功能编译进内核;

[M]:将该功能编译成可以在需要时动态

插入内核的模块。

14 进行配置

     如图所示,将Compile also drivers which will not load和Compile the kernel with warnings as errors设置成将该功能编译进内核。进行保存后退出。(也可以不配置这两项内容,保持默认配置,Save--->ok--->Exit--->Exit)。

必做配置:

进入kernel hacking,然后修改warn for stack frames larger than 的数值,将其修改为4096(最好不要大过这个数值)。这一步骤的图在下文图21。

15 查看.config文件属性

在 Linux 系统中使用ll(等同于 ls -l )命令查看.config文件属性的结果。

接下来要对.config文件进行配置:

执行sudo vim .config打开当前目录下的 .config 文件,配置如下两项内容。

CONFIG_SYSTEM_TRUSTED_KEYS=””

CONFIG_SYSTEM_REVOCATION_KEYS=””

16 vim 中打开 .config 文件

17 配置.config文件前

如图17所示,在 vim 命令模式下(进入 vim 后默认是命令模式,如果不是,按 Esc 键进入 ),输入 /CONFIG_SYSTEM_TRUSTED_KEYS ,然后按回车键。vim 会自动定位到首次出现该配置项的位置 。如果位置不对,可按 n 键查找下一个匹配项。找到之后,按i键进入插入模式,删除双引号内的内容(如果有 ),使其变为 CONFIG_SYSTEM_TRUSTED_KEYS="" 。同理,找到 CONFIG_SYSTEM_REVOCATION_KEYS 所在行,按i键进入插入模式,删除双引号内的内容(如果有 ),设置为 CONFIG_SYSTEM_REVOCATION_KEYS="" 。

按 Esc 键回到命令模式,然后输入 :wq 并回车,保存修改并退出 vim 。

6.编译内核

前情提要:因为没安装libelf-dev以及配置内核(warn for stack frames larger than 的数值)发生了报错(上文已经告诉读者进行了操作,如果前面操作过了应该不会出现报错),如果在前面没有安装libelf-dev以及配置内核,为了避免报错,请在编译内核前请执行sudo apt-get install libelf-dev、执行sudo make menuconfig进行配置(具体操作界面见图21)。

利用make命令开始编译内核。使用 -j 选项来多线程处理,可以更有效的利用CPU资源。参数是并发数量,通常可以是CPU的2倍。如图18所示,使用sudo make -j$(nproc)。sudo make -j$(nproc) 是在 Linux 系统中用于并行编译内核或其他软件项目的命令。

18 编译内核

 a

(b)

(c)

(d)

e

19 编译内核过程中出现错误

从报错信息 “fatal error: libelf.h: 没有那个文件或目录” 和 “fatal error: gelf.h: 没有那个文件或目录” 可知,是缺少相关开发库文件导致编译失败 。libelf 库用于处理 ELF(可执行与可链接格式)文件,编译内核时部分工具和模块依赖它。

可通过以下命令安装 libelf 开发库来解决:sudo apt-get install libelf-dev。安装完成后,重新执行 sudo make -j$(nproc) 命令继续编译内核 。

20 再次报错

    在编译内核模块驱动时,如果出现如上报错信息,主要是因为内核中设置了堆栈报警大小,其默认为1024bytes。将其修改为4096既可以消除告警信息。

解决方法:

(1)make menuconfig

(2)kernel hacking

(3)修改warn for stack frames larger than 的数值,将其修改为4096(最好不要大过这个数值)

(4)重新编译内核模块则不会出现如上的告警信息。

21 解决报错

22 编译成功

7.编译和安装模块

接下来是编译和安装模块。执行make modules_install。

23 执行make modules_install之后

8.安装内核

注意,该步骤出现了警告,图25下方给出了解决办法,请先阅读完这部分再进行操作。

将编译好的内核文件复制到/boot目录下,并更新GRUB配置:

24 出现警告

出现的 Warning: os-prober will not be executed... 警告,是因为 GRUB_DISABLE_OS_PROBER 可能被设置,导致 os-prober 工具不被执行,无法检测其他可引导分区并添加到 GRUB 配置中。

25 解决警告

解决警告的过程:使用文本编辑器vim,打开/etc/default/grub文件,命令为sudo vim /etc/default/grub。在文件中找到GRUB_DISABLE_OS_PROBER这一行。如果该行被注释(行首有#),去掉注释符号#,并确保其值为false。保存并关闭/etc/default/grub文件后,在终端执行sudo update-grub命令。该命令会重新生成 GRUB 配置文件,应用刚才的修改。执行后,os-prober工具将被允许执行,扫描其他可引导分区并添加到 GRUB 配置中,相应警告也会消失。

26 重新生成grub文件

此时警告提示变为os-prober will be executed...,说明配置修改生效,os-prober工具已能正常执行去检测其他可引导分区,这是预期的正确状态。可查看/boot/grub/grub.cfg文件(使用sudo cat /boot/grub/grub.cfg查看内容),确认新内核及其他相关启动项是否正确添加。

接下来要对/etc/default/grub文件进行配置。

27 打开/etc/default/grub文件

28 进行配置前

29 进行配置后

30 更新grub

实验结果

执行reboot重启系统。

31 重启系统界面

32 检查新内核

执行uname -r查看内核版本。结果是6.13.1,说明成功。

关于报错的总结

①编译内核时出现 “fatal error: libelf.h: 没有那个文件或目录” 和 “fatal error: gelf.h: 没有那个文件或目录” 的错误,这是因为缺少相关开发库文件。通过执行sudo apt-get install libelf-dev命令安装libelf开发库,解决了该问题,使编译能够继续进行。

②在编译内核模块驱动时,出现 “the frame size of 1152 bytes is larger than 1024 bytes” 的错误。这是由于内核中设置的堆栈报警大小默认为 1024bytes。通过make menuconfig进入内核配置界面,找到 “Kernel hacking” -> “Compile - time checks and compiler options”,将 “Warn for stack frames larger than” 的数值修改为 4096,重新编译内核模块后,消除了警告信息。

③安装内核时出现 “Warning: os - prober will not be executed...” 的警告,这是因为GRUB_DISABLE_OS_PROBER可能被设置,导致os - prober工具不被执行,无法检测其他可引导分区并添加到 GRUB 配置中。使用sudo vim /etc/default/grub打开文件,找到GRUB_DISABLE_OS_PROBER这一行,去掉注释符号#并确保其值为false,保存并关闭文件后执行sudo update - grub命令,重新生成 GRUB 配置文件,解决了该警告问题。

如果对你有帮助的话,请为我点个赞吧❤

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

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

相关文章

EdgeGPT - 新版Bing聊天功能逆向工程

本文翻译整理自&#xff1a;https://github.com/acheong08/EdgeGPT 文章目录 一、关于 EdgeGPT相关链接资源关键功能特性 二、安装系统要求安装命令 三、认证配置获取Cookie步骤代码中使用Cookie 四、使用方法1、命令行方式2、Python API方式使用Chatbot类使用Query辅助类 3、…

三网通电玩城平台系统结构与源码工程详解(四):子游戏集成与服务器调度机制全解

本篇将深入讲解三网通电玩城平台中子游戏接入、前后端资源组织方式、服务器调度逻辑、并发接入方案等核心内容&#xff0c;重点覆盖“李逵劈鱼”、“水果玛丽”、“疯狂玛丽”等热门组件&#xff0c;辅以完整代码框架与部署逻辑。 一、子游戏资源目录结构与加载机制 平台采用标…

1.1 AI大模型与Agent的兴起及其对企业数字化转型的推动作用

随着人工智能技术的飞速发展&#xff0c;AI大模型和智能代理&#xff08;Agent&#xff09;的兴起正成为推动企业数字化转型的重要力量。从2017年GPT-1的首次亮相到2025年GPT-4和Qwen 2.5等多模态模型的成熟&#xff0c;AI大模型经历了显著的技术演进&#xff1b;与此同时&…

位运算练习:起床困难综合征(贪心,位运算)(算法竞赛进阶指南学习笔记)

目录 前情提要起床困难综合征&#xff08;贪心&#xff0c;位运算&#xff09; 前情提要 一些基础运算操作用法看看上一篇&#xff1b; 起床困难综合征&#xff08;贪心&#xff0c;位运算&#xff09; 题目原文 [P2114 NOI2014] 起床困难综合症 - 洛谷 思路分析 题目很长…

PowerBi中REMOVEFILTERS怎么使用?

在 Power BI 的 DAX 中&#xff0c;REMOVEFILTERS() 是一个非常重要的函数&#xff0c;常用于取消某个字段或表的筛选上下文&#xff08;Filter Context&#xff09;&#xff0c;从而让你的计算不受切片器&#xff08;Slicer&#xff09;、筛选器或视觉对象的限制。 ✅ 一、REM…

Vue3 实战:打造多功能旅游攻略选项卡页面

在旅游类应用开发中&#xff0c;为用户提供全面、直观的信息展示界面至关重要。本文将分享如何基于 Vue3 Axios 技术栈&#xff0c;实现一个包含攻略、游记、问答三大板块的旅游攻略选项卡页面&#xff0c;从样式设计到交互逻辑&#xff0c;带你深入了解整个开发过程。 项目背…

JavaScript性能优化实战(1):性能优化基础与性能分析工具

性能优化的重要性与业务价值 在当今竞争激烈的互联网环境中,网站和应用的性能已成为用户体验和业务成功的关键因素。研究表明,页面加载时间每增加1秒,转化率可能下降7%,而53%的用户会在页面加载时间超过3秒后放弃访问。这些数据直接揭示了性能优化对业务的巨大影响: 用户…

Unity 脚本使用(二)——UnityEngine.AI——NavMesh

描述 Singleton class 用于访问被烘培好的 NavMesh. 使用NavMesh类可以执行空间查询&#xff08;spatial queries&#xff09;&#xff0c;例如路径查找和可步行性测试。此类还允许您设置特定区域类型的寻路成本&#xff0c;并调整寻路和避免的全局行为。 静态属性&#xff0…

Java 静态内部类面试题与高质量答案合集

本文整理了关于 Java 静态内部类&#xff08;Static Nested Class&#xff09;在面试中的高频问题及标准答案&#xff0c;帮助你理解其底层原理、内存表现以及实际应用。 1. 什么是静态内部类&#xff1f;和普通内部类有什么区别&#xff1f; 答&#xff1a; 静态内部类是定义…

为什么买不到一定阻抗特性曲线的磁环

为什么买不到一定阻抗特性曲线的磁环&#xff1a; 磁环绕不同的圈数&#xff0c;阻抗特性曲线不同&#xff0c;磁环没有类似于磁珠的特定频率和阻抗特性曲线的磁环。 磁环与磁珠的核心区别&#xff1a; 磁珠是一种固定频率阻抗器件&#xff0c;出厂时已通过材料和工艺设计确定…

【MATLAB海洋专题】历史汇总

【MATLAB海洋专题】历史汇总 目录 01&#xff1a;海洋专题进阶教学 02&#xff1a;海洋数据处理 03&#xff1a;海洋数据下载 04&#xff1a;海洋配色 05&#xff1a;海洋专题基础教学 06: 其他基础画图 07&#xff1a;python 画海图专题 08&#xff1a;模式相关文件制作 01…

数据仓库ODS、DWD、DWS、ADS各层介绍

数据仓库Data warehouse&#xff08;可简写为DW或者DWH&#xff09;建设的目的&#xff0c;是为前端查询和分析作为基础&#xff0c;主要应用于OLAP&#xff08;on-line Analytical Processing&#xff09;&#xff0c;支持复杂的分析操作&#xff0c;侧重决策支持&#xff0c;…

动态提示词(小模型)、RAG和提示词系统

动态提示词(小模型)、RAG和提示词系统 目录 动态提示词(小模型)、RAG和提示词系统小模型方案:动态提示词基于规则的动态提示词生成基于模板的动态提示词生成基于小模型的动态提示词生成基于强化学习的动态提示词生成基于元学习的动态提示词生成动态提示词(小模型)RAG(检…

并发设计模式实战系列(3):工作队列

&#x1f31f; ​大家好&#xff0c;我是摘星&#xff01;​ &#x1f31f; 今天为大家带来的是并发设计模式实战系列&#xff0c;第三章工作队列&#xff08;Work Queue&#xff09;​​&#xff0c;废话不多说直接开始~ 目录 一、核心原理深度拆解 1. 生产者-消费者架构 …

云账号安全事件应急响应指南:应对来自中国IP的异常访问

在当今数字化时代,云服务已成为企业IT基础设施的核心。然而,随之而来的安全挑战也日益突出。本文将详细介绍当发现云账号被来自中国的IP地址异常利用时,应如何快速有效地响应,以确保账户安全并最小化潜在风险。 1. 确认异常活动 首先,我们需要确认是否真的发生了安全事件…

三网通电玩城平台系统结构与源码工程详解(五):客户端热更机制与多端资源分发流程

本篇将聚焦三网通平台在多客户端部署中的资源热更机制设计、跨平台同步策略、版本控制与前端资源发布管理&#xff0c;帮助开发者搭建高效稳定的资源更新系统。 一、资源分发平台架构 为实现安卓端、iOS端、PC端的统一更新分发&#xff0c;平台采用 Node.js Express 构建资源…

spark和hadoop的区别

一、spark概述 二、处理速度 三、 编程模型 四、实时性处理 五、spark内置模块 六、spark的运行模式

AI写代码之GO+Python写个爬虫系统

下面我们我们来利用AI&#xff0c;来用GOPython写个爬虫系统。 帮我写一个Python语言爬取数据写入Mysql的案例&#xff0c;信息如下&#xff1a; 1、Mysql数据库地址是&#xff1a;192.168.1.20 &#xff0c;mysql用户名是&#xff1a;root&#xff0c; Mysql密码是&#xff1…

从单模态到多模态:深度生成模型的演进历程

在人工智能领域&#xff0c;生成模型的发展一直是研究热点。从最早的自编码器到如今的多模态扩散模型&#xff0c;这一技术路线不断突破&#xff0c;为创意内容生成、数据增强和表示学习等领域带来革命性变化。本文将详细介绍几种关键生成模型的技术原理和演进路径&#xff0c;…

【系统架构设计师】嵌入式微处理器

目录 1. 说明2. 微处理器(MPU)3. 微控制器(MCU)4. 信号处理器(DSP)5. 图形处理器(GPU)6. 片上系统(SoC)7. 例题7.1 例题1 1. 说明 1.嵌入式微处理器主要用于处理相关任务。2.由于嵌入式系统通常都在室外使用&#xff0c;可能处于不同环境&#xff0c;因此&#xff0c;选择处理…