介绍
官网:Buildroot - Making Embedded Linux Easy
下载地址:buildroot.org / buildroot · GitLab
本篇文章选择的版本是 2023.02,下载地址:文件 · 2023.02.x · buildroot.org / buildroot · GitLab
和busybox一样能图形化配置
make menuconfig安装相关依赖
sudo apt install sed make binutils build-essential gcc g++
sudo apt install patch gzip bzip2 perl tar cpio unzip rsync file bc wget
sudo apt install wget python libncurses5 bzr cvs git
sudo apt install mercurial rsync subversionbuildroot 配置
配置目标平台
Target options 配置流程:
Target Architecture (i386) 选择 ARM (little endian)
Target Architecture Variant (arm926t) 选择 cortex-A7
Target ABI 选择 EABIhf
Floating point strategy 选择 NEON/VFPv4
ARM instruction set 选择 ARM
Target Binary Format 选择 ELF
最终界面显示
Target Architecture (ARM (little endian)) --->
Target Architecture Variant (cortex-A7) --->
Target ABI (EABIhf) --->
Floating point strategy (NEON/VFPv4) --->
ARM instruction set (ARM) --->
Target Binary Format (ELF) --->配置交叉编译工具链
Toolchain 配置流程:
Toolchain type (Buildroot toolchain) 选择 External toolchain
Toolchain (Arm ARM 2021.07) 选择 Custom toolchain
Toolchain origin 选择 Pre-installed toolchain
Toolchain path 输入自己交叉编译工具所在的根目录 /Embbed_WorkSpace/ARM_TOOLCHAIN/arm-linux-gnueabihf-4.9.4
Toolchain prefix 输入交叉编译工具前缀 $(ARCH)-linux-gnueabihf
External toolchain gcc version 选择交叉编译工具 gcc 版本 4.9.x
External toolchain kernel headers series 选择Linux内核版本系列 4.1.x
External toolchain C library 选择使用的C语言库 glibc
然后把下面几个选中
Toolchain has SSP support? (NEW)
Toolchain has RPC support? (NEW)
Toolchain has C++ support?
Enable MMU support (NEW) 这个选项可能没有,因为选择的内核架构默认已有了
最终界面显示
Toolchain type (External toolchain) --->
*** Toolchain External Options ***
Toolchain (Custom toolchain) --->
Toolchain origin (Pre-installed toolchain) ---> │ │
( /Embbed_WorkSpace/ARM_TOOLCHAIN/arm-linux-gnueabihf-4.9.4) Toolchain path │ │
($(ARCH)-linux-gnueabihf) Toolchain prefix
External toolchain gcc version (4.9.x) ---> │ │
External toolchain kernel headers series (4.1.x) ---> │ │
External toolchain C library (glibc) --->
[*] Toolchain has SSP support?
[*] Toolchain has SSP strong 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
() Target Optimizations
() Target linker optionsToolchain type:工具链类型,可以是 buildroot 自带的,也可以是外部的
Toolchain:自定义工具链
Toolchain path:交叉编译工具链根目录
External toolchain gcc version:gcc编译器版本
配置基础系统信息
(buildroot) System hostname 自定义平台的名字
(Welcome to Buildroot) System banner 自定义终端连接开发板时的欢迎语
Init system (BusyBox) 选择使用 Busybox
/dev management (Dynamic using devtmpfs only) 使用 Dynamic using devtmpfs + mdev
Enable root login with password 开启使用密码登录
Root password 设置登录密码
Root FS skeleton (default target skeleton) ---> │ │
│ │ (hltj) System hostname │ │
│ │ (Welcome to hltj) System banner │ │
│ │ Passwords encoding (sha-256) ---> │ │
│ │ Init system (BusyBox) ---> │ │
│ │ /dev management (Dynamic using devtmpfs only) ---> │ │
│ │ (system/device_table.txt) Path to the permission tables │ │
│ │ [ ] support extended attributes in device tables │ │
│ │ [ ] Use symlinks to /usr for /bin, /sbin and /lib │ │
│ │ [*] Enable root login with password │ │
│ │ () Root password │ │
│ │ /bin/sh (busybox' default shell) --->
......配置根文件系统格式
如果是 EMMC 或 SD 卡的话
ext2/3/4 root filesystem 文件系统,就用 ext3/ext4
ext2/3/4 variant (ext2 (rev1)) 选择 ext4
若果是 NAND 的话就用ubifs
如果使用 nfs 挂载,上面的暂时不配置
选择根文件系统输出的打包方式
tar the root filesystem (NEW)
Compression method (no compression) 选择 bzip2
禁止编译 Linux 内核和 uboot
Kernel --->
[ ] Linux Kernel (NEW)
Bootloaders --->
[ ] U-Boot (NEW) buildroot 编译
内核版本标识不一致问题
这个问题一定出现
原因是配置buildroot工具链的linux内核版本与工具链本身自带的内核版本标识不一致导致的,我们只要修改下工具链自带的内核版本表示即可。
报错:
Incorrect selection of kernel headers: expected 4.1.x, got 4.0.x
make[1]: *** [package/pkg-generic.mk:273: /Embbed_WorkSpace/buildroot/buildroot-2023.02.x/output/build/toolchain-external-custom/.stamp_configured] Error 1
make: *** [Makefile:82: _all] Error 2修改交叉编译工具下的 arm-linux-gnueabihf/libc/usr/include/linux/version.h 文件
把第一行的内核版本标识的宏 #define LINUX_VERSION_CODE 262144 修改为 #define LINUX_VERSION_CODE 262415
我们前面Linux内核版本选择的是 4.1.x,而交叉编译中的是 4.0.0
版本计算公式主要是十进制转换为16进制: 262144 = 040000(h) 对应 4.0.0 版本内核
262415 = 04010F(h) 对应 4.1.x 版本内核
4.1.15 => 262415
5.4.31 => 328735
busybox版本过高问题
这个问题可能出现
这个错误是因为busybox版本过高,而编译器版本过低导致的,要么降低busybox版本,要么升级编译器。这里选择降低busybox版本。
buildroot 下载的源码包都存放在 dl 目录下,我们进入这个目录可以看到下载的 busybox 版本。
修改 package/busybox/busybox.mk 文件,将版本1.36.0版本修改成1.35.0版本。
BUSYBOX_VERSION = 1.35.0这个没有测试呢,如果是第一次编译的时候就徐改了busybox本班,就不用下面这一步,如果是报错了再修改了,就需要下面这一步。
buildroot-2023.02/package/busybox/busybox.hash记录的是busybox-1.36.0.tar.bz2的hash值,我们需要把它修改成busybox-1.35.0.tar.bz2的hash值。
make 多核编译可能会报错,编译过程确保网络畅通。
编译成功,在 output/images 中会出现压缩包了
buildroot 构建流程和注意事项
新版 buildroot 已经把 rootfs 的 etc/init.d/ 的 rcS 等启动脚本移到了 package/initscripts/** 目录下。
系统默认的rcS脚本不会直接做系统用户态启动初始化操作,而是会调用/etc/init.d/目录下的SXX开头的脚本执行系统用户态启动的流程,其中XX是数字,数字越小的脚本优先于数字大的脚本被调用。用于实际的系统用户态启动脚本应该以SXX这这种格式命名,install到output/target/etc/init.d/目录下。
fakeroot是一个主机上使用的软件包,它会被buildroot下载编译,用于为构建rootfs提供一个虚拟的root权限环境,只有在root权限下,才能把output/target/中的目录和文件变成root用户,并创建dev节点。有了fakeroot环境,系统构建者无需获取主机的root权限,也能在fakeroot下把文件改为root用户,并制作root方式。
fakeroot: fakeroot是一个用于模拟root用户权限的工具,可以模拟一个用户对文件系统的操作行为,而不需要实际的root用户权限。
用户特定格式的rootfs制作脚本,最后都会被写到一个脚本中,该脚本会在fakeroot环境中执行。
buildroot 添加第三方库
Target packages -> Librariesbuildroot 配置 busybox
buildroot 在构建根文件系统的时候也是需要用到 busybox 的,buildroot 会自动下载 busybox 压缩包,buildroot 下载的源码压缩包都存放在源码目录下的dl目录下,在dl目录下就有一个叫做"busybox"的文件夹,此目录下保存着 busybox 压缩包,如下图所示:
buildroot 将所有解压缩后的软件保存在源码目录下的output/build目录中,我们可以 在找到output/build/busybox-1.35.0 这个文件夹,此文件夹就是解压后的 busybox 源码,如下图所示:
配置 busybox
make busybox-menuconfig Settings --->
[*] vi-style line editing commands
Linux Module Utilities--->
[ ]Simplified modutils 这里我们要取消勾选!使用键盘上的“n”键取消选择
[*]insmod
[*]rmmod
[*]lsmod
[*]modprobe
[*]depmod
Settings --->
[*] Support Unicode (NEW)
[*] Check $LC_ALL, $LC_CTYPE and $LANG environment variables 让 busybox 支持中文
从 busybox1.17.0 以上之后,对 ls 命令不做修改是无法显示中文的。就算是内核设置了支持中文的话, 在 shell 下用 ls 命令也是无法显示中文的,这是因为 busybox1.17.0 以后版本对中文的支持进行了限制。要想让 busybox1.17.0 以上支持中文,需要修改libbb/printable_string.c和libbb/unicode.c文件。
终端提示符显示路径
目前我们用busybox编译出来的文件系统终端提示符一直是"#",这样不利于我们查看自己当前所处的路径。最好能像 Ubuntu 一样,可以提示当前登录的用户名,主机名以及所处的目录。如果想达到此效果,我们需要先了解一个环境变量PS1,格式如下:
PS1 = '命令列表'
命令列表可以有如下参数:
\! 显示该命令的历史记录编号。
\# 显示当前命令的命令编号。
\$ 显示$符作为提示符,如果用户是 root 的话,则显示#号。
\\ 显示反斜杠。
\d 显示当前日期。
\h 显示主机名。
\n 打印新行。
\nnn 显示 nnn 的八进制值。
\s 显示当前运行的 shell 的名字。
\t 显示当前时间。
\u 显示当前用户的用户名。
\W 显示当前工作目录的名字。
\w 显示当前工作目录的路径