Buildroot使用笔记

本文根据自己的理解、实践,整理 Buildroot 的使用笔记。网上常见的知识点,少列或不列。

介绍

Buildroot 是在Linux系统中构建完整的嵌入式Linux系统的框架。构建方式由Makefile和Kconfig组成,与Linux内核编译过程类似。这里的“完整”,是指通过Buildroot,可以编译生成bootloader、kernel、rootfs以及rootfs所需要的各种库、配置文件、启动脚本,等等。
由于 Buildroot 的可配置特性,根据实际需求,可以只编译 rootfs 部分。

下载

Buildroot官方网站:。
Buildroot配置选项说明文档:。
Buildroot下载地址:,

使用

buildroot 方便之处是将嵌入式构建的整套东西自动化,少配置或不配置,可得到最终的镜像文件。其包括了配置所需模块(如芯片平台、登陆密码、软件包),下载软件,编译及制作镜像文件。全新制作,耗时主要在下载软件和编译。
buildroot 只管理配置文件和脚本,下载的软件包可额外备份,编译的临时文件一般不建议删除,除非重新编译,最终的镜像文件,或大或小,看配置。
kernel、bootloader 可在buildroot 中编译,也可单独编译。 其它包亦然。如果单独编译,但需要先解压镜像,拷贝,再压缩。
解压的目录,不能是windows的目录,因为有部分链接可能会导致编译出错。
编译时,会自动下载源码压缩包,可能下载不成功,则可搜索同名的压缩包,再编译。下载目录或是dl,或是downloads。

目标系统不必须安装静态库,不必须安装开发工具,如binutils、gdb。资源足够者除外。

管理

内核、busybox配置等,位于board/<板子厂家>目录,buildroot配置位于buildroot根目录,名称为.cofig。
如果内核在buidroot中编译,内核源码位于build/linux-xxx目录,注意build是编译临时目录,不能随意删除,否则会重新编译。

编译

拷贝默认配置文件:

1
cp configs/qemu_arm_vexpress_defconfig .

注:如果是厂家提供的,一般会有厂家修改过的默认配置。位置可能不同。

配置:

1
2
make menuconfig  // 设置工具链、包,内核等等,生成的.config在工程根目录
make // 注::此处不可多线程编译,即不能 make -j

当构架文件更改时,可清理:

1
make clean

注:再编译时将会重新编译,十分耗时。

完全清理:

1
make distclean

只下载选择的包:

1
make source

可在配置时指定各模块的配置文件。
uboot:
设置 BR2_TARGET_UBOOT_USE_DEFCONFIG,在顶层目录执行:

1
make uboot-menuconfig

kernel:
设置 BR2_LINUX_KERNEL_CUSTOM_CONFIG_FILE,在顶层目录执行:

1
make linux-menuconfig

注:内核位于output/build下,如不存在.config,将用默认的覆盖。但如果.config被修改,默认的不会被保存。

busybox:
设置BR2_PACKAGE_BUSYBOX_CONFIG,在顶层目录执行:

1
make busybox-menuconfig

更新:

1
2
3
make linux-update-defconfig
make busybox-update-config
make uboot-update-defconfig

配置

编译项

1
2
3
4
5
Build options  --->
(configs/XXX_defconfig) Location to save buildroot config
($(TOPDIR)/downloads) Download dir
(/opt/XXX-linux-sdk) Host dir
[*] strip target binaries

工具链

1
2
Toolchain  --->  
Toolchain type (External toolchain) --->

系统配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
System configuration  --->  
Root FS skeleton (default target skeleton) ---> // 选择rootfs模板目录,skeleton用system/skeleton
(buildroot) System hostname // 主机名称
(Welcome to Buildroot) System banner // 提示语
Passwords encoding (md5) ---> // 密码加密方式
Init system (systemd) ---> // init机制,可选BusyBox(最常用)、systemV(不常用)和systemd
*** /dev management using udev (from systemd) ***
(system/device_table.txt) Path to the permission tables // 设备分区表

[*] Enable root login with password
() Root password // 密码,可为空
/bin/sh (bash) ---> // shell选择,bash比sh方便使用
[*] Run a getty (login prompt) after boot ---> // 登陆提示
-*- Install timezone info
(default) timezone list
(Etc/GMT-8) default local time // 时间,默认UTC,可输入其它区,注:GMT-8表示东八区
(board/XXX/rootfs_overlay) Root filesystem overlay directories
// 创建镜像前执行的自定义脚本
(board/XXX/post-build.sh) Custom scripts to run before creating filesystem images

一些包的记录

Buildroot 内有众多软件供选择。此处列出一些。位于Target packages --->下。

1
2
Audio and video applications  --->
ffmpeg madplay mplayer v4l2grab vlc

1
2
Filesystem and flash utilities  ---> 
e2fsprogs e2tools flash_erase nanddump ubiformat等工具
1
2
Interpreter languages and scripting  --->
erlang jamvm lua nodejs perl php python3 ruby // 这些是解析型语言
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Libraries  --->
Crypto --->
CA Certificates (使用https时用到,如docker集群应用) openssl
Database --->
berkeleydb hiredis mongodb mysql postgresql redis sqlite
Javascript --->
bootstrap jQuery json-javascript
JSON/XML --->
cJSON libjson tinyxml tinyxml2 yaml-cpp
Logging --->
glog log4cplus log4cpp zlog
Multimedia --->
libamcodec libmpeg2 libopenh264 libyuv live555 mediastreamer x264 x265
Networking --->
azmq cgic openmpi
Other --->
libuv protobuf protobuf-c
1
2
3
4
Networking applications  --->
dhcp dhcpcd dnsmasq dropbear ethtool hostapd ifupdown iperf iptables
iputils lftp lighttpd mosquitto nginx ntp ntpd openssh sshpass tcpdump
vnstat vpnc wireless wireshark wpa_supplicant xinetd
1
2
Package managers  --->
opkg rpm // 注:buildroot不管理这些工具依赖的文件
1
2
Shell and utilities  ---> // 一些非busybox内置的工具
bash dash zsh file logrotate sudo time which
1
2
3
4
5
6
7
8
9
System tools  --->
docker-engine docker daemon rsyslog runc syslogd & klogd systemd tar

-*- systemd --->
[*] enable hostname daemon
[*] enable resolve daemon
[*] enable timesync daemon
-*- util-linux --->
hwclock kill more
1
2
Text editors and viewers  ---> 
less nano uemacs vim

说明:目标系统的库、命令等,来自 busybox 的编译生成,不在 busybox 中的,散见于其它配置项。如 flash/ubi 工具,docker,证书,解析型语言,各类服务(ssh ntp http),数据协议解析,网络工具,无线连接工具,等等。Buildroot 支持的工具较多较全面,优先从中选择。

开发

镜像修改

编译后,制作镜像文件前,可指定脚本,其名称为post-build.sh,在该脚本可以对一些文件进行修改,或添加文件。如docker加速文件等。
如果要操作的目录或文件在已生成的目录中,即位于 target 目录,需使用环境变量 $TARGET_DIR 来指定。
如果是本地的目录或文件,一般位于board/<目标板名称>/目录,脚本中可用
BOARD_DIR="$(dirname $0)"表示该目录。

实践记录

buildroot-2018.02.1版本为例。需要添加 nodejs,但前端要求的版本为10.15,而自带的为8.15,故需修改。
修改./package/nodejs/nodejs.mk文件,改为NODEJS_VERSION = 10.15.0
修改./package/nodejs/nodejs.hash文件,改为对应的检验值(来自:

1
2
3
4
5
6
7
797ab34c74b83b21b7d6ea261b5ca235d34c61a7da5aebb32459a963097ede3e  node-v10.15.0.tar.xz
```
如果不修改检验值,buildroot 认为文件非法,编译失败。
结果:不成功,因为不同的node版本依赖不同版本的包,需要相应的包亦更新(具体是哪些,没详参)。

## 其它
删除output/target目录,无法再编译,需要make clean删除所有内容,再编译,过程十分耗时。可如下:

find output/ -name “.stamp_target_installed” |xargs rm -rf
make
`
.stamp_target_installed表示已经安装了,删除之,让buildroot以为没有安装,则会再安装。

李迟 2019年底实践写草稿,2020年初发表
2020年8月修改

  • 本文作者:李迟
  • 版权声明:原创文章,版权归署名作者,转载建议注明出处(当然不注明亦可)。
  • 本文链接:/pkc/buildroot-note.html