怎么使用 Buildroot 构建根文件系统

article/2025/9/19 19:22:23

1. Buildroot 简介

制作根文件系统有归多种方法:

① 使用Busybox手工制作
Busybox本身包含了很了Linux命令,但是要编译其他程序的话需要手工下载、编译,如果它需要某些依赖库,你还需要手工下载、编译这些依赖库。
如果想做一个极简的文件系统,可以使用Busybox手工制作。

② 使用Buildroot自动制作
它是一个自动化程序很高的系统,可以在里面配置、编译内核,配置编译u-boot、配置编译根文件系统。在编译某些APP时,它会自动去下载源码、下载它的依赖库,自动编译这些程序。
Buildroot的语法跟一般的Makefile语法类似,很容易掌握。

③ 使用Yocto
NXP、ST等公司的官方开发包是使用Yocto,但是Yocto语法复杂,并且Yocto动辄10GB,下载安装都很困难,普通笔记本编译可能需要2-3天甚至更久,非常不适合初学者(我们不推荐使用yocto构建文件系统)。

基于上述特点,我们选择Buildroot。

Buildroot是一组Makefile和补丁,可简化并自动化地为嵌入式系统构建完整的、可启动的Linux环境
(包括bootloader、Linux内核、包含各种APP的文件系统)。Buildroot运行于Linux平台,可以使用交叉编译工具为多个目标板构建嵌入式Linux平台。Buildroot可以自动构建所需的交叉编译工具链,创建根文件系统,编译Linux内核映像,并生成引导加载程序用于目标嵌入式系统,或者它可以执行这些步骤的任何独立组合。例如,可以单独使用已安装的交叉编译工具链,而Buildroot仅创建根文件系统。

参考网址
Buildroot用户手册 https://buildroot.org/downloads/manual/manual.html
Buildroot源码下载位置 https://buildroot.org/downloads/
目录结构的位置以及作用请参考网址 http://wiki.100ask.net/Buildroot
学习更多关于buildroot知识请参考 http://wiki.100ask.org/Buildroot

百问网提供的Buildroot现支持如下包:
在这里插入图片描述

2. 系统特征讲解

我们都做了哪些改进?
我们基于buildroot官方 2020.02长期支持版本进行适配100ask-stm32mp1mp157-pro开发板,在此基础上针对ST yocto发行系统做了大量的裁剪,在保证最小系统的基础上增加对qt5.12 eglfs库的支持,同时也支持opencv3编程 mqtt库 swupdate ota升级等等比较常用的应用,我们也会提供如何在buildroot新增自己的软件包教程,同时源码保存在gitee上,链接地址为 https://gitee.com/weidongshan/ST-Buildroot.git 大家可以在上面提交issue 或者pull request。

init(为英语:initialization 的简写)是 Unix 和 类 Unix 系统中用来产生其它所有进程的程序。它以守护进程的方式存在,其进程号为 1。Linux 系统在引导时加载 Linux 内核后,便由 Linux 内核加载init 程序,由 init 程序完成余下的引导过程,比如加载运行级别,加载服务,引导 Shell/图形化界面等等。

什么是 systemv 守护进程?
System V(缩写为 SysV)在大多数 Linux 发行版中使用最广泛,在 systemv 中,有一个第一个程序在内核加载后运行。该程序称为 init。Init 做一些事情,其中之一就是加载一系列脚本来启动各种系统服务,例如网络,ssh 守护程序等。System V 中的运行级别描述了某些状态。例如:

  • 运行级别 0:暂停
  • 运行级别 1:单用户模式
  • 运行级别 6:重新启动

systemv 的问题在于它需要仔细调整。假设您有一个要在启动时运行的网络文件系统(NFS)客户端。在网络正常工作之前运行 NFS 没有任何意义。因此,您必须确保它等待启动,直到网络已经正常工作为止。Systemv init 这样做的方法是为服务启动设置严格的顺序。每个服务都分配有一个优先级编号,init 会按优先级顺序启动服务。如果需要确保网络连接后启动服务,则必须手动为服务分配更高的优先级。这必须由某人(通常是软件包维护者)针对计算机上运行的每项服务来完成。
在这里插入图片描述
所有 System V 初始化脚本都存储在/etc/rc.d/init.d/或/etc/init.d 目录中。这些脚本用于控制系统的启动和关闭。通常,您会在这个目录找到启动 ssh 服务器或网络的脚本,使用/etc/init.d/S50sshd start 开启某个服务或者使用/etc/init.d/S50sshd stop 关闭某个服务。

什么是 systemd 守护进程?
systemd 这一名字源于 Unix 中的一个惯例:在 Unix 中常以“d”作为系统守护进程(英语:daemon,亦称后台进程)的后缀标识。除此以外,systemd 亦是借代英文术语 D 体系,而这一术语即是用于描述一个人具有快速地适应环境并解决困难的能力。

systemd 是 Linux 电脑操作系统之下的一套中央化系统及设置管理程序(init),包括有守护进程、程序库以及应用软件,由 Lennart Poettering 带头开发。其开发目标是提供更优秀的框架以表示系统服务间的依赖关系,并依此实现系统初始化时服务的并行启动,同时达到降低 Shell 的系统开销的效果,最终代替现在常用的 System V 与 BSD 风格 init 程序。目前绝大多数的 Linux 发行版都已采用 systemd 代替原来的XAXAxAXASystem V。
在这里插入图片描述
将 service(服务)、target(运行模式,类似于运行级别)、mount、timer、snapshot、path、socket、swap 等称为 Unit。比如,一个 auditd 服务(就是 auditd.service)就是一个 Unit,一个 multi-user.target运行模式也是一个 Unit,其中不同的服务通过 systemctl 来进行统一管理,例如重启一个 sshd 服务,需要执行 systemctl restart sshd 命令,同样的如果添加一个启动程序需要自己定义一个 service 服务才可以。

你可以用我们提供的 buildroot 做些什么?
快速实现自己的想法,增加自己的应用,学习了解 busybox 以及各种包是如何编译生成,用于调试内核或者应用程序等等。

3. 配置文件说明

下面介绍如何构建 100ASK_STM32MP157_PRO 全功能版的根文件系统。
在这里插入图片描述

4. 编译系统

下面以100ask_stm32mp157_pro_ddr512m_systemD_qt5_defconfig配置文件为例,说明 Buildroot 的配置编译过程:

book@100ask:~/100ask_stm32mp157_pro-sdk/Buildroot_2020.02.x$ make 100ask_stm32mp157_pro_ddr512m_systemD_qt5_defconfig
book@100ask:~/100ask_stm32mp157_pro-sdk/Buildroot_2020.02.x$ make all

在这里插入图片描述
注意:编译时需要联网,需要下载某些文件,由于机器性能不同,编译时间不同。性能差的电脑,有可能需要等待5 ~ 6个小时。

编译完成后终端提示如下图所示。
在这里插入图片描述

5. 镜像文件

编译成功后文件输出路径为 output/images
在这里插入图片描述
可以参考《第七章 烧写整个系统或更新部分系统》把上面编译出来的100ask-stm32mp157-pro-512dv1-tfa.img烧写到SD/TF卡,即可通过TF卡启动开发板进入系统。

6. 扩展学习

深入了解学习更多关于buildroot知识请参考 http://wiki.100ask.org/Buildroot

  • buildroot下进入menuconfig包选择配置配置界面
book@100ask:~/100ask_stm32mp157_pro-sdk/Buildroot_2020.02.x$ make menuconfig
  • buildroot下单独编译内核
book@100ask:~/100ask_stm32mp157_pro-sdk/Buildroot_2020.02.x$ make linux-rebuild 
  • buildroot下进入内核make menuconfig配置选项界面
book@100ask:~/100ask_stm32mp157_pro-sdk/Buildroot_2020.02.x$ make linux-menuconfig
  • buildroot下单独编译u-boot
book@100ask:~/100ask_stm32mp157_pro-sdk/Buildroot_2020.02.x$ make uboot-rebuild
  • buildroot下单独编译某个软件包
book@100ask:~/100ask_stm32mp157_pro-sdk/Buildroot_2020.02.x$ make <pkg>-rebuild
  • buildroot下进入busybox配置界面
book@100ask:~/100ask_stm32mp157_pro-sdk/Buildroot_2020.02.x$ make busybox-menuconfig
  • buildroot下生成系统sdk,最后生成的目录在output/images/目录下
book@100ask:~/100ask_stm32mp157_pro-sdk/Buildroot_2020.02.x$ make sdk

百问网技术论坛:
http://bbs.100ask.net/

百问网官方wiki(资料下载):
http://wiki.100ask.org/

线上课堂:
https://www.100ask.net/index

百问网开发板:
淘宝:https://100ask.taobao.com/
天猫:https://weidongshan.tmall.com/

技术交流群(鸿蒙开发/Linux/嵌入式/驱动/资料下载)
QQ群:869222007

单片机-嵌入式Linux交流群:
QQ群:536785813
百问科技

百问科技公众号

http://chatgpt.dhexx.cn/article/3MVBXyw4.shtml

相关文章

一文讲解Linux内核中根文件系统挂载流程

根文件系统的概念 根文件系统是控制权从linux内核转移到用户空间的一个桥梁。linux内核就类似于一个黑匣子&#xff0c;只向用户提供各种功能的接口&#xff0c;但是功能的具体实现不可见&#xff0c;用户程序通过对这些功能接口的不同整合实现不同的功能需求。以用户的角度来…

【linux kernel】挂载根文件系统之rootfs

挂载根文件系统之rootfs 文章目录 挂载根文件系统之rootfs一、开篇二、rootfs根文件系统&#xff08;2-1&#xff09;初始化rootfs&#xff08;2-2&#xff09;挂载rootfs文件系统&#xff08;2-3&#xff09;创建简单的rootfs根文件系统目录和文件&#xff08;2-4&#xff09;…

2021年Linux技术总结(三):根文件系统(rootfs)

# 一、根文件系统简介 Linux系统三大块&#xff1a;U-boot、kernel以及最后这个rootfs&#xff0c;跟文件系统。在kernel中&#xff0c;启动流程的最后会调用 prepare_namespace 函数&#xff0c;挂载根文件系统&#xff0c;这里就是挂载的本篇要说的。 根文件系统保存了内核代…

详解制作根文件系统

目录 前言 具体步骤 一.编译&#xff0f;安装busybox&#xff0c;生成/bin、/sbin、/usr/bin、/usr/sbin目录 二.利用交叉编译工具链&#xff0c;构建/lib目录 三.手工构建/etc目录 四.手工构建最简化的/dev目录 五.创建其它空目录 六.配置系统自动生成/proc目录和构建…

根文件系统理解

文件系统概念 文件系统是一些代码&#xff0c;是一套软件&#xff0c;这套软件的功能就是对存储设备的扇区进行管理&#xff0c;将这些扇区的访问变成了对目录和文件名的访问。我们在上层按照特定的目录和文件名去访问一个文件时&#xff0c;文件系统会将这个目录文件名转换成对…

linux之根文件系统

前言 1、板卡上电后首先由UBOOT启动初始化板卡&#xff0c;将Linux内核移到内存中运行 2、由linux内核自行做了初始化等操作&#xff0c;挂在了第一个应用程序上&#xff08;根文件系统/linuxrc&#xff09; 3、根文件系统会提供磁盘管理服务&#xff0c;glibc设备节点&…

Linux:根文件系统构建

文章目录 一、编译 BusyBox 构建根文件系统1.创建BusyBox路径并解压2.修改顶层Makefile3.修改 busybox 源码4.配置busybox5.编译busybox6.向 rootfs 的“/lib”目录添加库文件7.向 rootfs 的“usr/lib”目录添加库文件创建其他文件夹 二、NFS挂载根文件系统1.bootargs 环境变量…

制作嵌入式Linux根文件系统

文章目录 1. 根文件系统布局2. 使用BusyBox生成二进制工具2-1. 获取BusyBox源码2-2. 配置BusyBox2-2-1. 选择编译静态库2-2-2. 选择交叉编译工具链2-2-3. 选择安装目录2-2-4. 编译安装 3. 构建根文件系统3-1. 完善目录结构3-2. 添加C运行库文件3-3. 添加初始化配置脚本3-3-1. 修…

[架构之路-30]:目标系统 - 系统软件 - Linux OS根文件系统rootfs的概念、组成、制作以及用busybox制作根文件系统

目录 前言&#xff1a; 第1章 什么是根文件系统 1.1 什么是文件 1.2 什么是文件系统 1.3 文件系统组织文件的方式&#xff1a;树形结构 1.4 统一的虚拟文件系统 1.5 物理存储介质与物理文件系统类型 1.5 什么是根文件系统 第2章 根文件系统的标准结构 2.1 根文件系统…

安装Ubuntu 16.04时出现:没有定义根文件系统,请到分区菜单修改

在安装Ubuntu 16.04时&#xff0c;尤其是选项空闲硬盘新建分区安装时&#xff0c;容易出现这种情况&#xff0c;这个是由于没有配置挂载点导致的&#xff0c;解决方法如下&#xff1a; 在挂在点输入“&#xff0f;”。 原理&#xff1a; Linux和Windows的文件系统不一样&#x…

Ubuntu提示“没有根文件系统 ”

安装Ubuntu时,提示“没有定义根文件系统” 原因:分区错误 解决: 将Ubuntu分区,删除重新创建分区,注意挂载点为“/” 此时就可以单击“继续”,进行下一步安装 以上分区方式,是没有交换分区的,下面提供两种带交换分区的分区方式: 第一种,包含4个分区,分别为 /分区(…

安装linux显示没有定义根文件系统,XP用Wubi安装Ubuntu提示“没有定义根文件系统,请返回分区菜单...

在安装Ubuntu时&#xff0c;到自定义分区一步时&#xff0c;会出现“没有根文件系统”&#xff0c;这时千万别将硬盘分区表重建&#xff0c;那样会让硬盘到数据都格式化到&#xff0c;你只需在ext4 或者 ext3 分区项上双击&#xff0c;加上挂载点为“\”就可以了。 有图有真相&…

在虚拟机安装中遇到的问题

问题一&#xff1a;在命令行模式下输入ifconfig时&#xff0c;显示系统不能识别这个命令&#xff0c;需要安装&#xff0c;输入sudo apt install net-tools。 问题二&#xff1a;sudo命令输入密码时&#xff0c;光标不移动&#xff0c;只要输入正确密码&#xff0c;回车就可以。…

安装Ubuntu时,提示“没有根文件系统 ”

安装Ubuntu时&#xff0c;提示“没有定义根文件系统” 原因&#xff1a;分区错误 解决&#xff1a; 将Ubuntu分区&#xff0c;删除重新创建分区&#xff0c;注意挂载点为“/” 此时就可以单击“继续”&#xff0c;进行下一步安装 以上分区方式&#xff0c;是没有交换分区的&a…

synchronized,voliate-详解

一.synchronized底层原理: synchronized关键字&#xff0c;在底层编译后的jvm指令中&#xff0c;会有monitorenter(枷锁)和monitorexit(释放锁)两个指令. monitorenter指令执行的时候会干什么呢? 每个对象都有一个关联的monitor&#xff0c;比如一个对象实例就有一个monitor…

volatile的作用及原理

前言 voliate关键字的两个作用&#xff1a; 1、 保证变量的可见性&#xff1a;当一个被volatile关键字修饰的变量被一个线程修改的时候&#xff0c;其他线程可以立刻得到修改之后的结果。当一个线程向被volatile关键字修饰的变量写入数据的时候&#xff0c;虚拟机会强制它被值刷…

voliate和synchronized

线程安全考虑三个方面&#xff1a;原子性&#xff0c;可见性&#xff0c;有序性 为什么使用voliate关键字&#xff1f; 正常情况下编译器为了加快程序运行的速度,对一些变量的写操作会先在寄存器或者是CPU缓存上进行,最后才写入内存.而在这个过程,变量的新值对其他线程是不可…

关于voliate关键字

现象 private static boolean is false;public static void main(String[] args) {new Thread(new Runnable() {Overridepublic void run() {System.out.println("thread 1 start");while (!is) {}System.out.println("thread 1 end");}}).start();try {T…

并发专题之---Voliate引发的各种原理问题

文章目录 前言JMMvoliate不保证原子性不保证原子性的解释AtomicInteger解决不保证原子性的问题为什么AtomicInteger可以解决原子性问题?CASCAS的内部原理CAS的缺点ABA问题原子引用解决ABA问题 禁止指令重排多线程环境下单例模式出现的问题双端检索机制解决办法双端检索机制的隐…

voliate类型的原理及用法

voliate类型&#xff0c;机器才读取执行代码读取内存后&#xff0c;将读取的内容存到高速缓冲区里&#xff0c;在硬件里是寄存器&#xff0c;这样在一下次读取的时候就可以直接从高速缓存区里面读取&#xff08;cache&#xff09;,这也是读取速度加快的原因&#xff0c;但是如果…