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

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
百问科技

百问科技公众号

猜你喜欢

转载自blog.csdn.net/thisway_diy/article/details/110081976
今日推荐