本文根据自己的理解、实践,整理 Buildroot 的使用笔记。网上常见的知识点,少列或不列。
介绍
Buildroot 是在Linux系统中构建完整的嵌入式Linux系统的框架。构建方式由Makefile和Kconfig组成,与Linux内核编译过程类似。这里的“完整”,是指通过Buildroot,可以编译生成bootloader、kernel、rootfs以及rootfs所需要的各种库、配置文件、启动脚本,等等。
由于 Buildroot 的可配置特性,根据实际需求,可以只编译 rootfs 部分。
下载
Buildroot官方网站:https://buildroot.org/。
Buildroot配置选项说明文档:https://buildroot.org/downloads/manual/manual.html。
Buildroot下载地址:https://buildroot.org/download.html,
使用
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 | make menuconfig // 设置工具链、包,内核等等,生成的.config在工程根目录 |
当构架文件更改时,可清理:
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 | make linux-update-defconfig |
配置
编译项
1 | Build options ---> |
工具链
1 | Toolchain ---> |
系统配置
1 | System configuration ---> |
一些包的记录
Buildroot 内有众多软件供选择。此处列出一些。位于Target packages --->
下。
1 | Audio and video applications ---> |
1 | Filesystem and flash utilities ---> |
1 | Interpreter languages and scripting ---> |
1 | Libraries ---> |
1 | Networking applications ---> |
1 | Package managers ---> |
1 | Shell and utilities ---> // 一些非busybox内置的工具 |
1 | System tools ---> |
1 | Text editors and viewers ---> |
说明:目标系统的库、命令等,来自 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
文件,改为对应的检验值(来自:https://nodejs.org/dist/v10.15.0/SHASUMS256.txt)。
1 | 797ab34c74b83b21b7d6ea261b5ca235d34c61a7da5aebb32459a963097ede3e node-v10.15.0.tar.xz |
find output/ -name “.stamp_target_installed” |xargs rm -rf
make
```
.stamp_target_installed表示已经安装了,删除之,让buildroot以为没有安装,则会再安装。
李迟 2019年底实践写草稿,2020年初发表
2020年8月修改