Skip to content

LV050-Buildroot简介

一、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-20260112203136214

当时写笔记的时候,主页最新版本为 2024.08.1还有rc3这几个版本。我们可以选择这个版本的 Buildroot 作为我们的编译工具即可,虽然 Buildroot 一直在更新,但是无论是哪个版本基本都是差不多的。除此之外 Buildroot 还有非常详细的文档说明,可以在 Documentation 页面下浏览与下载,具体见:Buildroot - Making Embedded Linux Easy

二、获取源码

1. 源码下载

这个没什么好说的,直接下载就是了,我这里下了个2024.08-rc3版本:

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

2. 解压压缩包

shell
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 服务才可以。