一、导读
本文描述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/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控制
+关注
关注
10文章
460浏览量
40018 -
LINUX内核
+关注
关注
1文章
316浏览量
21609 -
gcc编译器
+关注
关注
0文章
78浏览量
3349
原文标题:buildroot使用笔记-03 | 系统初始化的三种方式和buildroot的工作方式
文章出处:【微信号:嵌入式小生,微信公众号:嵌入式小生】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
相关推荐
评论