导读:前面《《基于Buildroot的 Linux 系统构建之快速通关》》介绍了Buildroot构建系统快速入手的一些基本操作,《《基于Buildroot直接进行内核配置》》主要介绍了在Buildroot中如何直接进行内核配置裁剪,作为嵌入式Linux,根文件系统的配置构建除内核之外最为复杂亦是最为重要的部分。本文分析记录使用过程中的一些浅见,或有疏漏错误之处,请交流指出,不胜感激。
1.根文件系统
通常而言文件系统是操作系统对 存储 介质(磁盘或闪存等)的进行管理,实现存储对象文件式的访问管理的软件。主要实现介质管理、文件的读写访问、应用 接口 、权限管理等功能。当然严格讲这么描述是有问题,比如VFS虚拟文件系统。Anyway,这不是本文要讨论的重点,随它去吧。引入只为理解方便。
那么何为根文件系统呢?它是一种文件系统,其关键点在于这个“根”,是指内核启动后加载的第一个文件系统,内核代码映像保存在根文件系统中,而系统引导启动程序会在根文件系统挂载之后从中把一些基本的初始化脚本和服务等加载到内存中去运行。引自《《百度百科》》
下图是Ubuntu的根文件系统样式。
2.1 拷贝根文件系统骨架skeleton至$TARTGET_DIR
基本的Linux根文件系统是Unix文件夹目录层次结构,skeleton是构建根文件系统的基础。
skeleton配置入口:
Sys te m configura ti on ---》Root FS skeleton
sekleton可以配置为默认样式
skeleton为于。/system/skeleton下:
inittab 的语法:
《id》::《runlevels》:《ac TI on》:《process》
id,用于指定串口控制台名,需与实际对应,如为空则指/dev/console
runlevels,BusyBox不支持这个属性,如设置则忽略
ac TI on:
sysinit,运行当init启动时在执行其他操作之前的程序,如加载文件系统等
respawn,用于运行程序并在终止时重启这个程序,常用于控制一个程序以守护进程运行
askfi rs t,如其名(ask first then run),作用同respawn,不同的是需要用户交互式确认,用户需要输入回车进行运行确认。它用于在终端上启动交互式shell,而不提示输入用户名或密码。
once,如其名,仅在开机启动时运行一次所控制的程序,该程序终止后也不会重启这个程序
w ai t,用于运行程序并等待其完成后才执行后续操作。如可以用这个命令运行一些同步完成的操作。
restart,用于运行当init接收到SIGHUP信号时所需运行的程序,并指示inittab需要重新加载
ctrlaltdel,用于当init接收到SIGINT信号时所需要运行的程序,中断信号通常在启动阶段会由Ctrl+Alt+Del发出。
shutdown,用于当init接收到关机命令所需运行的程序。这个是由于init进程一直驻留后台运行。
process,上述ac TI on控制需要运行的程序,如mount,swapoff等等。
2.1.2 systemV init
BusyBox是一个精简版本的systemV init系统,想对于BusyBox,systemV init有两个优势:
首先,启动脚本是以 模块化 格式编写的使在构建时或运行时添加新软件包变得容易。
其次,它具有运行级别的概念,它允许启动一系列程序或从一个运行级别切换到另一个运行级别时,立即停止。
支持8个运行级别(0-6以及S级别):
各级别的作用:
S,运行启动程序使用
0,停止系统
1-5,作为通用使用
6,重启系统使用
2.1.3 systemd init
systemd 是于2010年由Lennart Poettering和Kay Sievers创建的一套集成工具,用于基于init守护程序管理Linux系统。包括设备管理(udev)和日志记录等。systemd是最新技术,并且仍在迅速发展。它在桌面和服务器Linux发行版中很常见。这里对具体机制细节不做描述,我也没研究过。
2.2 构建安装软件包
软件包部署安装一般包括以下一些步骤:
将构建所有配置需构建的目标软件包
如Busybox,Qt,OpenSSH,lighttpd等
其中大多数将在$(TARGET_DIR)中安装文件:程序,库,字体,数据文件,配置文件等。
2.3 运行cleanup
这一步咋一看不明所以,为啥要清理。安装完所有软件包后,将执行清除步骤以减小根文件系统的大小。主要涉及:
删除头文件,pkg-config文件,CMake文件,静态库,手册页和说明文件。
使用strip 剥离 所有程序和库,以删除不需要的信息。
取决于BR2_ENABLE_DEBUG和BR2_STRIP_ *选项。
其他特定的清理步骤:使用 Python 时清理不需要的Python文件等。请参阅Buildroot代码中的TARGET_FINALIZE_HOOKS。
2.4 拷贝根文件系统覆盖
要自定义根文件系统的内容,如添加配置文件,脚本,符号链接,目录或任何其他文件,一种可能的解决方案是使用根文件系统重载。
根文件系统覆盖只是一个目录,在安装了所有软件包之后,其内容将复制到根文件系统中。允许覆盖文件。
选项BR2_ROOTFS_OVERLAY包含以空格分隔的叠加路径列表。
那么实际操作咋整?可以将默认构建的根文件系统挂载进行调试,如需要修改某部分的内容修改好,并将该文件夹拷贝出来,在Buildroot配置项将重载开启,重载路径指向该文件夹,Buildroot将在构建过程中自动复制该内容覆盖对应的部分。
2.5执行post-build脚本
如根文件系统覆盖还不够满足要求,此时可以考虑使用post-build脚本来做补充,常常用来完成下面类似的需求:
可用于自定义现有文件,删除不需要的文件以节省空间,添加动态生成的新文件(构建日期等)
在创建根文件系统映像之前执行。 可以用任何语言编写,经常使用shell脚本。
BR2_ROOTFS_POST_BUILD_SCRIPT包含以空格分隔的后生成脚本路径列表。
$(TARGET_DIR)路径作为第一个参数传递,其他参数可以在BR2_ROOTFS_POST_SCRIPT_ARGS选项中传递。
相关的环境变量:
BR2_CONFIG,Buildroot.config文件的路径
HOST_DIR,STAGING_DIR,TARGET_DIR,BUILD_DIR,BINARIES_DIR,BASE_DIR
关于根文件系统还有权限表、用户表、设备表、设备管理以及映象文件如何部署等.