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

news2024/11/26 2:55:43

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

  • 一、前言
  • 二、 buildroot 下载
  • 三、配置buildroot基础参数
    • 3.1 配置Target options
    • 3.2 配置Toolchain
    • 3.3 配置System configuration
    • 3.4 配置Filesystem images
    • 3.5 禁止编译 Linux 内核和 uboot
    • 3.6 配置 Target packages
  • 四、编译buildroot
  • 五、运行验证根文件系统
    • 5.1 将文件系统放到nfs目录下
    • 5.2 在uboot中配置nfs挂载根文件系统
    • 5.3 运行
  • 六、报错处理
  • 七、其它功能补充
    • 7.1 buildroot 第三方软件和库的配置
      • 7.1.1使能 alsa-lib
      • 7.1.2 使能 alsa-utils
      • 7.1.3 保存配置编译
      • 7.1.3 运行验证
    • 7.2修改支持中文字符
    • 7.3命令行显示完整路径

一、前言

本章节讲解的是使用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命令行显示完整路径

在第五节中可以看到命令并未像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。
在这里插入图片描述
可看到命令已完全显示路径。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/499078.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

音频大模型导读

1 介绍 本次分享包含音频压缩,语音识别,语音合成,以及近两年来大模型在音频领域的应用,涉及八篇论文和一个近期github霸榜的语音合成工具。 结果如下图所示:(图链接:audio_llm) 共…

Grafana 系列-统一展示-2-Prometheus 数据源

系列文章 Grafana 系列文章 Grafana Prometheus 数据源 Grafana 提供了对 Prometheus 的内置支持。本文会介绍 Grafana Prometheus(也包括 Prometheus 的兼容实现,如 Thanos, Mimir 等) 数据源的部分选项、变量 (Variable)、查询 (Query) …

API接口获取商品数据

作为一名技术爱好者,我们总会遇到各种各样的技术问题,需要寻找合适的技术解决方案。而在互联网时代,我们可以快速通过搜索引擎获取丰富的技术资源和解决方案。然而,在不同的技术分享中,我们常常会遇到质量参差不齐的文…

文献阅读:LaMDA: Language Models for Dialog Applications

文献阅读:LaMDA: Language Models for Dialog Applications 1. 工作简介2. 具体工作 1. 模型训练 1. 模型预训练2. finetune 2. 模型评估 1. SSI2. Safety3. Groundness4. Helpfulness5. Role Consistency 3. 实验结果整理4. 结论 & 思考 https://arxiv.org/a…

软件架构与设计模式复习笔记

考纲(张友生版本软件架构 考试题型: 10*3单选 5*3简答题 5*3设计图(含画图) 10*2 论述题 10*2综合题 复习以课件为主,书为辅 第一章 (软件危机) ? ? 构造模型与实现 掌握软件结构体系核心模型 第二章 软件体…

PBDB Data Service:Icon images of lifeforms(生命形式的图标图像)

Thumbnail images of lifeforms(生命形式的图标图像) 描述用法参数方法响应值格式术语表 描述 此操作返回表示指定分类的图像,或关于图像的信息。如果后缀是 .png,则返回图像内容数据。否则,将以指定的格式返回一个描…

【力扣-232.】用栈实现队列

🖊作者 : D. Star. 📘专栏 : 数据结构 😆今日分享 :“多看效应”-----对越熟悉的东西越喜欢的现象,心理学上称为“多看效应”。多看效应不仅仅是在心理学实验中才出现,在生活中,人们也常常能发现这种现象。…

HashMap 底层原理///HashMap详解

HashMap超详细探讨 总述从集合出发探讨HashMapCollection接口继承树Map接口继承树 从Map接口来,一步一步深入其中Map接口概述Map接口:常用方法Map接口 Map实现类之一:HashMapHashMap的存储结构HashMap源码中的重要常量JDK 1.8之前JDK 1.8总结…

阿里云CPU性能AMD EPYC Genoa 9T34处理器主频3.4 GHz

阿里云AMD服务器CPUAMD EPYC Genoa 9T34处理器,主频3.4 GHz,单核睿频最高3.75 GHz,计算性能稳定,阿里云服务器网分享AMD EPYC Genoa 9T34性能测评: AMD EPYC Genoa 9T34 阿里云AMD服务器性能增强通用型g8ae、计算平衡…

【容器化】Docker 简介和安装

【容器化】Docker 简介和安装 DockerDocker的应用场景Docker 的优点1、快速,一致地交付您的应用程序2、响应式部署和扩展3、在同一硬件上运行更多工作负载 Docker 架构Docker 安装Ubuntu Docker 、Debian Docker 安装使用官方安装脚本自动安装手动安装使用 Shell 脚…

渲染流水线 相关知识总结

目录 抽象理解渲染过程详细介绍各个渲染步骤1. 应用阶段1.1设置场景数据1.2 Culling 粗粒度剔除1.3 渲染设置1.4 传递几何信息1.5 调用DrawCall 2. 几何阶段2.1 几何着色器2.2 可选着色器2.3 投影变换 projection2.4 裁切 Clipping2.5 屏幕映射 ScreenMapping 3. 光栅化阶段3.1…

C++ Primer阅读笔记--返回类型和return语句

1--返回引用 同其他引用类型一样,如果函数返回引用,则该引用仅是所引对象的一个别名;则返回结果时不会发生拷贝操作; 不能返回局部对象的引用或指针;因为局部对象在函数结束后会被释放,从而其引用或指针将指…

【第六篇:测试左移-研发流程优化】

(1)规范了技术需求的研发流程(和产品需求一样走相同的流程,只不过需求的主R变为了RD) (2)规范了需求变更流程:需求变更要合理并做到全员周知; (3)强调冒烟不过,提测打回流程; (4)增加交互视觉评审环节,方便RD更合理估时; (5)规范回归测试流程,回归测试时需…

PbootCMS Sqlite数据库转Mysql数据库教程 sqlite转mysql

PbootCMS默认采用的是Sqlite数据库,系统自带完整后台以及一套响应式模板,放入PHP(5.3+)环境即可直接使用 线上搭建简易环境为:Apache 、 PHP5.6-PHP7.3 、 Mysql5.5+ 所以如果已经上线一段时间了,网站已经有较多内容后要想换成Mysql版本是很不方便的,以下就是快速将Mys…

WebSocket的那些事(2-实操篇)

目录 一、概述二、Websocket API1、引入相关依赖2、配置WebSocket处理器3、WebSocket配置4、测试 三、总结 一、概述 在上一节 WebSocket的那些事(1-概念篇)中我们简单的介绍了关于WebSocket协议的相关概念、与HTTP的联系区别等等。 这一节将会带来Web…

BM59-N皇后问题

题目 N 皇后问题是指在 n * n 的棋盘上要摆 n 个皇后。 要求:任何两个皇后不同行,不同列也不在同一条斜线上。 求给一个整数 n ,返回 n 皇后的摆法数。 数据范围: 1≤n≤9。 要求:空间复杂度 O(1) ,时间复杂度 O(…

牛客 NC24724 Feb S]Chocolate Eating 解题报告

原题链接&#xff1a; 登录—专业IT笔试面试备考平台_牛客网 题目描述&#xff1a; 链接&#xff1a;登录—专业IT笔试面试备考平台_牛客网 来源&#xff1a;牛客网 题目描述 Bessie has received N (1 < N < 50,000) chocolates from the bulls, but doesnt want to …

Notepad++ 配置python环境及虚拟环境

背景&#xff1a; 在执行某些项目的时候&#xff0c;经常会否遇到这样一种情况(以python语言为例)&#xff1a;不想在python的基础环境下运行&#xff0c;创建了虚拟环境来装相关项目的包&#xff0c;但是每次使用都要切换到虚拟环境下面使用"activate "命令激活环境…

C++linux高并发服务器项目实践 day8

Clinux高并发服务器项目实践 day8 内存映射内存映射相关系统调用例子思考问题案例2案例3 信号信号的5中默认处理动作信号相关函数kill、raise和abort函数alarm函数案例 setitimer函数 signal信号捕捉函数 内存映射 内存映射是将磁盘文件的数据映射到内存&#xff0c;用户通过修…

Spring MVC数据格式化与验证以及国际化和中文乱码处理

目录 Spring MVC数据格式化 基本介绍 ConversionService converters 基本数据类型和字符串自动转换 代码实例 -页面演示方式 创建Monster 类 创建data_valid.jsp 创建MonsterHandler类 创建monster_addUI.jsp 解读: 说明 阶段测试一下 ​编辑 继续完成功能 创建s…