LV05-04-rootfs-01-Buildroot简介

本文主要是rootfs——Buildroot简介的相关笔记,若笔记中有错误或者不合适的地方,欢迎批评指正😃。

点击查看使用工具及版本
PC端开发环境 Windows Windows11
Ubuntu Ubuntu20.04.2的64位版本
VMware® Workstation 17 Pro 17.6.0 build-24238078
终端软件 MobaXterm(Professional Edition v23.0 Build 5042 (license))
Win32DiskImager Win32DiskImager v1.0
Linux开发板环境 Linux开发板 正点原子 i.MX6ULL Linux 阿尔法开发板
uboot NXP官方提供的uboot,使用的uboot版本为U-Boot 2019.04
linux内核 linux-4.19.71(NXP官方提供)
点击查看本文参考资料
分类 网址 说明
官方网站 https://www.arm.com/ ARM官方网站,在这里我们可以找到Cotex-Mx以及ARMVx的一些文档
https://www.nxp.com.cn/ NXP官方网站
https://www.nxpic.org.cn/NXP 官方社区
https://u-boot.readthedocs.io/en/latest/u-boot官网
https://www.kernel.org/linux内核官网
点击查看相关文件下载
分类 网址 说明
NXP https://github.com/nxp-imx NXP imx开发资源GitHub组织,里边会有u-boot和linux内核的仓库
nxp-imx/linux-imx/releases/tag/v4.19.71 NXP linux内核仓库tags中的v4.19.71
nxp-imx/uboot-imx/releases/tag/rel_imx_4.19.35_1.1.0 NXP u-boot仓库tags中的rel_imx_4.19.35_1.1.0
I.MX6ULL i.MX 6ULL Applications Processors for Industrial Products I.MX6ULL 芯片手册(datasheet,可以在线查看)
i.MX 6ULL Applications ProcessorReference Manual I.MX6ULL 参考手册(下载后才能查看,需要登录NXP官网)
Source Code https://elixir.bootlin.com/linux/latest/source linux kernel源码
https://elixir.bootlin.com/u-boot/latest/source uboot源码

一、Buildroot简介

1. Buildroot是什么?

Buildroot是一个简单,高效且易于使用的工具,可通过交叉编译生成嵌入式Linux系统。你可以很容易为你的目标系统构建交叉编译工具链、根文件系统、uboot以及Linux内核镜像,Buildroot可以独立的实现其中的一个或几个功能。Buildroot对于嵌入式开发人员来说是一个非常好用的工具,因为嵌入式不像x86平台(PC)一样硬件基本是统一的,嵌入式平台的硬件是根据需求进行裁剪,而不同的硬件对应的程序必然是不同,所以使用Buildroot来配置是一个非常好的选择。

整个Buildroot是由 Makefile脚本和Kconfig配置文件构成的,用户可以和编译Linux内核一样,通过config文件进行配置要编译的参数,也可以通过 make menuconfig 等界面进行修改,然后通过make命令编译出一个完整的,可以直接烧写到开发板上运行的Linux系统软件(如 uboot、zimage、dtb 已及文件系统)。

更重要的是Buildroot可以很方便添加第三方的编译源码并且编译,很多工具链、源码都可以从Buildroot社区下载,用户也可以让Buildroot 从本地导入源码并,这就为我们的开发带来极大的便利,当需要从网上下载时,Buildroot自动可以帮我们下载,当在本地修改后,又可以直接使用Buildroot编译,它实现了工具链下载、解压、依赖包下载编译等一系列机械化的流程,对开发者非常友好。

2. 官网?

Buildroot的官方网站是:Buildroot - Making Embedded Linux Easy,我们可以打开官网然后下载我们需要的Buildroot工具,各个版本下载地址在这里:Index of /downloads/ (buildroot.org)

image-20241102185232514

目前最最新的应该是主页的这个版本:

image-20241102185334878

我们可以选择这个版本的Buildroot作为我们的编译工具即可,虽然Buildroot一直在更新,但是无论是哪个版本基本都是差不多的。除此之外Buildroot还有非常详细的文档说明,可以在Documentation页面下浏览与下载,当然野火提供的资料中也会存在Buildroot的文档说明buildroot-manual.pdf文件,具体见:Buildroot - Making Embedded Linux Easy

二、获取源码

1. 源码下载

这个没什么好说的,直接下载就是了,我这里直接下最新的好了:

1
2
cd ~/7Linux
wget -c https://buildroot.org/downloads/buildroot-2024.08-rc3.tar.gz

2. 解压压缩包

1
tar xf buildroot-2024.08-rc3.tar.gz

然后我们会得到以下文件:

image-20241102185928918

三、Buildroot目录简介

  • arch:存放CPU架构相关的配置脚本,如arm、mips、x86等,这些与CPU相关的脚本在Buildroot制作编译工具链、编译uboot时起关键作用。
  • board:针对不同硬件平台的特有配置文件、脚本与补丁。
  • boot:存放的是引导系统相关的配置文件。
  • configs:这里存放的是一些针对不同硬件平台的特有配置文件合集(xxxx_deconfig),我们在开发过程中为自己开发板配置的文件也可以放入该目录下。
  • docs:存放相关的参考文档。
  • fs:存放各种文件系统的配置相关的文件,比如ext2、yassf2等。
  • linux:存放着Linux 内核的自动构建脚本。
  • package:该目录下存放着应用软件包的配置文件,每个应用软件包的配置文件有Config.in和xxxx.mk以及一些补丁文件,其中xxxx.mk文件可以去下载对应名字的应用软件包,这个文件其实就是Makefile脚本的自动构建脚本,根据文件中的描述去下载。
  • support:一些Buildroot支持相关的配置文件,比如docker、kconfig、下载辅助工具、补丁等。
  • system:这里就是根目录的主要骨架,以及启动的初始化配置文件,当制作根目录时就是将此处的文件拷贝到output目录下,然后再下载安装工具链的动态库和用户勾选的package。
  • toolchain:该目录主要存放编译交叉工具的配置文件。
  • utils:存放Buildroot一些通用工具。
  • dl:虽然一开始并没有dl(download)目录,但是在开始使用Buildroot后,会自动生成一个dl目录,它主要用于存放Buildroot工具下载的内容,因为Buildroot是一系列工具的管理集合,它本身并不存在这些编译工具,所以在使用时它自动会下载需要的工具,比如交叉编译器、依赖的库、以及一些软件源码包等(以压缩包的形式存放,Buildroot在使用时会自动解压),都会放在dl目录下。当有时候因为网络问题下载一些包失败的时候,我们可以手动下载,然后吧包放在这里面也是可以的。
  • output:虽然一开始Buildroot也并没有output目录,但是在开始使用Buildroot后,就会自动生成output目录,它是编译出来的输出文件夹,里面存放着解压后的各种软件包编译完后的现场。同时output目录下还有各种文件夹,如host文件夹是由各类源码编译后在主机上运行工具的安装目录,如arm-linux-gcc就是安装在这里;build文件夹是所有源码包解压出来的文件存放地和编译的发生地;images文件夹则是在我们编译完成后存放uboot、内核镜像、设备树以及文件系统等结果的。

四、系统特征

1. 什么是 init 系统服务?

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

2. 什么是 systemv 守护进程?

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

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

systemv 的问题在于它需要仔细调整。假设我们有一个要在启动时运行的网络文件系统( NFS)客户端。在网络正常工作之前运行 NFS 没有任何意义。因此,我们必须等待网络已经正常工作,才能启动 systemv。 Systemv init 这样做的方法是为服务启动设置严格的顺序。每个服务都分配有一个优先级编号, init 会按优先级顺序启动服务。如果需要确保网络连接后启动服务,则必须手动为服务分配更高的优先级。这必须由某人(通常是软件包维护者)针对计算机上运行的每项服务来完成。

所有 System V 初始化脚本都存储在/etc/rc.d/init.d/或/etc/init.d目录中。这些脚本用于控制系统的启动和关闭。通常,我们会在这个目录找到启动ssh 服务器或网络的脚本, 可以手工执行它们。比如使用“ /etc/init.d/S50sshd start” 开启 ssh 服务, 使用“ /etc/init.d/S50sshd stop” 关闭 ssh 服务。

3. 什么是 systemd 守护进程?

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

systemd 是 Linux 电脑操作系统之下的一套中央化系统及设置管理程序( init),包括有守护进程、程序库以及应用软件,由 Lennart Poettering 带头开发。其开发目标是提供更优秀的框架以表示系统服务间的依赖关系,并依此实现系统初始化时服务的并行启动,同时达到降低 Shell 的系统开销的效果,最终代替现在常用的 System V 与 BSD 风格的 init 程序。 目前绝大多数的 Linux发行版都已采用 systemd 代替原来的 System V。

image-20241104073620956

将 service(服务)、 target(运行模式,类似于运行级别)、 mount、 timer、snapshot、 path、 socket、 swap 等称为 Unit。比如,一个 auditd 服务(就是 auditd.service)就是一个 Unit,一个 multi-user.target 运行模式也是一个 Unit,其中不同的服务通过 systemctl 来进行统一管理,例如重启一个sshd 服务,需要执行 systemctl restart sshd 命令,同样的如果添加一个启动程序需要自己定义一个 service 服务才可以。