Archlinux上Buildroot的基础使用
什么是Buildroot?好吃么?
Buildroot是一套用于构建定制化rootfs环境的工具集,可以通过简单步骤在嵌入式系统上快速构建rootfs环境用于应用部署。
为什么选择Buildroot?和发行版rootfs的区别是?
1. 架构支持广泛
大多数发行版rootfs只支持常见主流架构,不仅如此,发行版在架构支持方面本着兼容性原则,即便是支持的架构,最终依然会牺牲一部分性能(Hard Float,Architecture Specific的SIMD指令集支持等),Buildroot则可以自由选择工具链及编译参数,并且指定所需要的优化选项进行构建。
2. 体积小,工作稳定
发行版为了保证易用性,通常加入了大量功能与程序便于用户使用,同时为了开箱即用的特征,在网络配置等关键环节也会使用NetworkManager等高级工具进行管理,Init系统也大多使用Systemd,增大了系统的复杂程度,同时不可避免的要产生文件写入等操作,加速Flash等存储设备寿命损耗,降低设备使用年限。Buildroot则避免了上述种种问题,单一稳定的网络配置,可选的DHCP等组件,Busybox轻量级的初始化系统及CoreUtils,可以只读的文件系统支持都使得它对于小体积Flash,低写入寿命,长时间工作的嵌入式系统极其友好。
3. 定制程度高,配置简单
不需要使用包管理器,基于Kconfig的编译配置系统,软件支持也很齐全,只需要选择所需工具就可以构建上机即用的rootfs。
获取Buildroot及工具链
0. 了解硬件平台
为了构建出我们需要的可用的rootfs,我们首先需要了解我们的硬件平台。
本文来自之前为 LoRaWAN 网关设计平台的过程中,我们选用了全志V3s这款SoC,LQFP封装,内嵌512Mbit DDR2 SDRAM,单核Cortex-A7 w/ NEON,很适合我们需要的场景使用。
1. 获取Buildroot
Buildroot的最新版本可以从 https://buildroot.org/download.html 下载tarball。
2. 获取工具链
Archlinux默认工具链及AUR提供的交叉工具链都是无法复制使用的,Buildroot在构建时会将工具链复制到工作目录执行,因此我们需要选择Portable的工具链二进制或者像我一样选择 The Hard Way - crosstool-NG编译工具链。
2.1 crosstool-NG的使用及工具链构建
crosstool-NG(以下简称 ct-ng )是一个快速简易构建工具链的工具(没错够绕嘴的),可以用于完成以下几个主要步骤
- 构建 buildutils
- 构建 3-Stage Cross GCC 及对应的C Library
- 构建 Cross-GDB
2.1.1 ct-ng 获取及编译
部分发行版可能打包了crosstool-NG,Archlinux并没有打包,而且为了使用新版本工具链及配置,推荐跟随文档使用如下的编译安装方式。
首先我们需要从 https://crosstool-ng.github.io 获取最新版本的ct-ng(Git/Tarball),解压后进入项目目录,跟随 https://crosstool-ng.github.io/docs/install/ 的步骤,执行 bootstrap
,选择合适prefix,编译并安装( make
与 make install
想必你们用得比我熟)。
现在我们可以使用 ct-ng
命令了,不过不要急着试试,因为这东西会在当前目录创建一些配置文件,所以我们要新建一个工作目录用于 ct-ng 保存配置及文件。
本次目录名叫 arm-linux-glibc ,字面意思:target 是 32-bit 的 ARM 处理器,操作系统 Linux ,C标准库使用GNU LibC实现,因为 AUR 中的工具链一样使用了 GlibC,方便日后交叉编译使用(但是其实可以完全一套工具链跑到黑)。
在工作目录中,运行 ct-ng list-samples
可以查看当前的所有sample列表,这里我们选用 arm-unknown-linux-gnueabi 作为我们的预设target,之后的步骤基于这个配置修改。
运行 ct-ng arm-unknown-linux-gnueabi
配置当前工程, ct-ng nconfig
使用酷炫的 nurses 配置界面修改配置。