<Linux开发>系统移植 -之-使用buildroot构建BusyBox根文件系统

本文详细介绍了如何使用buildroot构建适用于Linux开发板的BusyBox根文件系统,包括下载buildroot源码、配置目标选项、交叉编译器、系统配置、文件系统镜像类型,以及禁止内核和uboot的编译。在编译过程中,还提供了处理常见报错的方法,并探讨了如何添加第三方软件和库,如alsa-lib和alsa-utils。此外,文章还涵盖了支持中文字符的修改和depmod的配置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、前言

本章节讲解的是使用buildroot构建BusyBox根文件系统并移植到linux开发板。
主要是基于imax6ull emmc Linux开发板操作。

接下来讲解具体过程记录,buildroot源码可联系作者索取,或到官网下载:网址

根文件系统属于Linux系统运行的最后一部分,包括uboot和Linux内核及设备树,这几部分组合有uboot开始经过Linux内核和设备树,再到根文件系统,才能真正将Linux系统运行起来,从而让开发板进入Linux系统,而后才能敲打命令行。uboot和Linux内核移植可参考下面连接。

交叉编译环境搭建:
<Linux开发> linux开发工具-之-交叉编译环境搭建

uboot移植可参考以下:
<Linux开发> -之-系统移植 uboot移植过程详细记录(第一部分)
<Linux开发> -之-系统移植 uboot移植过程详细记录(第二部分)
<Linux开发> -之-系统移植 uboot移植过程详细记录(第三部分)(uboot移植完结)

Linux内核及设备树移植可参考以下:
<Linux开发>系统移植 -之- linux内核移植过程详细记录(第一部分)
<Linux开发>系统移植 -之- linux内核移植过程详细记录(第二部分完结)

Linux文件系统构建移植参考以下:
<Linux开发>系统移植 -之- linux构建BusyBox根文件系统及移植过程详细记录

二、 buildroot 下载

buildroot 源码肯定是要从 buildroot 官网下载,官网地址为 网址,打开以后
的官网界面如下:
在这里插入图片描述
点击DOWNLOAD 即可进入下载界面如下:
在这里插入图片描述
作者第一次使用buildroot构建文件系统是使用的是最新的版本是2023.02,就上图所示版本,但是在使用最新的版本编译时遇到各种各样的编译错误。 一般最新的版本以来的编译工具版本也都是比较新的,还有编译过程下载的BusyBox包都会是比较新的版本,在使用比较新的版本中难免会有一些工具等匹配不上而导致编译报错。所以笔者这里选择比较旧 的版本。

上图界面下,往下拉找到Older versions can be downloaded from the release archive.”
在这里插入图片描述
进入后就是所有历史版本的列表了。
在这里插入图片描述
笔者选择了buildroot-2020.05.tar.gz 版本,点击后就会下载了。
在这里插入图片描述
使用FileZilla Client将压缩包传到ubuntu中;
在这里插入图片描述
在这里插入图片描述

可到也传了buildroot-2023.02.tar,这个版本是最开始时使用的,但编译时移植报各种错误,就暂时不搞了,后续有时间再处理最新版本的编译问题。

在ubunt下解压文件:

tar  -zxvf  buildroot-2020.05.tar.gz

在这里插入图片描述

至此buildroot源码准备完成,接下来就是配置及编译了。

三、配置buildroot基础参数

使用“make menuconfig” 可进入配置界面,这点与kernel、uboot支持图形化配置类似。
在这里插入图片描述

3.1 配置Target options

在本次所用的开发板是imax6ull,其是cortex-A7架构,所以相关配置如下:

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

配置完如下:
在这里插入图片描述

3.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.0.x  //这里得是4.0.x,如果用4.1.x编译会报错
	-> External toolchain C library = glibc/eglibc 
	-> [*] Toolchain has SSP support? (NEW) //选中
	-> [*] Toolchain has RPC support? (NEW) //选中
	-> [*] Toolchain has C++ support? //选中
	-> [*] Enable MMU support (NEW) //选中

Toolchain:设置为 Custom toolchain,表示使用用户自己的交叉编译器。
Toolchain origin:设置为 Pre-installed toolchain,表示使用预装的交叉编译器。
Toolchain path:设置自己安装的交叉编译器绝对路径!buildroot 要用到。
Toolchain prefix:设置交叉编译器前缀,要根据自己实际所使用的交叉编译器来设置,比如我们使用的是 arm-linux-gnueabihf-gcc,因此前缀就是$(ARCH)-linux-gnueabihf,其中 ARCH我们前面已经设置为了 arm。
在这里插入图片描述

3.3 配置System configuration

此选项用于设置一些系统配置,比如开发板名字、欢迎语、用户名、密码等。需要配置的
项目和其对应的内容如下:

System configuration
	-> System hostname = onefu //平台名字,自行设置
	-> System banner = Welcome to onefu  //欢迎语
	-> Init system = BusyBox //使用 busybox
	-> /dev management = Dynamic using devtmpfs + mdev //使用 mdev
	-> [*] Enable root login with password (NEW) //使能登录密码
		-> Root password = water//登录密码为 water

在这里插入图片描述

3.4 配置Filesystem images

此选项配置我们最终制作的根文件系统为什么格式的,配置如下:

-> Filesystem images
-> [*] ext2/3/4 root filesystem //如果是 EMMC 或 SD 卡的话就用 ext3/ext4
	-> ext2/3/4 variant = ext4 //选择 ext4 格式
	//笔者使用的是emmc选上面这种,如果读者是nand的则选下面这种。
-> [*] ubi image containing an ubifs root filesystem //如果使用 NAND 的话就用 ubifs

在这里插入图片描述

3.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 选项!

在这里插入图片描述

3.6 配置 Target packages

此选项用于配置要选择的第三方库或软件、比如 alsa-utils、ffmpeg、iperf 等工具,但是现在我们先不选择第三方库,防止编译不下去!先编译一下最基本的根文件系统,如果没有问题的话再重新配置选择第三方库和软件。前面也提到,在编译的过程中会遇到一些编译错误;为了方便排查和处理,构建文件系统时,一步一步进行是比较稳扎稳打的。避免一次性编译太多,出现报错而不知所措。后面在补充配置第三方库或软件的集成。

经过上述配置,基础的buildroot就配置好了,接下来就是编译了。

四、编译buildroot

经过上述配置完后即可进行编译了。编译完成后会生成一个根文件系统压缩包,这个压缩包就可以直接使用了。
编译命令:
注意,一定要加 sudo,而且不能通过-jx 来指定多核编译!!!

sudo make

buildroot 编译的时候会先从网上下载所需的软件源码,有些软件源码可能下载不下来,这个时候就需要我们自行处理。buildroot 编译过程会很耗时,可能需要几个小时,请耐心等待!
笔者是晚上编译的,大约30~60分钟,具体因网络等因素而异。

编译完成后如下图:
在这里插入图片描述
编译后的生成的文件在buildroot-2020.05/output/images 目录下:
在这里插入图片描述
编译出来了多种格式的 rootfs,比如 ext2、ext4等。其中rootfs.tar 就是打包好的根文件系统,我们测试时使用这个压缩包即可。

五、运行验证根文件系统

5.1 将文件系统放到nfs目录下

笔者的nfs目录是:

/home/water/imax/nfs/

在nfs目录下创建存放根文件系统目录:

mkdir  buildrootfs

将前面编译得到的rootfs.tar压缩包解压nfs目录如下:

cd /home/water/imax/nfs/buildrootfs
cp /home/water/imax/NXP/buildroot/buildroot-2020.05/output/images/rootfs.tar  .
tar -vxf rootfs.tar
rm rootfs.tar

进入到nfs目录,创建根文件系统存放目录,并将根文件系统文件压缩包复制到该目录后解压,删除压缩包。
在这里插入图片描述

5.2 在uboot中配置nfs挂载根文件系统

在linux开机uboot倒计时时按下任意键,进入Uboot命令行:
在这里插入图片描述
配置bootargs参数如下:

setenv bootargs 'console=ttymxc0,115200 root=/dev/nfs nfsroot=192.168.0.116:/home/water/imax/nfs/buildrootfs,v3 proto=tcp rw ip=192.168.0.117:192.168.0.116:192.168.0.1:255.255.255.0::eth0:off' 
saveenv

其中/home/water/imax/nfs/buildrootfs 就是前面ubuntu中创建存放根文件系统的目录。
其余参数可参考<Linux开发>系统移植 -之- linux构建BusyBox根文件系统及移植过程详细记录

v3:需要加上v3否则nfs挂载根文件系统可能会失败,原因是ubuntu主机nfs版本 和 kernel中的nfs版本兼容性不足导致,所以到指定版本。

kernel 和 uboot相关内容可参考笔者相关文章。
在这里插入图片描述

5.3 运行

上述bootargs配置完后即可输出”boot“启动。

在这里插入图片描述
在终端最后可看到根文件系统挂载成功:
在这里插入图片描述
可看到3.3 配置System configuration中设置的欢迎语“Welcome to water_onefu” 和主机名“water_onefu”

因为在3.3 配置System configuration中配置了登录密码,所以哎终端输入用户和密码登录即可:

login:root
Password:water

在这里插入图片描述
在这里插入图片描述
至此根文件系统运行验证OK。

六、报错处理

6.1 编译报错:configure: error: you should not run configure as root (set FORCE_UNSAFE_CONFIGURE=1 in environment to bypass this check)
在这里插入图片描述
解决办法:编译是加上 FORCE_UNSAFE_CONFIGURE=1
编译命令如下:

sudo make FORCE_UNSAFE_CONFIGURE=1

6.2 linu启动挂载跟文件系统报错
错误:VFS: Cannot open root device “nfs” or unknown-block(2.0): error -6
在这里插入图片描述
解决方法:在配置bootargs参数时加入v3,如下:

setenv bootargs 'console=ttymxc0,115200 root=/dev/nfs nfsroot=192.168.0.116:/home/water/imax/nfs/buildrootfs,v3 proto=tcp rw ip=192.168.0.117:192.168.0.116:192.168.0.1:255.255.255.0::eth0:off' 
saveenv

七、其它功能补充

7.1 buildroot 第三方软件和库的配置

移植一些第三方的库和软件,比如 alsa-lib、alsa-utils 等等,不需要自行移植这些第三方软件和库了,可以直接在 buildroot 里面配置使能。比如我们现在配置使能 alsa-lib、alsa-utils 这两个软件和库。

7.1.1使能 alsa-lib

输入 make menuconfig,打开 buildroot 配置界面,配置路径如下:

Target packages
	-> Libraries
		-> Audio/Sound 
			-> -*- alsa-lib ---> 此配置项下的文件全部选中

在这里插入图片描述

7.1.2 使能 alsa-utils

使能 alsa-utils,路径如下:

Target packages 
	-> Audio and video applications 
		-> alsa-utils 此目录下的软件全部选中

在这里插入图片描述

7.1.3 保存配置编译

上述配置完成后,选择“Save”保存,完后运行编译命令“sudo make FORCE_UNSAFE_CONFIGURE=1”
编译过程会从网上下载一些文件,等待下载后编译完成即可。

7.1.3 运行验证

将生成的根文件系统压缩包替换到nfs目录下:
重新解压到nfs目录,重启Linux设备。

sudo rm -r buildrootfs
mkdir  buildrootfs
cd buildrootfs
cp ../../NXP/buildroot/buildroot-2020.05/output/images/rootfs.tar  .
tar -vxf rootfs.tar
sudo rm rootfs.tar

重启linux设备。

使用amixer 测试:

amixer --help //查看 amixer 帮助信息

在这里插入图片描述
在这里插入图片描述
可知alsa相关库已编译进文件系统中。后续可使用音视频设备进一步验证播放效果。

7.2修改支持中文字符

修改支持中文显示,主要修改busybox中的内容,如下:
文件:/home/water/imax/NXP/buildroot/buildroot-2020.05/output/build/busybox-1.31.1/libbb/printable_string.c
修改后如下图标记。
在这里插入图片描述
文件:/home/water/imax/NXP/buildroot/buildroot-2020.05/output/build/busybox-1.31.1/libbb/unicode.c
修改后如下图标记。
在这里插入图片描述
配置 busybox来使能 unicode:
进入busybox图形配置界面

sudo make busybox-menuconfig

就是使能 busybox 的 unicode 编码以支持中文,配置路径如下

Location: 
 	-> Settings
 		-> Support Unicode //选中
			-> Check $LC_ALL, $LC_CTYPE and $LANG  environment variables //选中

在这里插入图片描述
配置完成后退出重新编译。
上述修改后重新编译buildroot。
编译:

water@ubuntu:~/imax/NXP/buildroot/buildroot-2020.05$ sudo make FORCE_UNSAFE_CONFIGURE=1

重新解压到nfs目录,重启Linux设备。

sudo rm -r buildrootfs
mkdir  buildrootfs
cd buildrootfs
cp ../../NXP/buildroot/buildroot-2020.05/output/images/rootfs.tar  .
tar -vxf rootfs.tar
sudo rm rootfs.tar

重启Linux设备。。。
在这里插入图片描述
重启后可能一直卡在上图界面;只需重新上电重启即可。
测试创建中文目录,测试中文文本,均正常。
在这里插入图片描述

7.3 配置depmod

默认是不配置depmod的,需要配置depmod,后续动态挂载设备驱动需要使用这个命令;
进入buildroot目录下,运行:
sudo make busybox-menuconfig 在这里插入图片描述
在这里插入图片描述
选中后,重新编译即可。

7.4命令行显示完整路径

在第五节中可以看到命令并未像ubuntu中那样把路径显示出来,如下:
ubuntu:
在这里插入图片描述
linux设备:
在这里插入图片描述
如何修改呢?
在前面解压后的根文件系统目录/home/water/imax/nfs/buildrootfs中修改如下
在这里插入图片描述

在这里插入图片描述

export PATH="/bin:/sbin:/usr/bin:/usr/sbin"

#if [ "$PS1" ]; then
#       if [ "`id -u`" -eq 0 ]; then
#               export PS1='# '
#       else
#               export PS1='$ '
#       fi
#fi

PS1='[\u@\h]:\w$:'
export PS1

export EDITOR='/bin/vi'

# Source configuration files from /etc/profile.d
for i in /etc/profile.d/*.sh ; do
        if [ -r "$i" ]; then
                . $i
        fi
done
unset i

保存后重启Linux。
在这里插入图片描述
可看到命令已完全显示路径。

BusyBoxBuildroot是两个不同的开源项目,虽然都是Linux发行版构建工具,但它们各有特点并应用于不同的场景。 **BusyBox**: 1. **简介**:BusyBox是一个小型的单合一体系,包含了众多实用的Linux工具,如shell、init系统、网络工具等。它的目标是将整个操作系统打包到一个单独的二进制文件中,常用于嵌入式系统、物联网设备和最小化环境中。 2. **主要功能**:作为实用工具集,BusyBox提供了轻量级的环境,节省空间和资源,便于快速启动。 3. **适用范围**:适用于资源受限的设备,如路由器、智能家居设备和某些移动设备。 **Buildroot**: 1. **简介**:Buildroot是一个更底层的系统构建工具,它专注于从头构建定制化的Linux内核和应用程序,支持从零开始配置系统。 2. **配置灵活**:用户可以根据需求选择或排除特定组件,创建自定义的Linux发行版,包括内核、文件系统、驱动程序和各种软件包。 3. **应用场景**:广泛用于开发板的初始化、服务器预配置、以及对复杂应用环境的需求。 **区别与联系**: - **规模与复杂度**:BusyBox侧重于单个可执行文件,Buildroot构建完整的系统- **目的不同**:BusyBox提供现成的工具集,Buildroot构建定制系统- **使用场景**:BusyBox在嵌入式环境中常见,Buildroot用于系统开发和部署。 - **关联**:在某些情况下,BusyBox可能作为Buildroot构建过程的一部分,为最终的嵌入式系统提供基本的工具集合。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

waterAdmin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值