Linux内核开发_3_busybox

news/2025/11/7 10:42:56/文章来源:https://www.cnblogs.com/yipianchuyun/p/19198900

Linux内核开发_3_busybox

Busybox简介
busybox是一个开源项目,集合了Linux的常用命令,且体积非常小,一般被用于嵌入式Linux上。

busybox在编写初期的思想就是简洁,小巧,强悍,并且设计时从系统资源考虑,节省内存,动态编译busybox工具包总大小才几百kb,如果是静态编译则才1MB左右,非常适合用于嵌入式开发,与发行版不同,发行版使用的不是busybox,一些流行发行版一般使用的都是GNU fileutils、shellutils,这些工具链里包含了对文件,还有一些shell支持的命令,就是我们常用的ls之类的命令,都属于GNU的开源项目。

下载Busybox
你可以在它的官网下载到有关Busybox的所有开源版本的源代码:

https://busybox.net/downloads/

将Busybox制作成根文件系统
前几篇文章讲了如何使用Initramf作为根文件系统,但是效果并不能达到我们的要求,这篇文章使用busybox做一个完整的根文件系统,并且不将它作为临时根文件系统,而是把它当作一个实际根文件系统,供Linux内核使用。

根文件系统简述
在Linux中,根文件系统就是Linux下“/”目录,Linux把文件系统挂载到这个目录下,这个目录下一般拥有Linux运行时需要的一些设备文件,如块设备,tty,字符设备文件等。

编译Busybox
这里我下载的是1.27.0版本的

wget https://busybox.net/downloads/busybox-1.27.0.tar.bz2

这里跟大家说一个tar解压命令的小技巧,原本这种解压我们需要使用对应的选项,二次解压后才能得到原文件,这里我们不需要指定这些,tar命令会自动帮我们分析

tar -xf busybox-1.27.0.tar.bz2

-x是解压的意思,-f是文件的意思,我们不需要指定解压格式,tar会自动帮我们分析

busybox目录结构说明:
applets

主要是实现applets框架的文件

applets_sh

一些有用的脚本,例如:dos2unix、unix2dos等

archival

与压缩有关的命令源文件,例如:bzip2、gzip等

configs

自带的一些默认配置文件

console-tools

与控制台相关的一些命令,例如:setconsole

coreutils

常用的核心命令,例如:cat、rm等

editors

常用的编辑命令,例如:vi、diff等

findutils

用于查找的命令,例如:find、grep等

init

init进程的实现源文件

networking

与网络相关的命令,例如:telnetl、arp等

shell

与shell相关的实现,例如:ash、msh等

util-linux

Linux下常用的命令,主要是与文件系统相关的,例如:mkfs_ext2等


配置busybox
和Linux一样,busybox使用menuconfig配置,可以在里面去裁剪一些不需要的模块,这里我们使用这个命令然后选择静态编译,因为在我们编译的Linux内核里,并不自带GLIBC库

sudo make menuconfig

选择“Busybox Setting"

image

选择”Build BusyBox as a static binary(no shared libs)” 按下“Y”

image

 然后保存退出,使用make install编译

sudo make install

编译完成后会生成很多目录,其中_install目录里就是我们需要的bin文件,除了bin文件还包含了一些根文件系统所具备的一些设备文件

image

 使用ls命令查看一下:

image

 

包含了一些基本的文件目录,如usr,bin这些Linux内核运行时的一些目录,当然,只有这些目录是不能算上一个完整的根文件系统目录的,还需要/dev /tty等目录。

创建文件系统
busybox编译完成了,上面也说了_install文件夹下的所有文件,要被拿来制作成文件系统,那么怎么制作呢?

很简单,在Linux上如果要对软盘或者U盘进行操作,那么就需要挂载,这里我们可以使用dd命令先创建一个软盘,作为我们的根文件系统的镜像文件,然后将它挂载到一个目录下,最后我们把busybox下_install目录copy到镜像文件挂载的目录下,这样镜像文件里就有了一个基础根文件系统所需要的设备文件目录,然后在卸载挂载,这样一个文件系统的镜像就已经制作完成了。

实践:

1.创建镜像文件

dd if=/dev/zero of=rootfs.img bs=4096 count=1024

这里我们创建一个4MB大小的镜像文件

然后使用ext3格式格式化这个镜像文件,前几篇文章说过,Linux子系统VFS负责与文件系统进行交互,但是VFS只认特定的格式,如NFS,EXT等,所以这里我们格式化一下,注意如果你的Linux内核不支持ext3,需要在make menuconfig时,选择file system里把这一选项按下Y,否则VFS会报内核恐慌

mkfs.ext3 rootfs.img

这里我们创建一个4MB大小的镜像文件

然后使用ext3格式格式化这个镜像文件,前几篇文章说过,Linux子系统VFS负责与文件系统进行交互,但是VFS只认特定的格式,如NFS,EXT等,所以这里我们格式化一下,注意如果你的Linux内核不支持ext3,需要在make menuconfig时,选择file system里把这一选项按下Y,否则VFS会报内核恐慌

mkfs.ext3 rootfs.img

创建一个目录作为挂载点:

mkdir rootfs

将busybox下的_install文件夹下的所有文件copy过来

sudo cp -a ../busybox-1.27.0/_install/* rootfs/.

ls看一下:

image

 

除了这些文件以外,我们还需要三个设备文件dev proc sys

这里介绍一些这三个文件的作用:

/sys/ 用于管理存储文件,文件相关管理 的,sys是运行在内存中的
/proc 用于管理进程,是对进程管理,运行的进程参数管理的
/dev 存放各种设备节点,除了设备节点还会存储socket,管道文件

这些是Linux内核运行时需要的三个设备节点,这里我们创建出来,具体这些文件的作用,我后面在写文件系统组成时会详细讲解,目前各位只需要知道这些文件在运行时,会被Linux内核里的一些文件管理系统挂载到上面去

注意这些文件需要创建在rootfs文件夹下哦

cd rootfs
sudo  mkdir dev proc sys
cd ..

基本一个文件系统的基础已经搭好了,那么这样我们就可以卸载挂载了,然后把这个挂载目录删除或者不删除都可以

sudo umount rootfs

  

那么到这一步,基本上一个简单的根文件系统已经搭好了,可以用作嵌入式,或者amd都可以。

运行

使用qemu指定我们的硬盘路径,然后模拟运行:

qemu-system-x86_64 -kernel /usr/src/linux-4.10.15/arch/x86/boot/bzImage\-hda rootfs.img \-append "root=/dev/sda init=/bin/ash"

这里来解释一下选项:

-hda 是指定硬盘文件

-append 这个选项不用多说了,第一篇文章有说过,这里说一下里面的运行

root=/dev/sda 这个是指定根文件系统挂载点,大家有没有发现其实我们刚刚创建时,只是创建了一个dev目录,但是并没有创建sda这个目录,这个不用担心,因为Linux内核运行时会在自动创建设备文件,并将文件系统挂载到这些文件上,这个sda就是文件系统挂载目录,这个设备文件必须指定为sda,经过测试结果是这样,查的资料是这个设备文件是指整个硬盘,还有sda1,sda2这些是指硬盘下的分区,至于更详细的资料,还在查阅读内核代码中。

最后面,的init可以不用指定,这个就是在根文件目录下的bin下找一个可执行文件,如果不指定的话Linux内核会自动寻找几个常用的init

image

 

这几行代码是位于Linux内核init/main.c文件下的kernel_init函数下,它会去依次使用try_to_run_init_process函数来调用不同的初始化函数,如果你的根文件系统下有对应的文件就ok,如果没有则会引起内核恐慌,找不到init程序。

与Linux2.6内核不同的是Linux2.6使用的是init_post,这个函数会发生两次调用,第一次是进入到init_post,完成相关初始化后在去依次创建这些进程。

但是到了我们所使用的内核时,只会发生一次函数调用,初始化前面就已经被完成了,就只会发生调用创建进程的函数,可以说得上是运行速度和资源上的提升了。

因为在内核里,一切都最好按照一个整体来设计,这样就可以省去不必要的接口调用,等函数调用时发生的堆栈保护等问题。

所以这也是为什么可以在Linux内核里看到大量的内联函数的原因。

运行结果:

image

 

注意运行后要按两下回车,因为运行时init已经打印出数据来了,但是Linux内核的一些工作是后续完成的,也会打印出来,会导致你可能看不到“#”这个输入交互字符,建议按两下回车,刷一下缓冲流,有的时候这会让人觉得是不是运行没有成功,哈哈我就是。

添加自己的调试程序
这里教大家一个小技巧,比如我写了一个调试程序,那么我想调试它怎么办?

我们可以先挂载镜像文件,然后把我们的文件打包到bin目录下就可以了,不过打包的文件要静态编译,这一点在第一章已经说过了,这里就不多说啦。

先随便写一个文件:

vim test.c
#include <stdio.h>int main(){printf("test!");return 0;
}

gcc静态编译:

gcc -static -o test test.c

然后挂载一下镜像文件,在把test copy进去

sudo mount -o -loop rootfs.img rootfs
sudo cp test rootfs/bin/

然后运行,Linux内核时到bin目录下执行即可

记得把镜像文件分配大一点哦,不然会出现 No space left on device的错误。

————————————————
版权声明:本文为CSDN博主「17岁boy想当攻城狮」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/bjbz_cxy/article/details/106132902

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

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

相关文章

React系列教程:9. 空包裹

函数组件 // src/components/Hello1.jsximport { useState } from reactfunction Hello1 (props) {const [ hello1, setHello1 ] = useState(world1)setTimeout(() => {setHello1(world2)}, 2000)return ({/* 两个子…

2025年克拉玛依旅游团权威推荐榜单:新疆旅游/新疆自驾游/新疆赛里木湖旅游线路服务商精选

随着新疆旅游基础设施的完善和旅游资源深度开发,克拉玛依作为石油工业与自然奇观完美结合的目的地,正迎来旅游业的快速增长。根据旅游行业数据显示,2024年克拉玛依市接待游客量同比增长18.5%,其中乌尔禾魔鬼城、黑…

2025年质量好的油压机厂家最新推荐权威榜

2025年质量好的油压机厂家最新推荐权威榜 在工业制造领域,油压机作为核心设备之一,广泛应用于汽车、电子、机械加工等行业。随着技术升级与市场需求的变化,选择一家质量可靠、技术先进的油压机厂家至关重要。本文基…

整体设计 逻辑实用的系统工具 之17 Source 容器(Docker)承载 C/P/D 三式的完整设计与双闭环验证 之1

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

消防监管指挥平台

一、政策驱动:全国消防智慧化升级的号角已吹响 近年来,各级政府密集出台政策推动消防监管数字化。云南提出 “消防安全治理三年计划” ,要求将消防站点、车道等纳入国土空间规划,并建立 跨部门综合监管机制 ,运用…

2025年口碑好的无极绳绞车轮组厂家最新推荐排行榜

2025年口碑好的无极绳绞车轮组厂家最新推荐排行榜 随着矿山、煤矿等行业的快速发展,无极绳绞车轮组作为重要的牵引设备,市场需求持续增长。选择一家技术先进、质量可靠、服务完善的厂家至关重要。本文根据市场调研、…

c#学习_delegate

变量(数据) 以变量名所对应的内存地址为起点的一段内存,这段内存地址中存储的值就是数据;在C#中,用户定义的数据类型,需要先创建对应的数据类型模板,用来确认此数据类型在内存中需要多大的内存空间,再创建此数…

2025年评价高的数据中心展观众登记

2025年评价高的数据中心展观众登记指南 随着全球数字化转型加速,数据中心作为算力基础设施的核心载体,其绿色化、智能化、协同化发展已成为行业焦点。为帮助专业观众高效锁定高价值展会资源,本文基于真实参展商口碑…

心情日记 | 而一切终归于平静

心情日记 | 而一切终归于平静 引 今天看到一个博客,没想到博主是一个学音乐的(看博客内容猜测是) 向那样的自建博客,少不了折腾,也因此拥有自建博客的,一般程序猿居多。 那个博客很“自然”。对随心所欲的去记录…

Ubuntu取消sudo密码验证完整配置

对于正在ubutu开发的人来,每次执行指令都要密码,时间长了会有些狗血 Ubuntu取消sudo密码验证完整配置安全警告:取消sudo密码会降低系统安全性,仅限测试环境使用!# 方法1:完全免密码(高风险) echo yourusername…

2025 橡塑保温源头厂家最新推荐排行榜:绿色环保 + AAA 信用认证企业权威甄选指南橡塑保温/绝热材料/隔热材料保温板厂家推荐

引言 橡塑保温材料在建筑节能、新能源、工业等领域的应用需求持续攀升,但市场产品质量差异显著,导热系数不达标、环保性能不合格等问题频发。为精准筛选优质企业,本次榜单由行业协会联合测评机构重磅发布,基于 3 大…

2025年上海智能运维智算中心展会议论坛

2025年上海智能运维智算中心展会议论坛:五大顶尖参展商权威推荐指南 随着全球数字化进程加速,数据中心与智算中心作为算力基础设施的核心载体,正迎来绿色化、智能化、协同化的产业升级浪潮。2026年6月3日-5日,第1…

搭建AI资讯早报:AiOnly全球大模型服务+N8N自动化工作流实战

​ 一、AiOnly 平台介绍 AiOnly 是一个专业的一站式大模型 API 聚合平台,集成了 GPT、Claude、Gemini、DeepSeek、Qwen 等数十个全球顶尖 AI 模型。平台通过统一的 RESTful API 接口,为用户提供涵盖文本生成、图像创…

2025年靠谱的新中式香氛五金厂家最新权威实力榜

2025年靠谱的新中式香氛五金厂家最新权威实力榜在当今家居装饰与五金制造领域,新中式风格与智能家居的融合正成为市场新宠。香氛五金作为这一趋势下的创新品类,将传统五金的功能性与现代家居的感官体验完美结合,为消…

2025年新疆电线电缆厂家权威推荐榜单:耐火电缆/高温电缆/特种电缆源头厂家精选

随着新疆地区基础设施建设和能源开发的持续推进,电线电缆行业正迎来专业化、高品质化的发展趋势。根据行业数据显示,2024年新疆地区电线电缆市场需求规模达到约87亿元,同比增长8.5%,其中电力电缆、特种电缆等产品需…

功能安全实车测试设备

产品背景随着智能网联汽车技术快速发展,功能安全验证已成为行业关注焦点。ISO 26262标准要求通过故障注入测试验证系统安全机制的有效性,但传统台架或仿真测试难以真实反映实车工况表现。针对这一行业痛点,北汇信息…

2025年知名的船用门窗盖厂家推荐及选择参考

2025年知名的船用门窗盖厂家推荐及选择参考 随着全球航运业的持续发展,船用门窗盖作为船舶舾装的重要组成部分,其质量、耐用性和安全性直接影响船舶的整体性能。2025年,市场上涌现出一批技术领先、质量可靠的船用门…

2025年评价高的通用水性色浆厂家最新推荐权威榜

2025年评价高的通用水性色浆厂家最新推荐权威榜在涂料和化工行业中,水性色浆作为重要的着色材料,其品质直接影响最终产品的色彩表现和稳定性。随着环保要求的日益严格,水性色浆因其低VOC、无毒环保的特性,已成为涂…

2025年评价高的塑钢岗亭厂家最新推荐权威榜

2025年评价高的塑钢岗亭厂家最新推荐权威榜 随着城市化进程的加快和智能化需求的提升,塑钢岗亭因其耐用性、环保性和经济性,成为各类场所的首选设施。无论是警务执勤、小区安保,还是商业售货、工地管理,优质的岗亭…

2025年机械设备制造行业SAP实施商哪家好?哪家比较专业?

先跟大家说个明白,这篇文章不绕弯子 —— 核心就是帮机械装备行业的朋友搞清楚两件事:一是现在行业为什么必须做数字化、为什么选 SAP;二是 2025 年这会儿,哪家 SAP 实施商能真正解决咱们的痛点。全文会先聊行业近…