1. 何为buildroot?
1.1 buildroot简介
busybox 仅仅只是帮我们构建好了一些常用的命令和文件,像 lib 库、/etc 目录下的一些文件都需要我们自己手动创建,而且 busybox
构建的根文件系统默认没有用户名和密码设置。如果我们还要移植一些第三方软件和库,比如 alsa、iperf、mplayer 就会比较麻烦。而buildroot 不仅包含了 busybox 的功能,而且里面还集成了各种软件,需要什么软件就选择什么软件,不需要我们去移植了。需要什么就选择什么,就跟我们去吃自助餐一样,想吃什么就拿什么。
buildroot 极大的方便了我们嵌入式 Linux 开发人员构建实用的根文件系统。从 busybox 开始一步一步的构建根文件系统适合学习、了解根文件系统的组成,但是不适合做产品(主要是自己构建的话会有很多不完善、没有注意到的细节)。 buildroot 会帮我们处理好各种细节,根文件系统也会更加的合理、有效。因此在做产品的时候推荐大家使用 buildroot 来构建自己的根文件系统。buildroot 和 uboot、Linux Kernel 很类似,我们需要到其官网上下载源码,然后对其进行配置,比如设置交叉编译器、设置目标 CPU 参数等,最主要的就是选择所需要的第三方库或软件。一切配置好以后就可以进行编译,编译完成了以后就会在一个文件夹里面存放好编译结果,也就是根文件系统。
1.2 buildroot下载
buildroot 源码肯定是要从 buildroot 官网下载,官网地址为官网,打开以后的官网界面 :
点击图中的 DOWNLOAD 按钮即可打开 buildroot 的下载界面,
2. buildroot 构建根文件系统
2.1 配置 buildroot
将 buildroot 源码 buildroot-2023.11.tar.gz 拷贝到 ubuntu 中,也就是我们前面创建的 tool 目录下。拷贝完成以后对其进行解压,命令如下:
tar -vxjf buildroot-2023.11.tar.gz
解压完成以后就会得到一个名为 buildroot-2023.11 的目录,此目录就是我们解压得到的 buildroot 源码,进入到此目录中,此目录下的文件:
buildroot 和 uboot、Linux kernel 一样也支持图形化配置,输入如下命令即可打开图形化配置界:
make menuconfig
打开以后的图形化配置界面如图 所示
接下来我们就依次配置 buildroot,配置完成以后就可以进行编译了。
2.1.1 配置 Target options
首先配置 Target options 选项,需要配置的项目和其对应的内容如下(“=”号后面是配置项要选择的内容!):
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
配置完成以后如图所示
2.1.2 配置 Toolchain
此配置项用于配置交叉编译工具链,也就是交叉编译器,这里设置为我们自己所使用的交叉编译器即可。buildroot 其实是可以自动下交叉编译器的,但是都是从国外服务器下载的,鉴于国内的网络环境,强烈推荐大家设置成自己所使用的交叉编译器。需要配置的项目和其对应的内容如下:
Toolchain
-> Toolchain type = External toolchain
-> Toolchain = Custom toolchain //用户自己的交叉编译器
-> Toolchain origin = Pre-installed toolchain //预装的编译器
-> Toolchain path =/usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf
-> Toolchain prefix = $(ARCH)-linux-gnueabihf //前缀
-> External toolchain gcc version = 4.9.x
-> External toolchain kernel headers series = 4.1.x
-> External toolchain C library = glibc/eglibc
-> [] Toolchain has SSP support? (NEW) //选中
-> [] Toolchain has SSP strong support? (NEW) //选中
-> [] Toolchain has RPC support? (NEW) //选中
-> [] Toolchain has C++ support? //选中
-> [] Toolchain has Fortran support? //选中-> [] Toolchain has OpenMP support? //选中
Toolchain 下几个比较重要的选项需要说明一下,如下所示:
Toolchain:设置为 Custom toolchain,表示使用用户自己的交叉编译器
Toolchain origin:设置为 Pre-installed toolchain,表示使用预装的交叉编译器
Toolchain path:设置自己安装的交叉编译器绝对路径!buildroot 要用到
Toolchain prefix:设置交叉编译器前缀,要根据自己实际所使用的交叉编译器来设置,比如我们使用的是 arm-linux-gnueabihf-gcc,因此前缀就是 $(ARCH)-linux-gnueabihf,其中 ARCH我们前面已经设置为了 arm
2.1.3 配置 System configuration
此选项用于设置一些系统配置,比如开发板名字、欢迎语、用户名、密码等。需要配置的项目和其对应的内容如下:
System configuration
-> System hostname = xiaoming//平台名字,自行设置
-> System banner = Welcome to buildroot //欢迎语
-> Init system = BusyBox //使用 busybox
-> /dev management = Dynamic using devtmpfs + mdev //使用 mdev
-> [*] Enable root login with password (NEW) //使能登录密码
-> Root password = 0206//登录密码为 0206
在 System configuration 选项中可以配置平台名字,登录密码等信息
2.1.4 配置 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
如果我们是通过 Mfgtool 工具将根文件系统烧写到开发板上的 EMMC/SD 卡中,烧写的时候需要自己对根文件系统进行打包,此项不需要配置。
2.1.5 禁止编译 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 选项!
2.1.6 配置 Target packages
此选项用于配置要选择的第三方库或软件、比如 alsa-utils、ffmpeg、iperf等工具,但是现在我们先不选择第三方库,防止编译不下去!先编译一下最基本的根文件系统,如果没有问题的话再重新配置选择第三方库和软件。否则一口吃太多会容易撑着的,编译出问题的时候都不知道怎么找问题。
2.1.7 配置 Build options
buildroot 编译的时候会先从网上下载所需的软件源码,有些软件源码可能下载不下来,这个时候就需要配置国内的加速镜像源url地址,速度可以快非常多!!
Build options
-> Mirrors and Download locations
-> (https://sources.buildroot.net) Backup download site
-> (https://mirror.bjtu.edu.cn/kernel/) Kernel.org mirror
-> (http://mirrors.nju.edu.cn/gnu/) GNU Software mirror
-> (https://luarocks.cn) LuaRocks mirror
-> (http://mirrors.nju.edu.cn/CPAN/) CPAN mirror (Perl packages)
在上面填入相应的国内镜像源可以大大加快下载的速度
2.2 编译 buildroot
2.2.1 配置交叉编译器
在配置完成之后就可以进行编译了,但是在编译之前还是要配置一下交叉编译器才可以,否则会报错。
Incorrect selection of kernel headers: expected 4.1.x, got 4.0.x
make: *** [package/pkg-generic.mk:273:/home/linux/buildroot-2023.11/output/build/toolchain-external-custom/.stamp_configured] 错误 1
输入命令:
vim /usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/libc/usr/include/linux/version.h
如上图所示 LINUX_VERSION_CODE 为 262144,此值为 10 进制,转换为 16 进制为 40000,对应的 linux 内核版本为 4.0.x,在此要把该值改为与 buildroot 中配置的一致,即为 4.1.x,转换为 16 进制为 40100,对应的十进制为 262400。
2.2.2 开始编译
配置完成以后就可以编译 buildroot 了,编译完成以后 buildroot 就会生成编译出来的根文件系统压缩包,我们可以直接使用。输入如下命令开始编译:
sudo make -j16 //注意,一定要加 sudo,有的说是不能通过-jx 来指定多核编译,目前测试是可以的
等待编译完成,编译完成以后就会在 buildroot-2023.11/output/images 下生成根文件系统,如图所示:
rootfs.tar 就是打包好的根文件系统,我们就使用 rootfs.tar 进行测试。
2.2.3 移植根文件系统
将 rootfs.tar 拷贝到 SD 卡或者挂载的 nfs 文件系统下解压,并删去原来的 rootfs.tar。
使用命令 vim ./etc/profile 打开文件。(注意这里打开的是刚刚打包的文件系统,不是打开 ubuntu 的文件)
添加以下内容如图:
PS1='[$USER@$HOSTNAME]$PWD#'
PATH=$PATH
HOSTNAME='/bin/hostname'
export USER LOGNAME PS1 PATH
之后就可以把文件系统挂载到开发板上进行测试了。
3. buildroot 第三方软件和库的配置
在 buildroot 构建的根文件系统运行基本没有问题,但是这个根文件系统是最简单的,我们并没有在 buildroot
里面配置任何第三方的库和软件,接下来我们就配置 buildroot,使能一些常见的第三方软件。
比如我们现在配置使能 alsa-lib、alsa-utils这两个软件和库。
3.1 使能 alsa-lib
输入 make menuconfig,打开 buildroot 配置界面,配置路径如下:
Target packages
-> Libraries
-> Audio/Sound
-> -*- alsa-lib
-> 此配置项下的文件全部选中
3.2 使能 alsa-utils
接下来使能 alsa-utils,路径如下:
Target packages
-> Audio and video applications
-> alsa-utils
-> 此配置项下的文件全部选中
配置好以后如图所示
配置完成之后重新拷贝文件系统到开发板中
解压完成以后就可以使用 alsa-utils 相关的软件了,比如 alsamixer。大家也可以自行尝试去配置使能一些其他的第三方库和软件。
评论区