什么是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 )是一个快速简易构建工具链的工具(没错够绕嘴的),可以用于完成以下几个主要步骤

  1. 构建 buildutils
  2. 构建 3-Stage Cross GCC 及对应的C Library
  3. 构建 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,编译并安装( makemake 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                                                                     
                                                                                                          
                                                                                                          
 F1HelpF2SymInfoF3Help 2F4ShowAllF5BackF6SaveF7LoadF8SymSearchF9Exit──────────────────────────────┘

一切准备就绪就可以运行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)  --->                                             
                                                                                                          
                                                                                                          
                                                                                                          
                                                                                                          
                                                                                                          
                                                                                                          
                                                                                                          
                                                                                                          
                                                                                                          
                                                                                                          
                                                                                                          
                                                                                                          
                                                                                                          
                                                                                                          
                                                                                                          
                                                                                                          
                                                                                                          
                                                                                                          
                                                                                                          
                                                                                                          
                                                                                                          
                                                                                                          
                                                                                                          
 F1HelpF2SymInfoF3Help 2F4ShowAllF5BackF6SaveF7LoadF8SymSearchF9Exit──────────────────────────────┘

我们在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                                                 
                                                                                                          
                                                                                                          
                                                                                                          
                                                                                                          
 F1HelpF2SymInfoF3Help 2F4ShowAllF5BackF6SaveF7LoadF8SymSearchF9Exit──────────────────────────────┘

在工具链配置中指定我们之前编译的工具链路径,下面相关的参数如果和实际不符的话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: