Archlinux上Buildroot的基础使用
如何使用Buildroot为自己量身定制Rootfs
什么是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+FPv4,很适合我们需要的场景使用。
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-cortex_a15-linux-gnueabihf 作为我们的预设target,之后的步骤基于这个配置修改。选择这个配置的原因是,Cortex-A7与Cortex-A15都基于ARMv7-A,同时都使用FPv4浮点处理器和NEON SIMD指令。
运行 ct-ng arm-cortex_a15-linux-gnueabihf
配置当前工程, ct-ng nconfig
使用酷炫的 nurses 配置界面修改配置。
多数配置不需要更改,可以添加tarball cache以节约下载时间。
.config - crosstool-NG Configuration ┌── Paths and misc options ───────────────────────────────────────────────────────────────────────────────┐ │ │ │ *** crosstool-NG behavior *** │ │ [ ] Use obsolete features │ │ [ ] Try features marked as EXPERIMENTAL │ │ [ ] Debug crosstool-NG │ │ *** Paths *** │ │ (${HOME}/Softwares/Crosstool-NG/tarballs) Local tarballs directory │ │ [*] Save new tarballs │ │ [ ] Prefer buildroot-style layout of the downloads │ │ (${CT_TOP_DIR}/.build) Working directory │ │ (${CT_PREFIX:-${HOME}/x-tools}/${CT_HOST:+HOST-${CT_HOST}/}${CT_TARGET}) Prefix directory │ │ [*] Remove the prefix dir prior to building │ │ [*] Remove documentation │ │ [*] Install licenses │ │ [*] Render the toolchain read-only │ │ [*] Strip host toolchain executables │ │ [ ] Strip target toolchain executables │ │ *** Downloading *** │ │ Download agent (wget) ---> │ │ [ ] Forbid downloads │ │ [ ] Force downloads │ │ (10) Connection timeout │ │ (--passive-ftp --tries=3 -nc --progress=dot:binary) Extra options to wget │ │ [ ] Stop after downloading tarballs │ │ [ ] Use a mirror │ │ [*] Verify download digests (checksums) │ │ Digest algorithm (SHA-512) ---> │ │ [ ] Verify detached signatures │ │ │ │ │ └F1Help─F2SymInfo─F3Help 2─F4ShowAll─F5Back─F6Save─F7Load─F8SymSearch─F9Exit──────────────────────────────┘
一切准备就绪就可以运行ct-ng build,在x-tools就可以拿到我们的工具链了。
配置编译Buildroot
Buildroot的配置与Crosstool-NG类似,也使用了Kconfig及Kbuild。解压下载得到的tar包,进入目录运行make nconfig即可看到相似的配置界面。
┌── Target options ───────────────────────────────────────────────────────────────────────────────────────┐ │ │ │ Target Architecture (ARM (little endian)) ---> │ │ Target Binary Format (ELF) ---> │ │ Target Architecture Variant (cortex-A7) ---> │ │ Target ABI (EABIhf) ---> │ │ Floating point strategy (NEON/VFPv4) ---> │ │ ARM instruction set (ARM) ---> │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ └F1Help─F2SymInfo─F3Help 2─F4ShowAll─F5Back─F6Save─F7Load─F8SymSearch─F9Exit──────────────────────────────┘
我们在Target Options中选择我们CPU的类型,Cortex-A7,硬浮点,NEON/VFPv4。
┌── Toolchain ────────────────────────────────────────────────────────────────────────────────────────────┐ │ │ │ Toolchain type (External toolchain) ---> │ │ *** Toolchain External Options *** │ │ Toolchain (Custom toolchain) ---> │ │ Toolchain origin (Pre-installed toolchain) ---> │ │ (/home/imi415/Softwares/Crosstool-NG/arm-cortex_a15-linux-gnueabihf/arm-cortex_a15-linux-gnueabi │ │ (arm-cortex_a15-linux-gnueabihf) Toolchain prefix │ │ External toolchain gcc version (9.x) ---> │ │ External toolchain kernel headers series (5.4.x or later) ---> │ │ External toolchain C library (glibc/eglibc) ---> │ │ [*] Toolchain has SSP support? │ │ [*] Toolchain has RPC support? │ │ [*] Toolchain has C++ support? │ │ [ ] Toolchain has D support? │ │ [ ] Toolchain has Fortran support? │ │ [ ] Toolchain has OpenMP support? │ │ [ ] Copy gdb server to the Target │ │ *** Host GDB Options *** │ │ [ ] Build cross gdb for the host │ │ *** Toolchain Generic Options *** │ │ [ ] Copy gconv libraries │ │ () Extra toolchain libraries to be copied to target │ │ [*] Enable MMU support │ │ () Target Optimizations │ │ () Target linker options │ │ [ ] Register toolchain within Eclipse Buildroot plug-in │ │ │ │ │ │ │ │ │ └F1Help─F2SymInfo─F3Help 2─F4ShowAll─F5Back─F6Save─F7Load─F8SymSearch─F9Exit──────────────────────────────┘
在工具链配置中指定我们之前编译的工具链路径,下面相关的参数如果和实际不符的话Buildroot会提示我们修改。
默认配置使用Busybox作为初始化系统及核心组件,其余配置可自行摸索。
配置结束后可以执行 make
启动编译,Buildroot会自动下载所需组件,最后生成的rootfs则位于 output/images/rootfs.tar
中。
上电运行
使用生成的rootfs及另外编译的内核,系统即可启动。
[ 1.255069] VFS: Mounted root (ext4 filesystem) on device 179:2. [ 1.263416] devtmpfs: mounted [ 1.267895] Freeing unused kernel memory: 1024K [ 1.272748] Run /sbin/init as init process [ 1.415171] EXT4-fs (mmcblk0p2): re-mounted. Opts: (null) Starting syslogd: OK Starting klogd: OK Running sysctl: OK Initializing random number generator: OK Saving random seed: [ 1.654797] random: dd: uninitialized urandom read (512 bytes read) OK Starting network: OK Welcome to Buildroot buildroot login: