根文件系统为用户空间提供程序、动态加载器、库、配置和设备访问入口。本文围绕原来的 F1C100S / ARM926EJ-S、Buildroot 2018.02.11 实验解释选择过程。2018 年的版本和截图用于追溯旧实验,新项目应使用与所选 BSP 配套且仍适合维护的版本。
rootfs、initramfs 与用户空间
跳转到“rootfs、initramfs 与用户空间”Linux 的初始 rootfs 是内存中的特殊文件系统实例;内核可以将 initramfs 解包到其中。若找到可执行的 /init,它可以作为 PID 1 负责后续启动,也可以切换到另一根文件系统。没有这样的 initramfs 用户程序时,内核还可以按启动参数挂载目标根分区,并执行 /sbin/init 等程序。
因此,不必先在「虚拟文件系统里运行所有核心进程」再挂载 TF 卡。最终根文件系统也未必来自硬盘或 eMMC,它可以来自 initramfs、网络或其他受支持介质。普通交互式系统至少需要能执行的初始化程序及其依赖;存在一个空目录并不足以得到 shell。Linux rootfs / initramfs 文档 说明了这几条启动路径。
BusyBox 与 Buildroot 各自负责什么
跳转到“BusyBox 与 Buildroot 各自负责什么”BusyBox 将许多常用命令组合进一个可执行程序,也可提供 shell 和 init。Buildroot 则是系统构建工具:它可以构建或导入工具链,构建 BusyBox 及其他软件,最后生成指定格式的 rootfs,还可按配置构建内核与 Bootloader。两者可以配合使用。
rootfs 体积取决于包选择、C 库、调试信息、资源文件和链接方式,不能仅归因于「用 BusyBox」或「GCC 7.2 的库很大」。静态库 .a 通常服务于链接过程,静态可执行程序不会在启动时加载这些归档。动态程序则需要匹配的动态加载器和共享库。Buildroot 的统一配置能减少不匹配,但不能保证任意架构选项或外部工具链都正确。
Target options:先匹配 CPU 和 ABI
跳转到“Target options:先匹配 CPU 和 ABI”
| 截图选项 | 该实验的含义 |
|---|---|
| ARM little endian | 目标为小端 ARM |
| ELF | 可执行文件格式;原记录的「EFL」是拼写错误 |
arm926t | 对应 ARM926EJ-S 一类目标,具体选项名称由该 Buildroot 版本提供 |
| VFP disabled | 该实验按无 VFP 的目标配置;不能只凭 ARM 内核系列名称推断具体 SoC 配有浮点单元 |
| EABI、Soft float | 采用相应 ABI 与软件浮点策略,应用、库和工具链必须一致 |
| ARM instruction set | 原实验选择 ARM 指令状态 |
EABI 不表示 hard-float 与 soft-float 库可以随意互连;浮点调用约定仍要匹配,GCC ARM 选项 明确区分 soft、softfp 与 hard。Thumb 也不是 Cortex-M 专属,ARM926EJ-S 支持早期 Thumb 指令;该版本 ARM 配置 同时标明了 Thumb 支持和 VFP 是否集成的区别。保留原实验的 ARM 选择,不需要用错误的架构概括来解释它。
Build options:保存配置与控制产物
跳转到“Build options:保存配置与控制产物”
Location to save buildroot config 指定保存精简配置的位置,并不意味着该文件已经被加载作为当前配置。实际构建读取 .config;可用 make savedefconfig 保存适合版本管理的配置。下载目录保存源码包等下载结果,便于后续重建时复用。
原图选择 both static and shared。在 2018.02.11 的配置定义中,这表示构建静态库和共享库,默认动态链接可执行文件;它会增加构建开销,不代表所有归档都应放进目标文件系统。只选择应用真正需要的库方式。该版本配置源文件 可用于核对选项语义。
Toolchain:内部构建和外部导入
跳转到“Toolchain:内部构建和外部导入”
内部工具链由 Buildroot 按配置构建;外部工具链则必须正确声明路径、前缀、C 库和支持特性。两者都可用,但不能把开发主机的库当作目标库,也不能把任意厂商 SDK 的整个 sysroot 当作可导入的纯工具链。
原图展示了 uClibc-ng、4.15 系列头文件、GCC 6.x 与 binutils 2.29.1,这是当时配置。工具链使用的用户空间内核头文件不要求与运行内核补丁版本完全相同,但不能假设较新接口一定存在于较旧运行内核。切换架构或工具链通常需要干净重建。2018.02.11 工具链说明 记录了这些条件。
若应用使用 Qt,需要满足相应 Qt 包的 C++、线程、图形等依赖。截图同时勾选 Fortran、LTO、OpenMP、graphite,不代表它们都是 Qt 的必要条件;依包帮助与实际应用选择,不能把「全部勾选」当作通用配置。
System configuration 与登录
跳转到“System configuration 与登录”
这部分配置主机名、横幅、init、设备节点管理和串口登录等。rootfs 中的 getty 串口设备与内核控制台需要和板卡匹配。截图保留了原实验允许 root 登录、密码留空的选择;它用于隔离的本地串口实验,不能作为接入网络设备的默认账号方案。
构建与部署产物
跳转到“构建与部署产物”在已准备好依赖的 Buildroot 2018.02.11 源码目录内,以普通用户运行:
make menuconfigmake savedefconfigmake这个历史版本不支持顶层 make -jN 并行构建,包内并行由 BR2_JLEVEL 控制;所以原文「不要多核编译」应改为这个精确条件。切换目标架构或工具链之前保存配置,按该版本要求清理重建,不需要每次进入配置菜单都先 make clean。本文未重新完成 2018.02.11 全系统构建。该版本快速入门 给出了构建方式和输出目录含义。
| 目录 | 用途 |
|---|---|
output/images/ | 可部署的 rootfs、内核或其他已配置镜像 |
output/build/ | 各组件构建目录 |
output/host/ | 构建主机所用工具与工具链 |
output/staging/ | 目标开发所用头文件和库等,不作为成品 rootfs |
output/target/ | 目标文件树的中间状态,权限和设备节点等尚不能直接视为最终镜像 |
若启用了 tar 格式,使用 output/images/rootfs.tar,原记录中的 out/images 是路径笔误。把归档部署到已确认挂载在正确目标分区上的空根目录时,要保留数字 UID/GID、权限、符号链接和设备节点;不能用普通拖拽复制替代这些语义。tar 只解包,不负责分区或格式化。随后核对内核 root=、rootfs 文件系统驱动和 /sbin/init,从串口确认启动;这里未声称本次已完成板上启动。
二次修改如何保持可重建
跳转到“二次修改如何保持可重建”长期修改优先写入版本管理的 rootfs overlay 或 post-build 脚本,再重新生成镜像。overlay 适合放配置与小文件;post-build 脚本适合需要程序处理的修改。只修改 output/target/ 适合临时试验,清理后会丢失。Buildroot rootfs 定制说明 给出了这两种方式。
原来的 sudo chroot rootfs qume-user-status 不是有效的通用命令。chroot 改变根目录,不转换 CPU 指令集;在 x86 主机上运行 ARM 用户程序,需要相应 QEMU user-mode 模拟、正确解释器/注册方式及目标动态库。编辑文本配置本身无需运行目标程序。若只是给 Buildroot 加文件或应用,优先回到 overlay 与配方,避免把难以追踪的手工修改当成交付过程。