首页/新闻资讯/正文详情

使用Buildroot进行根文件系统构建

发布时间:2026/9/24 13:52:32 来源:云帆数科 栏目:资讯中心
使用Buildroot进行根文件系统构建
前面我们学习了如何使用 busybox 来构建根文件系统,但是 busybox 构建的根文件系统不齐全,很多东西需要我们自行添加,比如 lib 库文件。在我们后面的驱动开发中很多第三方软件也需要我们自己去移植,这些第三方软件有很多又依赖其他的库文件,导致移植过程非常的繁琐。本章我们来学习一下另外一种实用的根文件系统构建方法,那就是使用 buildroot 来构建根文件系统。Buildroot 是一个流行的嵌入式 Linux 系统构建工具,它可以帮助开发者自动化地构建完整的嵌入式 Linux 系统,包括文件系统、内核以及各种用户空间应用程序。直接使用busybox也能构建最小rootfs,使用buildroot也需要使用busybox来构建基础的rootfs,区别在于buildroot已经集成了很多第三方package,可以很方便的进行集成,make menuconfig简单的使能一下,就可以快速集成,不需要去研究第三方组建,复杂的编译流程,及其复杂的依赖项。注意:不要以为busybox直接就能构建根文件系统!!!这个误解非常常见,很多刚接触嵌入式 Linux 的人都会这么想,主要是名字和教程给人的错觉,咱们把边界再理清楚一点:核心一句话BusyBox不能直接一键产出完整可用的根文件系统镜像。它只产出一个主程序 busybox+ 配套软链接(ls、sh、cp、date、wpa_cli 等)。它是 rootfs 的核心组件,不是 rootfs 的构建框架。那为什么很多教程会说 “用 BusyBox 做根文件系统”?准确的意思是:以 BusyBox 为基础,手动搭建 rootfs,而不是 BusyBox 自动帮你做完。手动流程大概是这样(没有 Buildroot 的情况下):交叉编译 BusyBox,得到busybox可执行文件;手动创建一套目录:bin、sbin、etc、dev、proc、sys;自己创建软链接:ln -s busybox ls、ln -s busybox sh;自己写启动脚本:etc/inittab、etc/init.d/rcS;拷贝 C 库(libc、ld)到 lib 目录;用工具(genext2fs、cpio)打包成镜像。👉 BusyBox 只负责第 1、3 步;剩下目录、脚本、库、打包,全都要你自己来。如果你只编译了 busybox,丢到板子上,没有/etc/inittab、没有库,板子是启动不起来的。对比 BuildrootBuildroot 把上面所有步骤自动化了:它会自动:编译 BusyBox → 建目录 → 生成软链接 → 生成 inittab/rcS → 拷贝库 → 打包镜像。所以 Buildroot 才是 “构建根文件系统” 的工具,BusyBox 是它里面的一个包。一个好记的区分BusyBox:提供命令和 shell;Buildroot:把 BusyBox、内核、应用、脚本、库拼起来,做成可以烧录的固件。补充一个小坑BusyBox 自己的make menuconfig,只是选择启用哪些命令(要不要 date、要不要 wpa_cli),配置完 make,输出只有 busybox 二进制,不会生成完整 rootfs 目录和镜像。busybox这种一个可执行程序,不同名称软链接进去就执行不同的内容,这个机制是咋实现的,同一个名字还能执行不同的代码BusyBox 这个单文件,启动的时候,程序先拿到自己的「程序名(argv [0])」,根据名字分支跳转到不同的函数执行。Linux 下,进程启动时,main函数的第一个参数argv[0],就是调用它用的文件名。int main(int argc, char *argv[]) { // argv[0] 就是你执行的命令名字:"ls" / "cp" / "date" }举个直观场景你做软链接:ln -s busybox ls ln -s busybox date ln -s busybox wpa_cli文件系统上:ls、date都指向同一个busybox二进制。执行./ls内核加载 busybox 这个程序,但传给 main 的 argv [0] = "ls";BusyBox 内部查表,识别名字是ls,就跑 ls 对应的代码逻辑。执行./date同样加载同一个 busybox 二进制,argv [0] = "date";内部匹配名字,跑 date 的代码。二进制本体没有复制多份,只是入口名字不一样,代码自己分支。BusyBox 内部大概伪代码(简化版)int main(int argc, char *argv[]) { const char *cmd_name = basename(argv[0]); if (strcmp(cmd_name, "ls") == 0) { return ls_main(argc, argv); } else if (strcmp(cmd_name, "date") == 0) { return date_main(argc, argv); } else if (strcmp(cmd_name, "wpa_cli") == 0) { return wpa_cli_main(argc, argv); } // ...一大堆命令分支 else { // 直接运行 busybox 本身,打印帮助 return busybox_main(argc, argv); } }每个命令都有独立的xxx_main()函数,编译时全部链接进同一个 elf。为啥argv[0]存的是软链接的名字,那要是直接执行busybox呢?先说核心argv[0]是调用方(shell/exec 系统调用)传进去的字符串,不是内核从二进制文件里读出来的固定名字。Linux 的execve系统调用原型:int execve(const char *filename, char *const argv[], char *const envp[]);filename:内核要加载的真实文件路径(会解析软链接,找到 busybox 本体)argv数组:由调用者自己填,内核不主动改写它情况 1:直接执行 busybox./busyboxshell 调用execve:filename =./busybox(真实文件)argv[0] =./busyboxBusybox 拿到basename(argv[0])是"busybox",就进入 busybox 主逻辑,打印帮助信息。情况 2:通过软链接执行ln -s busybox ls ./lsshell 调用execve:filename =./ls,内核解析软链接,找到真实文件busybox,加载它argv[0] =./ls(shell 把你敲的命令字符串原样放进 argv [0])Busybox 取名字"ls",匹配 ls 的函数。关键点:

相关推荐

关于U3D的学习
关于U3D的学习

将绑定好的 Sprite 拖入场景中,为其添加 Sprite Skin 脚本。 点击 Create Bones 按钮,生成骨骼 在 C# 中,自定义特性(Attribute)的命名有个约定俗成的“语法糖”: 如果你定义的类名是 XXXAttribute,那么你可以在使用的时候省略掉 Attribute 后缀,只写 [XXX] public … · 2026/9/24 13:52:32

DC24V电源端口EMC设计:TVS管选型与PCB布局避坑实战指南
DC24V电源端口EMC设计:TVS管选型与PCB布局避坑实战指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/24 13:52:25

城市大脑数字底座一网统管方案:从云平台选型到事件闭环落地
城市大脑数字底座一网统管方案:从云平台选型到事件闭环落地

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/24 13:52:25

Cursor 入门:MCP 开发调用与项目实战,用 TaoToken 统一 Key 打通 AI 编程链路
Cursor 入门:MCP 开发调用与项目实战,用 TaoToken 统一 Key 打通 AI 编程链路

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 5:58:50

Atlas 300V 24G部署YOLO全攻略:从硬件认知到推理实战
Atlas 300V 24G部署YOLO全攻略:从硬件认知到推理实战

这两年AI圈里“Atlas”这个名字出镜率越来越高,但你要是去搜,会发现它既指NVIDIA的机器人平台,又是数据库中间件的名字,甚至还是各种乱七八糟的库。不过从“atlas部署yolo”和“atlas 300V 24G”这两组关联热词来看,大… · 2026/9/25 5:58:50

Windows下MQTT服务器搭建实操指南
Windows下MQTT服务器搭建实操指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 5:58:50

SWE-bench Verified 实战:用 TaoToken 统一 Key 跑通 AI 软件工程基准测试
SWE-bench Verified 实战:用 TaoToken 统一 Key 跑通 AI 软件工程基准测试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 5:58:44

SCARA机械臂ROS运动规划避坑指南:URDF校准、IKFast定制与ROS1/2双版本控制
SCARA机械臂ROS运动规划避坑指南:URDF校准、IKFast定制与ROS1/2双版本控制

简介:本资源是一套面向ROS开发者与机器人控制学习者的SCARA机械臂运动规划与控制集成包,聚焦工业自动化场景下高精度、高速度装配任务的算法实现与工程落地。资源完整支持ROS1与ROS2双版本,基于MoveIt框架实现逆运动学解析、平滑轨迹规划及实… · 2026/9/25 5:58:43

open-code-review:可审计的本地化AI代码审查协议栈
open-code-review:可审计的本地化AI代码审查协议栈

1. 这不是又一个“AI代码审查”玩具:open-code-review 的真实定位与设计哲学你肯定见过太多打着“AI Code Review”旗号的工具——它们要么是把 GitHub Copilot 换个皮肤塞进 PR 界面,要么是调用某个大模型 API 后把返回结果粗暴拼成一段“建议”&#x… · 2026/9/25 5:58:37

数值优化(Numerical Optimization)学习系列-03-共轭梯度方法(Conjugate Gradient)
数值优化(Numerical Optimization)学习系列-03-共轭梯度方法(Conjugate Gradient)

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:31

创维E900V22D刷机全攻略:S905L3SB芯片兼容性解析与救砖实战
创维E900V22D刷机全攻略:S905L3SB芯片兼容性解析与救砖实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:31

MQTT协议原理与Broker服务器搭建实战:从Mosquitto到EMQX
MQTT协议原理与Broker服务器搭建实战:从Mosquitto到EMQX

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:37

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码