描述buildroot中支持的三种系统初始化方式

描述

一、导读

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

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

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

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

PID控制

(1)第一种是“BusyBox”

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

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

(2)第二种是“systemV”

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

(3)第三种是“systemd”

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

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

buildroot如何工作

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

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

对于软件包来说,每个软件包基本上只有一个Makefile文件,它们以.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会生成交叉编译工具链。当使用外部工具链时,这意味着将检查外部工具链的功能并将其导入到Buildroot环境中。

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

PID控制






审核编辑:刘清

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分