本章节讲解的是使用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 官网下载,官网地址为 网址,打开以后
的官网界面如下:
点击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源码准备完成,接下来就是配置及编译了。
使用“make menuconfig” 可进入配置界面,这点与kernel、uboot支持图形化配置类似。
在本次所用的开发板是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
此配置项用于配置交叉编译工具链,也就是交叉编译器,这里设置为我们自己所使用的交叉编译器即可。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。
此选项用于设置一些系统配置,比如开发板名字、欢迎语、用户名、密码等。需要配置的
项目和其对应的内容如下:
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
此选项配置我们最终制作的根文件系统为什么格式的,配置如下:
-> 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
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 选项!
-> Bootloaders
-> [ ] U-Boot //不要选择编译 U-Boot 选项!
此选项用于配置要选择的第三方库或软件、比如 alsa-utils、ffmpeg、iperf 等工具,但是现在我们先不选择第三方库,防止编译不下去!先编译一下最基本的根文件系统,如果没有问题的话再重新配置选择第三方库和软件。前面也提到,在编译的过程中会遇到一些编译错误;为了方便排查和处理,构建文件系统时,一步一步进行是比较稳扎稳打的。避免一次性编译太多,出现报错而不知所措。后面在补充配置第三方库或软件的集成。
经过上述配置,基础的buildroot就配置好了,接下来就是编译了。
经过上述配置完后即可进行编译了。编译完成后会生成一个根文件系统压缩包,这个压缩包就可以直接使用了。
编译命令:
注意,一定要加 sudo,而且不能通过-jx 来指定多核编译!!!
sudo make
buildroot 编译的时候会先从网上下载所需的软件源码,有些软件源码可能下载不下来,这个时候就需要我们自行处理。buildroot 编译过程会很耗时,可能需要几个小时,请耐心等待!
笔者是晚上编译的,大约30~60分钟,具体因网络等因素而异。
编译完成后如下图:
编译后的生成的文件在buildroot-2020.05/output/images 目录下:
编译出来了多种格式的 rootfs,比如 ext2、ext4等。其中rootfs.tar 就是打包好的根文件系统,我们测试时使用这个压缩包即可。
笔者的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目录,创建根文件系统存放目录,并将根文件系统文件压缩包复制到该目录后解压,删除压缩包。
在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版本兼容性不足导致,所以到指定版本。
上述bootargs配置完后即可输出”boot“启动。
在终端最后可看到根文件系统挂载成功:
可看到3.3 配置System configuration中设置的欢迎语“Welcome to water_onefu” 和主机名“water_onefu”
因为在3.3 配置System configuration中配置了登录密码,所以哎终端输入用户和密码登录即可:
login:root
Password:water
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
移植一些第三方的库和软件,比如 alsa-lib、alsa-utils 等等,不需要自行移植这些第三方软件和库了,可以直接在 buildroot 里面配置使能。比如我们现在配置使能 alsa-lib、alsa-utils 这两个软件和库。
输入 make menuconfig,打开 buildroot 配置界面,配置路径如下:
Target packages
-> Libraries
-> Audio/Sound
-> -*- alsa-lib ---> 此配置项下的文件全部选中
使能 alsa-utils,路径如下:
Target packages
-> Audio and video applications
-> alsa-utils 此目录下的软件全部选中
上述配置完成后,选择“Save”保存,完后运行编译命令“sudo make FORCE_UNSAFE_CONFIGURE=1”
编译过程会从网上下载一些文件,等待下载后编译完成即可。
将生成的根文件系统压缩包替换到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相关库已编译进文件系统中。后续可使用音视频设备进一步验证播放效果。
修改支持中文显示,主要修改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设备。。。
重启后可能一直卡在上图界面;只需重新上电重启即可。
测试创建中文目录,测试中文文本,均正常。
默认是不配置depmod的,需要配置depmod,后续动态挂载设备驱动需要使用这个命令;
进入buildroot目录下,运行:
sudo make busybox-menuconfig
选中后,重新编译即可。
在第五节中可以看到命令并未像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