一、导读

本文描述buildroot中支持的三种系统初始化方式以及buildroot在实际构建过程中是如何工作的。

二、系统初始化的三种方式

我们已经知道,在linux内核启动后期会尝试加载用户空间的init程序,init程序是由内核启动的第一个用户空间程序(PID为1),该程序负责启动用户空间的服务和程序(例如:Web服务、图形应用程序、其他网络服务等)。

在使用buildroot构建linux根文件系统时,其支持三种不同类型的初始化系统,可以在“System configuration”选项下的“Init system”选择项中进行选择:

(1)第一种是“BusyBox”

BusyBox 实现了基本的 init 程序,对于大多数嵌入式系统而言,选择这种方式已经足够了。启用“BR2_INIT_BUSYBOX”将确保 BusyBox 会生成并安装其 init 程序,这是 Buildroot 的默认解决方案。

BusyBox init程序会在启动时去读取/etc/inittab文件。除了挂载一些重要的文件系统之外,默认的 inittab 的主要工作是启动/etc/init.d/rcSshell脚本,并启动一个 getty 程序(用于提供登录提示)。

(2)第二种是“systemV”

该种解决方案使用传统的sysvinit程序,位于Buildroot目录package/sysvinit中,在UpstartSystemd出现之前,这是大多数桌面Linux发行版使用的解决方案。Sysvinit同样使用inittab文件(其语法与 BusyBox 中的语法略有不同)。与此init解决方案一起安装的默认inittab 位于package/sysvinit/inittab中。

(3)第三种是“systemd”

systemd是用于Linux的新一代init系统。它的功能远远超过传统的init程序:强大的并行处理能力、使用socket和D-Bus激活启动服务、按需启动守护程序、使用Linux控制组跟踪进程、支持对系统状态进行快照和还原等等。

systemd在相对复杂的嵌入式系统上很有用,例如:需要D-Bus和服务之间相互通信的系统。值得注意的是systemd会带来了大量的大型依赖项,例如dbusudev等。

三、buildroot如何工作

本小节描述buildroot的工作机制。

在《buildroot使用笔记-01 | 常规使用步骤》一文中,对buildroot的目录结构进行了分析,可以明确知道:buildroot基本上是一组Makefile文件,这些文件可以对所需软件进行下载、配置和编译。除此之外,buildroot中还包含了各种软件包的补丁:主要是那些涉及交叉编译工具链的软件包,例如:gcc、binutils和uClibc等。

对于软件包来说,每个软件包基本上只有一个Makefile文件,它们yi.mk扩展名进行命名。在buildroot中,Makefile分成许多不同的部分:

  • toolchain/目录包含与交叉编译工具链相关的所有软件的Makefile和相关文件:binutils、gcc、gdb、kernel-header 和 uClibc。
  • arch/目录包含 Buildroot 支持的所有处理器体系架构的定义。
  • package/目录包含所有用户空间工具和库(Buildroot 可以将它们编译并添加到目标根文件系统)的 Makefile 和相关文件,每个软件包都有一个子目录。
  • linux/目录包含 Linux 内核的 Makefile 和相关文件。
  • boot/目录包含 Buildroot 支持的 Bootloader 的 Makefile 和相关文件。
  • system/目录包含对系统集成的支持,例如目标文件系统框架 skeleton 和 init 系统的选择。
  • fs/目录包含与生成目标根文件系统镜像有关的软件的 Makefile 和相关文件。

每个目录至少包含2个文件:

  • xxx.mk 是用于下载、配置、编译和安装软件包的Makefile。

  • Config.in 是配置工具描述文件的一部分,用于描述与软件包相关的选项。

在buildroot配置完成后,主Makefile执行的具体操作步骤如下:

(1)创建所有的输出目录:staging、target、build 等(默认在output/目录中,我们可以使用“O=”
来指定另一个路径)。

(2)生成工具链目标。当使用内部工具链时,这意味着将生成交叉编译工具链。当使用外部工具链时,这意味着将检查外部工具链的功能并将其导入到Buildroot环境中。

(3)生成TARGETS变量中列出的所有目标。该变量由所有单个组件的 Makefile 填充。生成这些目标时将触发用户空间软件包(库、程序集)、内核、引导加载程序的编译以及根文件系统镜像的生成,在生成的过程中,会联网命中、下载所需要的软件包,然后对其进行编译构建。在编译构建过程中,单个操作步骤一般会显示对应的下载进度提示,过程进度提示等。在执行对应的操作时,都会有相应的提示,类似于下图所示的信息:

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐