完整教程:构建并运行最小 Linux 内核

news/2025/10/24 17:13:39/文章来源:https://www.cnblogs.com/yxysuanfa/p/19163831

大家好!我是大聪明-PLUS

有一天,一位技术主管建议我读一读 Bove 和 Cesati 合著的《理解 Linux 内核》  。这本书涵盖了 Linux 2.6,比更现代的 6.0 版本落后了不少。但显然,它仍然包含许多有价值的信息。这本书很厚,所以我花了很长时间才读完。在学习的过程中,我决定搭建一个开发环境,以便查看和修改最新版本的 Linux 内核——这会让学习过程更加有趣。

还有其他文章讲解了如何构建 Linux 内核。但在本文中,我将以稍微不同的方式组织和呈现这些信息。

❯ 阶段

这项工作将分两个主要阶段进行:

  1. 在 qemu 上构建和运行 Linux

  2. 在 Busybox 用户空间支持下在 qemu 上构建和运行 Linux

此外,qemu 允许您将调试器直接连接到正在运行的 Linux 内核。我原本计划研究这个过程并写一篇文章,但发现篇幅太长后就改变了主意。您可以亲自体验一下——我以前从未使用过它。

❯ 安装 qemu

我们将使用 Qemu 模拟器来模拟硬件。我们正在构建的 Linux 系统将由它来运行。要安装,请运行:

~ sudo apt install qemu qemu-system

起初我尝试从源代码构建 qemu,但它有很多依赖项,我很快意识到我在浪费时间。

❯ 克隆 Linux,在本地机器上建立分支

首先,让我们克隆 Linux 存储库。

~ git clone https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/

这是测试下载速度的一项重要任务。

~ du --max-depth=1 --block-size=GB | grep linux
6GB     ./linux

然后,选中我们感兴趣的版本旁边的框。我选择了 5.19。

~ cd linux
# alias gco="git checkout"
~ gco v5.19
~ git branch -M 5.19

❯ 构建 Linux

如您所见,整个构建过程直接记录在 Linux 源代码树中;您也可以输入命令 make help,它将显示可用的选项。下面,我将逐步描述我所做的工作。

清洁(第一次不需要)

清除 .o之前尝试留下的所有过时文件。由于这是第一次构建,我们现在不需要这么做,但提前养成良好的习惯总是好的。

~ make mrproper

构建内核映像

内核有很多功能——选择你喜欢的功能。例如,内核有很多驱动程序,但你可能只需要其中几个。一次性编译包含所有驱动程序的内核甚至可能导致某些功能无法正常工作。驱动程序只是一个例子。虚拟化、文件系统等也存在类似的功能。有很多配置需要配置!因此,在编译内核时,有一个单独的步骤,你需要明确指定所需的所有功能,然后才能开始实际的编译。

输出是一个内核映像--文件--  bzImage,我们确信它的大小只有 1.5 MB。

❯ 第二步:在 qemu 上运行 Linux

现在让我们尝试使用 qemu 运行我们获得的内核。

按下ctrl + a,然后 x退出控制台屏幕。按下  ctrl + a,然后 h打开帮助菜单和其他选项。

无论如何,如果通过 qemu 运行编译后的内核,内核就会崩溃:

Warning: unable to open an initial console.
List of all partitions:
No filesystem could mount root, tried:
Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0)

下一步我们将摆脱这种恐慌。

❯ 获取 Busybox

现在我们有了 Linux 内核,但还没有用户空间或文件系统。让我们使用一个支持内存的文件系统(initramfs;您可以参考这个 Gentoo 链接作为参考)。我们需要在文件系统中写入一些内容,因为我们不希望用户空间空着。

这时 Busybox 就派上用场了。它通过一个小型二进制文件提供了诸如ls、  cd、  cp、  mv、  vim、  tar、  grep、   (Linux 设备的热插拔事件)和 (网络通道/接口监控)等命令。这些命令dhcp的  功能可能不如 Busybox 之外的其他命令那么丰富且易于配置,但对于我们的目的来说,它们已经足够了。

❯ 配置和构建 Busybox

该过程与使用 Linux 内核时的过程相同。

下载完成后,请检查 busybox 源中的 INSTALL 文件。

打开配置界面后,选择“设置”(按 Enter 键),然后选择“将 Busybox 构建为静态二进制文件”(按 Space 键)。这是因为我们的裸内核在用户空间文件系统中没有任何共享库,所以我们可以立即开始。

现在我们退出配置菜单并保存所做的更改。

我们已准备好开始组装!

所以,

~ ls -la $OUTPUT_DIR --block-size=KB | grep busybox
-rw-r--r--  1 yangwenli yangwenli    2kB Aug 23 15:33 .busybox_unstripped.cmd
-rwxr-xr-x  1 yangwenli yangwenli 2694kB Aug 23 15:33 busybox
-rwxr-xr-x  1 yangwenli yangwenli 2987kB Aug 23 15:33 busybox_unstripped
-rw-r--r--  1 yangwenli yangwenli 2340kB Aug 23 15:33 busybox_unstripped.map
-rw-r--r--  1 yangwenli yangwenli  105kB Aug 23 15:33 busybox_unstripped.out

busybox我们希望获取的二进制文件 确实大约有 2.7 MB,比我们构建的内核还要大。busybox_unstripped 我们对这个变体不感兴趣。它稍微大一点,显然是用来使用分析工具进行分析的。

❯ 创建初始目录结构

接下来的两节很大程度上受到了 Gentoo wiki 中有关自定义 Initramfs 的参考资料的启发 

现在我们需要为我们的 Linux 用户空间构建初始文件结构。

我们需要确保二进制文件busybox 已到位并提供初始化进程/脚本来设置我们的用户空间。

❯ 创建 init 进程

现在让我们创建 init 进程。在目录中, initramfs 创建一个名为 init

~ touch init && chmod +x init

❯ 创建 initramfs cpio

cpio 是一个归档工具。本质上,它能将一组文件和目录可逆地转换为单个文件。类似于 tar。我不明白为什么,但是 initramfs 是通过 cpio 指定的,所以我们必须用它来打包所有内容。我们将使用 gzip 进行压缩。

~ find . -print0 | cpio --null --create --verbose --format=newc | gzip --best > ./custom-initramfs.cpio.gz
.
./etc
./root
./sys
./dev
./bin
./bin/busybox
./init
./proc
cpio: File ./custom-initramfs.cpio.gz grew, 1310720 new bytes not copied
./custom-initramfs.cpio.gz
7824 blocks

所以,我们已经准备好要使用的 initramfs!

❯ 步骤:使用 Busybox 在 qemu 上运行 Linux(使用 initramfs)

现在让我们启动启用 initramfs 的 Linux 内核!

让我们从上面获取 qemu 命令,并从上面添加命令标志并添加一个 initrd,从而指定 initramfs。

您可能对内核崩溃仍然发生感到沮丧。这是因为我们仍然没有在内核中启用 initramfs 支持,并且我们还没有处理用户空间正常运行所需的一些其他细节。

让我们简单介绍一下内核如何启动用户空间,以及它如何知道在哪里找到进程init。为了启动用户空间,内核会依次查找 /init、 /sbin/init 、 /etc/init 、 /bin/init ,最后是 /bin/sh 。我留下了源代码链接。我将 init 文件放在了 /bin/init 。

现在我们已经建立了 initramfs 支持,让我们构建另一个内核。重复上述配置步骤并构建内核:

~ cd /home/$USER/linux
~ make O=$LINUX_BUILD_DIR menuconfig

转到 General Setup 那里找到文件系统 Initial RAM,以及具有随机存取存储器(RAM)的磁盘,然后按“空格”。

在配置文件的最顶部,还要启用 64 位内核。如果您在使用 Busybox 二进制文件时使用 file 命令,您会看到它是为 x86_64 架构构建的。您还会注意到它是 elf 格式的,因此我们也需要为这种格式提供内核支持。由于我们在 init file 中使用了 .elf 符号!#,因此我们也需要提供对它的支持。

最后,从文件顶部向下滚动到 Device Drivers > Character devices > Serial drivers 和 8250/16550compatible serial support 和 Console on 8250/16550compatible serial port需要这些配置设置才能将串行端口用作控制台。如果没有这些更改,init 将无法工作。我认为这就是需要最后一行的原因 exec /bin/sh

现在让我们编译内核:

~ make O=$LINUX_BUILD_DIR -j8

然后我们再次运行 qemu:

~ qemu-system-x86_64 -kernel $LINUX_BUILD_DIR/arch/x86/boot/bzImage -nographic -append "earlyprintk=serial,ttyS0 console=ttyS0 debug" --initrd $INITRAMFS_DIR

至此,我们创建了一个可以运行的 Linux 发行版。如果您有足够的空闲时间,可以继续这个实验,并基于此处的工作构建您自己的发行版。

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

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

相关文章

word批量转pdf

方法:使用Microsoft Word批处理宏 批量实现Word转PDF功能,适合办公人员。无需安装额外软件,操作简单,原生支持。 (1)打开任意 Word 文档,按下 Alt + F11 打开 VBA 编辑器(点击“开发工具”,点击“visual Basi…

【SAE出版 | 高届数 | 检索稳定】第七届土木建筑与城市工程国际学术会议(ICCAUE 2025)

第七届土木建筑与城市工程国际学术会议(ICCAUE 2025)将于2025年10月31日-11月2日在中国贵阳召开。【天津大学、中交天津港湾工程研究院有限公司主办!】 【高届数土木会议 | SAE出版,检索稳定!】 第七届土木建筑与…

qcefview库的使用

目录背景运行环境qcefview源码阅读代码目录代码结构列举的通讯方式通讯方式一,widget中的函数通知web页面改变通讯方式二、鼠标拖拽事件通讯方式三、c++中invoke函数响应(两种UrlRequest、QueryRequest)QCefView中定…

解决Qt 不能debug问题

排查思路 1. 工程配置 通过deepseek查询得到编译选项需要+g,如下 CONFIG += debug QMAKE_CXXFLAGS += -g QMAKE_LFLAGS += -g 1.1. 排查系统的gdb文件是哪个,看是不是期望和和编译配置应用的编译器配套 ----如,都使…

2025年项目总延期?这30款项目进度管理软件让我提前交付率85%!

项目总延期是困扰团队效率的常见难题,但选对工具能让交付率提升至85%以上。本文将为您精选30款高效的项目进度管理软件,覆盖从敏捷开发到传统瀑布模型的不同需求。无论是禅道的全流程管控、Jira的敏捷适配性,还是Tr…

2025 年最新护眼灯生产厂家推荐榜:含全光谱智能照明标杆企业及高产能品牌优选指南自然光护眼/全光谱护眼/儿童护眼吸顶灯公司推荐

引言 当下,电子设备普及让人们日均用眼时长远超以往,护眼照明需求急剧攀升,但护眼灯市场乱象却让消费者陷入困境。众多产品仅靠 “护眼” 噱头吸引购买,实际在光谱连续性、防蓝光效果、频闪控制等核心指标上未达健…

Exadata数据库性能异常,备份进程卡住

1、案例概述 某客户有一台Exadata X9M-2,据客户反馈:“晚上20:30分,开始expdp备份,20:32分卡住。同时,在20:30分也发起了RMAN备份,RMAN备份在21:44也卡住。之后,杀掉进程,并重启恢复正常。” 现在,客户希望分…

做本地门户网站 10 年,我靠微擎摆脱了 “客户需求五花八门” 的噩梦

在我们这座三线城市,我经营的 “小城网” 算小有名气 —— 做了 10 年本地门户网站,从最初帮商家挂广告,到后来承接小程序、公众号开发,手里攒了 200 多个本地客户。可这两年,我却越来越怕接客户的电话,不是不想…

2025 年国内吸顶灯源头厂家最新推荐排行榜:聚焦全光谱技术与品质生产,精选优质厂家助力家居照明选购全光谱/中山现代/客厅现代/吊灯吸顶灯公司推荐

引言 当前家居照明市场中,吸顶灯因适配场景广、照明效果稳定成为众多家庭首选,但市场乱象却给消费者选购带来极大困扰。一方面,品牌数量繁杂且质量差距悬殊,部分小厂家使用劣质材料生产,导致产品存在寿命短、光效…

RabbitMQ框架及应用场景

简介 RabbitMQ是一个使用Erlang,基于AMQP协议的MQ组件。 AMQP全称为 Advanced Message Queuing Protocol(高级消息队列协议****),是一个面向消息的中间件传输协议,用于在应用程序之间进行异步消息通信。 AMQP协议…

UNIX下C语言编程与实践11-UNIX 动态库显式调用:dlopen、dlsym、dlerror、dlclose 函数的使用与实例 - 指南

UNIX下C语言编程与实践11-UNIX 动态库显式调用:dlopen、dlsym、dlerror、dlclose 函数的使用与实例 - 指南2025-10-24 16:56 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: …

熟知大模型中mcp概念 --by zk

MCP核心概念解析 什么是MCP:让大模型拥有“手和脚” 大模型本身只有对话和决策能力,没有执行调用工具,获取资源的能力。因此定义一套让大模型调用外部能力的通用协议很重要。MCP(Model Context Protocol)是一套让…

【开题答辩全过程】以 “辛巴克餐饮”小程序为例,具备答辩的问题和答案

【开题答辩全过程】以 “辛巴克餐饮”小程序为例,具备答辩的问题和答案pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: …

2025年一体化雨水提升泵站厂家权威推荐榜单:污水提升泵站/一体化污水泵站/一体化雨水泵站源头厂家精选

在市政排水与水资源管理领域,一体化雨水提升泵站已成为现代城市基础设施的核心组成部分,其高效性能直接关系到城市防洪排涝能力与水环境保护质量。 随着全球城市化进程加速,市政排水系统面临前所未有的压力。据最新…

STM32软件I2C读写AT24C64 - 指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

bcc

bcc原理从内核中获取数据。 整个工具的核心原理是利用 eBPF 技术,在内核中与块设备 I/O 相关的关键函数上设置探针(Tracepoint),从而在几乎无开销的情况下捕获 I/O 请求的开始和结束时间,计算出延迟,并将结果存入…

手写ibatis

通用 Mapper:提供通用的 CRUD 方法。条件构造器:支持链式调用,构建查询条件。分页查询:支持 Oracle 的分页查询。连表查询:支持 JOIN 查询。指定字段查询:支持动态选择查询字段。注解支持:通过注解配置实体类和…

读书笔记:解锁数据库查询新姿势:函数索引让你的搜索又快又准

我们的文章会在微信公众号IT民工的龙马人生和博客网站( www.htz.pw )同步更新 ,欢迎关注收藏,也欢迎大家转载,但是请在文章开始地方标注文章出处,谢谢! 由于博客中有大量代码,通过页面浏览效果更佳。本文为个人学…

国产IPD项目管理软件推荐|别再靠 Excel 推 IPD 了!帮你把IPD流程从“纸上”搬进系统

本文盘点了国内能真正支撑 IPD 流程落地的几款软件,从配置灵活、可视化程度高的飞书项目,到深度面向研发的禅道,覆盖制造业、硬件、互联网等多场景。看完你就能判断:哪一款最适合你的组织,帮你实现从立项到评审、…

【源码解读之 Mybatis】【核心篇】--第7篇:ParameterHandler参数处理机制

【源码解读之 Mybatis】【核心篇】--第7篇:ParameterHandler参数处理机制第7篇:ParameterHandler参数处理机制 1. 学习目标确认 1.0 第6篇思考题解答 在深入学习ParameterHandler参数处理机制之前,让我们先回顾并解…