一、Builroot是什么?
Buildroot
是一组Makefile和补丁,可简化并自动化地为嵌入式系统构建完整的、可启动的Linux环境(包括bootloader
、Linux
内核、包含各种APP
的文件系统)。Buildroot
运行于Linux平台,可以使用交叉编译工具为多个目标板构建嵌入式Linux平台。Buildroot
可以自动构建所需的交叉编译工具链,创建根文件系统,编译Linux内核映像,并生成引导加载程序用于目标嵌入式系统,或者它可以执行这些步骤的任何独立组合。例如,可以单独使用已安装的交叉编译工具链,而Buildroot
仅创建根文件系统。
二、Buildroot目录架构
三、Buildroot常用操作
四、基于百问网imx6ullPro开发实践
Buildroot 的配置选项简单介绍如下:
1.Target options 目标板的配置
目标选项。包括处理器体系结构、二进制文件格式、架构系列、ABI、浮点运算、指令集。
对应到我这里使用的I.MX6ULL,它的CPU架构是cortex-A7架构。
你如果用的是I.MX6D,那它对应的就是cortex-A9架构。
- Target Architecture:目标架构,这里选择 ARM(little endian),ARM小端模式
- Target Binary Format:二进制格式,为 ELF
- Target Architecture Variant:架构变体为 arm920t,内核类型
- Target AB1:应用程序二进制接口,为EABI
- Floating point strategy:浮点数的策略,选择为 NEON/VFPv4
- ARM instruction set: arm 汇编指令集,选择 ARM
2.Build options
主要是一些编译时用到的选项,比如dl的路径,下载代码包使用的路径,同时运行多个编译的上限,是否使能编译器缓冲区等等,这里按照默认就行了.
3.Toolchain 工具链选项
交叉编译链。选择哪种编译链,包括 Buildroot 自身提供的和外部。
- 内部工具链后端(internal toolchain backend), 在配置中称为
Buildroot toolchain
- 外部工具链后端(external toolchain backend),在配置中称为
External toolchain
(1)内部工具链后端(internal toolchain backend)
内部工具链后端是 Buildroot 自己用来编译交叉编译工具链的后端,Buildroot 会在开始为目标系统编译东西之前,先为自己编译一个交叉编译工具链。
- 该后端支持多种 C 库:uClibc-ng, glibc, musl、
- 修改用来编译工具链的 Linux 内核头文件。编译交叉编译工具链的时候也会编译 C 库,C 库会提供从用户空间到内核的接口,而内核对外的系统调用、数据结构就写在内核头文件中,因此需要用头文件来编译 C 库,才能确保接口能够正常工作。因为内核对外的接口是向后兼容的,所以用来编译工具链的 Linux 内核头文件也并不是一定要和目标设备上要运行的内核版本完全一致,这些头文件的版本比实际使用的内核版本旧一点也没什么问题,但反过来就不行了——那样编出来的 C 库可能会用到内核没有提供的接口;
- 修改 GCC、binutils、C 库的版本;
- 选择一系列的工具链选项(仅 uClibc ):比如工具链是否要有 RPC 支持(主要用于 NFS),宽字符(wide-char)支持、本地化支持、C++ 以及多线程支持。修改这些选项会影响后续在 Buildroot 中可选的应用和库。还可以使用
make uclibc-menuconfig
来更细粒度地控制 C 库特性。 -
注意:只要上面这些选项中有一个发生变化,那么就需要重新构建整个工具链和系统。
此类后端的优点:
- 与 Buildroot 完美集成
- 速度快,只编译了必要的部分
- 当进行
make clean
的时候需要重新构建工具链,非常耗时。如果想加快速度。建议使用外部工具链后端。
(2)外部工具链后端(external toolchain backend)
外部工具链后端支持使用预编译好的交叉编译工具链。Buildroot 已经预先配置了一些常见的交叉编译工具链(用于 ARM 的 Linaro、用于 ARM 的 Sourcey CodeBench, x86-64, PowerPC, MIPS 等),Buildroot 可以自动下载这些与配置好的工具链,也可以直接使用已有的定制工具链。
有三种方式来使用外部工具链:
- 让 Buildroot 基于预定义的外部工具链 profile 自动下载、安装。在
Toolchain
中选择已有的 profile 即可。 - 为 Buildroot 手动指定提前安装好的、预定义了 profile 的工具链。在
Toolchain
中选择 profile 后,反选掉Download toolchain automatically
并在Toolchain path
中填写已有工具链路径即可。 - 使用定制的外部工具链。通常用于使用 crosstool-NG 或 Buildroot 生成的已有定制工具链。选择
Toolchain
列表中的Custom toolchain
,然后填写Toolchain path
,Toolchain prefix
,External toolchain C librrary
选项。若外部工具链使用 glibc 库,只需要选择工具链是否支持 C++ 以及是否内建 RPC 支持即可。如果使用 uClibc 库,则还有宽字符、本地化、程序 invocation、线程支持等选项 - 可以使用已经很成熟的已有工具链。
- 不用在编译工具链上面再花(非常多的)时间了。
- 除非是自己编的,否则如果工具链有 bug 则会非常难修。
(3)使用 Buildroot 构建外部工具链
-
按照下面的步骤,可以创建一个外部工具链并打包
新建 Buildroot 配置:
- 为目标 CPU 架构选择对应的
Target options
- 在
Toolchain
菜单中,Toolchain type
项选Buildroot toolchain
- 在
System configuration
菜单中,Init system
项选None
,/bin/sh
也选none
- 在
Target packages
菜单中,不要启用BusyBox
- 在
Filesystem image
菜单中,不要启用tar the root filesystem
- 将
Toolchain type
选为External toolchain
- 将
Toolchain
选为Custom toolchain
- 将
Toolchain origin
选择Toolchain to be downloaded and installed
- 将
Toolchain URL
写为file:///到sdk的tar包路径.tar.gz
4.配置 System configuration
用于设置一些系统配置,比如开发板名字、欢迎语、用户名、密码等。
System configuration -> System hostname = Jasonangel //平台名字,自行设置 -> System banner = Welcome to xxxxx //欢迎语 -> Init system = BusyBox //使用 busybox -> /dev management = Dynamic using devtmpfs + mdev //使用 mdev -> [*] Enable root login with password (NEW) //使能登录密码 -> Root password = 123456 //登录密码为 123456
5.配置 Filesystem images
此选项配置我们最终制作的根文件系统为什么格式的,配置如下:
-> Filesystem images -> [*] ext2/3/4 root filesystem //如果是 EMMC 或 SD 卡的话就用 ext3/ext4 -> ext2/3/4 variant = ext4 //选择 ext4 格式 -> [*] ubi image containing an ubifs root filesystem //如果使用 NAND 的话就用 ubifs
6、禁止编译 Linux 内核和 uboot
buildroot 不仅仅能构建根文件系统,也可以编译 linux 内核和 uboot。当配置 buildroot,使能 linux 内核和 uboot 以后 buildroot 就会自动下载最新的 linux 内核和 uboot 源码并编译。但是我们一般都不会使用 buildroot 下载的 linux 内核和 uboot,因为 buildroot 下载的 linux 和 uboot官方源码,里面会缺少很多驱动文件,而且最新的 linux 内核和 uboot 会对编译器版本号有要求,可能导致编译失败。因此我们需要配置 buildroot,关闭 linux 内核和 uboot 的编译,只使用buildroot 来构建根文件系统,首先是禁止 Linux 内核的编译,配置如下:
-> Kernel -> [ ] Linux Kernel //不要选择编译 Linux Kernel 选项!
接着禁止编译 Uboot,配置如下:
-> Bootloaders -> [ ] U-Boot //不要选择编译 U-Boot 选项!
7.配置 Target packages
此选项用于配置要选择的第三方库或软件、比如 alsa-utils、ffmpeg、iperf、ftp、ssh等工具,可以按需选择。
配置完成以后就可以编译 buildroot 了,编译完成以后 buildroot 就会生成编译出来的根文件系统压缩包,我们可以直接使用。输入如下命令开始编译:
sudo make //注意,一定要加 sudo,而且不能通过-jx 来指定多核编译!!!
buildroot 编译过程会很耗时,请耐心等待!编译完成以后就会在 buildroot-2019.02.6/output/images 下生成根文件系统,即可使用。
编译过程需要一定的额外内存,注意需要留好内存,否则会报错如下:
g++: internal compiler error: Killed (program cc1plus) Please submit a full bug report
8.buildroot 下的 busybox 配置
buildroot 在构建根文件系统的时候也是要用到 busybox 的,既然用到了 busybox 那么就涉及到 busybox 的配置。buildroot 会自动下载 busybox 压缩包,buildroot 下载的源码压缩包都存放在/dl 目录下,在 dl 目录下就有一个叫做“busybox”的文件夹,此目录下保存着 busybox 压缩包。
在 buildroot下打开 busybox 的配置界面输入如下命令:
sudo make busybox-menuconfig
输入以后就会打开 buildroot 下的 busybox 配置界面,需要什么功能,使能即可。可以在busybox中修改文件,使其对中文支持,这一点可以百度设置。
编译完毕以后,会生成 rootfs.tar,拷贝出来以后,可以对其进行解压然后使用nfs挂载到板子上,或者直接使用SD卡烧录。编译出来的文件系统即可使用,如果需要什么命令和工具,在 make menuconfig 中使能再次编译即可。