Buildroot系统构建学习笔记(以百问网imx6ullPro开发板为例)

news2025/1/12 17:16:33

一、Builroot是什么?

Buildroot是一组Makefile和补丁,可简化并自动化地为嵌入式系统构建完整的、可启动的Linux环境(包括bootloaderLinux内核、包含各种APP的文件系统)。Buildroot运行于Linux平台,可以使用交叉编译工具为多个目标板构建嵌入式Linux平台。Buildroot可以自动构建所需的交叉编译工具链,创建根文件系统,编译Linux内核映像,并生成引导加载程序用于目标嵌入式系统,或者它可以执行这些步骤的任何独立组合。例如,可以单独使用已安装的交叉编译工具链,而Buildroot仅创建根文件系统。

二、Buildroot目录架构 

三、Buildroot常用操作 

 四、基于百问网imx6ullPro开发实践

Buildroot 的配置选项简单介绍如下:

1.Target options 目标板的配置

目标选项。包括处理器体系结构、二进制文件格式、架构系列、ABI、浮点运算、指令集。

对应到我这里使用的I.MX6ULL,它的CPU架构是cortex-A7架构。

你如果用的是I.MX6D,那它对应的就是cortex-A9架构。

  • Target Architecture:目标架构,这里选择 ARM(little endian),ARM小端模式
  •  Target Binary Format:二进制格式,为 ELF
  • Target Architecture Variant:架构变体为 arm920t,内核类型
  • Target AB1:应用程序二进制接口,为EABI
  • Floating point strategy:浮点数的策略,选择为 NEON/VFPv4
  • ARM instruction set: arm 汇编指令集,选择 ARM

2.Build options

主要是一些编译时用到的选项,比如dl的路径,下载代码包使用的路径,同时运行多个编译的上限,是否使能编译器缓冲区等等,这里按照默认就行了.

3.Toolchain 工具链选项

交叉编译链。选择哪种编译链,包括 Buildroot 自身提供的和外部。

  • 内部工具链后端(internal toolchain backend), 在配置中称为 Buildroot toolchain
  • 外部工具链后端(external toolchain backend),在配置中称为 External toolchain

(1)内部工具链后端(internal toolchain backend)

内部工具链后端是 Buildroot 自己用来编译交叉编译工具链的后端,Buildroot 会在开始为目标系统编译东西之前,先为自己编译一个交叉编译工具链。

  • 该后端支持多种 C 库:uClibc-ng, glibc, musl、
  • 修改用来编译工具链的 Linux 内核头文件。编译交叉编译工具链的时候也会编译 C 库,C 库会提供从用户空间到内核的接口,而内核对外的系统调用、数据结构就写在内核头文件中,因此需要用头文件来编译 C 库,才能确保接口能够正常工作。因为内核对外的接口是向后兼容的,所以用来编译工具链的 Linux 内核头文件也并不是一定要和目标设备上要运行的内核版本完全一致,这些头文件的版本比实际使用的内核版本旧一点也没什么问题,但反过来就不行了——那样编出来的 C 库可能会用到内核没有提供的接口;
  • 修改 GCC、binutils、C 库的版本;
  • 选择一系列的工具链选项(仅 uClibc ):比如工具链是否要有 RPC 支持(主要用于 NFS),宽字符(wide-char)支持、本地化支持、C++ 以及多线程支持。修改这些选项会影响后续在 Buildroot 中可选的应用和库。还可以使用 make uclibc-menuconfig 来更细粒度地控制 C 库特性。
  • 注意:只要上面这些选项中有一个发生变化,那么就需要重新构建整个工具链和系统。

   此类后端的优点:

  • 与 Buildroot 完美集成
  • 速度快,只编译了必要的部分
  • 当进行 make clean 的时候需要重新构建工具链,非常耗时。如果想加快速度。建议使用外部工具链后端。

(2)外部工具链后端(external toolchain backend)

      外部工具链后端支持使用预编译好的交叉编译工具链。Buildroot 已经预先配置了一些常见的交叉编译工具链(用于 ARM 的 Linaro、用于 ARM 的 Sourcey CodeBench, x86-64, PowerPC, MIPS 等),Buildroot 可以自动下载这些与配置好的工具链,也可以直接使用已有的定制工具链。
有三种方式来使用外部工具链:
  • 让 Buildroot 基于预定义的外部工具链 profile 自动下载、安装。在 Toolchain 中选择已有的 profile 即可。
  • 为 Buildroot 手动指定提前安装好的、预定义了 profile 的工具链。在 Toolchain 中选择 profile 后,反选掉 Download toolchain automatically 并在 Toolchain path 中填写已有工具链路径即可。
  • 使用定制的外部工具链。通常用于使用 crosstool-NG 或 Buildroot 生成的已有定制工具链。选择 Toolchain 列表中的 Custom toolchain ,然后填写 Toolchain pathToolchain prefixExternal toolchain C librrary 选项。若外部工具链使用 glibc 库,只需要选择工具链是否支持 C++ 以及是否内建 RPC 支持即可。如果使用 uClibc 库,则还有宽字符、本地化、程序 invocation、线程支持等选项
  • 可以使用已经很成熟的已有工具链。
  • 不用在编译工具链上面再花(非常多的)时间了。
  • 除非是自己编的,否则如果工具链有 bug 则会非常难修。

(3)使用 Buildroot 构建外部工具链

  • 按照下面的步骤,可以创建一个外部工具链并打包

    新建 Buildroot 配置:

  • 为目标 CPU 架构选择对应的 Target options
  • 在 Toolchain 菜单中,Toolchain type 项选 Buildroot toolchain
  • 在 System configuration 菜单中, Init system 项选 None ,/bin/sh 也选 none
  • 在 Target packages 菜单中,不要启用 BusyBox
  • 在 Filesystem image 菜单中,不要启用 tar the root filesystem
  • 将 Toolchain type 选为 External toolchain
  • 将 Toolchain 选为 Custom toolchain
  • 将 Toolchain origin 选择 Toolchain to be downloaded and installed
  • 将 Toolchain URL 写为 file:///到sdk的tar包路径.tar.gz

4.配置 System configuration

 用于设置一些系统配置,比如开发板名字、欢迎语、用户名、密码等。

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

5.配置 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 

6、禁止编译 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 选项! 

7.配置 Target packages

此选项用于配置要选择的第三方库或软件、比如 alsa-utils、ffmpeg、iperf、ftp、ssh等工具,可以按需选择。

配置完成以后就可以编译 buildroot 了,编译完成以后 buildroot 就会生成编译出来的根文件系统压缩包,我们可以直接使用。输入如下命令开始编译:

sudo make //注意,一定要加 sudo,而且不能通过-jx 来指定多核编译!!! 

buildroot 编译过程会很耗时,请耐心等待!编译完成以后就会在 buildroot-2019.02.6/output/images 下生成根文件系统,即可使用。

编译过程需要一定的额外内存,注意需要留好内存,否则会报错如下:

g++: internal compiler error: Killed (program cc1plus) 
Please submit a full bug report 

8.buildroot 下的 busybox 配置

buildroot 在构建根文件系统的时候也是要用到 busybox 的,既然用到了 busybox 那么就涉及到 busybox 的配置。buildroot 会自动下载 busybox 压缩包,buildroot 下载的源码压缩包都存放在/dl 目录下,在 dl 目录下就有一个叫做“busybox”的文件夹,此目录下保存着 busybox 压缩包。

在 buildroot下打开 busybox 的配置界面输入如下命令:

sudo make busybox-menuconfig 

输入以后就会打开 buildroot 下的 busybox 配置界面,需要什么功能,使能即可。可以在busybox中修改文件,使其对中文支持,这一点可以百度设置。

编译完毕以后,会生成 rootfs.tar,拷贝出来以后,可以对其进行解压然后使用nfs挂载到板子上,或者直接使用SD卡烧录。编译出来的文件系统即可使用,如果需要什么命令和工具,在 make menuconfig 中使能再次编译即可。

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

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

相关文章

c++|list使用及深度剖析模拟实现

目录 一、list介绍与使用 1.1 list介绍 1.2 list的使用 1.2.1list的构造 1.2.2iterator 1.2.3容量 1.2.4元素访问 1.2.5 元素修改 二、list的深度剖析及模拟实现 三、list与vector的对比 一、list介绍与使用 1.1 list介绍 ①list底层是带头双向循环链表,在…

Redis进阶——BitMap用户签到HyperLogLog实现UV统计

目录 用户签到实现签到功能 签到统计HyperLogLog实现UV统计UV和PV的概述测试百万数据的统计 用户签到 BitMap功能演示 我们针对签到功能完全可以通过MySQL来完成,例如下面这张表 用户签到一次,就是一条记录,假如有1000W用户,平…

RCE漏洞及其绕过——[SWPUCTF 2021 新生赛]easyrce、caidao、babyrce

目录 什么是Shell 1、Shell简介 2、印刷约定 一、什么是RCE 漏洞产生条件: 漏洞检测: 1.远程命令执行 system()函数: passthru()函数: exec()函数: 无回显 shell_exec()函数: 2.远程代码执行 e…

我们一起看看《看漫画学C++》中如何讲解对象的动态创建与销毁

《看漫画学C》这本书中会用图文的方式生动地解释对象的动态创建与销毁。在C中,动态创建对象是通过new运算符来实现的,而销毁对象则是通过delete运算符来完成的。这种方式可以让程序在需要时分配内存给对象,并在对象不再需要时释放内存&#x…

「Word 论文排版」插入分节符导致word转PDF后出现空白页

问题 word转PDF后出现空白页 解决 但是此方法会让页面页脚标记出错 TODO 如下图所示 在论文目录后有一个分节符,转成PDF之后就多了一个空白页 文件-打印-页面设置-选中封面那一页-版式-从偶数页开始 再导出空白页就没了

Nginx莫名奇妙返回了404

描述 nginx作为反向代理,代理python的服务,但是通过代理访问服务的时候,报了404的错误。 难受的是客户现场没有查看日志的权限,只有查看配置文件的权限,我们检测了几遍配置文件也没有找到问题,哎~ 问题引…

34. 【Android教程】菜单:Menu

作为 Android 用户,你一定见过类似这样的页面: 它就是我们今天的主角——菜单,它的使用场景和作用不用多说,几乎每个 App 都会用到它,今天我们就一起来看看 Android 提供的几种菜单类型及用法。 1. 菜单的几种类型 根…

[Algorithm][滑动窗口][无重复字符的最长字串][最大连续的一个数 Ⅲ][将x减到0的最小操作数]详细讲解

目录 1.无重复字符的最长字串1.题目链接2.算法原理详解3.代码实现 2.最大连续的一个数 Ⅲ1.题目链接2.算法原理详解3.代码实现 3.将x减到0的最小操作数1.题目链接2.算法原理详解3.代码实现 1.无重复字符的最长字串 1.题目链接 无重复字符的最长字串 2.算法原理详解 研究的对…

美化博客文章(持续更新)

🎁个人主页:我们的五年 🔍系列专栏:游戏实现:贪吃蛇​​​​​​ 🌷追光的人,终会万丈光芒 前言: 该文提供我的一些文章设计的一些方法 目录 1.应用超链接 1.应用超链接

URL GET +号后台接收成空格

问题:参数spdmwhbs001 其中包含URL特殊符号 如果用GET请求方式不做任何不处理那么浏览器自动将转为%20 请求链接为 details?spdmwhbs%20001&limitKcysType1 后台接收到的参数为 whbs 001 ,自动将号转成空格了。 尝试解决(失败&#…

使用FastDDS编译IDL文件

1.安装FastDDS环境 Ubuntu22.04 1.1安装依赖的软件 sudo apt-get update //基础工具安装 sudo apt install cmake g python3-pip wget git //Asio 是一个用于网络和低级 I/O 编程的跨平台C库,它提供了一致的 异步模型。 TinyXML2是一个简单,小巧&…

400电话如何对接配置SIP

400电话对接配置SIP的基本步骤 要配置400电话对接SIP,通常需要遵循以下基本步骤: 注册和认证:首先需要在相应的云通信平台上注册账号,并进行企业实名认证。 开通语音服务:在通过认证后,需要开通语音服务&…

C# winform s7.net expected 22 bytes.”

S7.Net.PlcException:“Received 12 bytes: 32-02-00-00-00-00-00-00-00-00-81-04, expected 22 bytes.” 原因是博图的连接机制未勾选

Java编程题 | 数组元素交换

大家可以关注一下专栏,方便大家需要的时候直接查找,专栏将持续更新~ 题目描述 编写一个Java程序,输入一个整数数组,将最大的元素与第一个元素交换,最小的元素与最后一个元素交换,然后输出修改后的数组…

数据结构从入门到实战——顺序表的应用

目录 一、基于动态顺序表实现通讯录 二、代码实现 2.1 通讯录的初始化 2.2 通讯录的销毁 2.3 通讯录的展示 2.4 通讯录添加联系人信息 2.5 通讯录删除联系人信息 2.6 通讯录修改联系人信息 2.7 通讯录的查找联系人信息 2.8 将通讯录中联系人信息保存到文件中 2.9…

【Qt】设置QT标准对话框为中文字体

设置QT标准对话框为中文字体 一、问题二、解决方法1、找到Qt内置的翻译文件 qt_zh_CN.qm2、在代码中加载该文件 一、问题 在Qt中我们使用的标准对话框都是英文,例如下面的 字体选择对话框,但是实际中我们需要构建的是中文对话框。 所以我们需要使用Qt官…

【redis】hash和list常用命令

hash类型 Redis自身已经是键值对结构了。Redis自身的键值对就是通过哈希的方式来组织的。 把key这一层组织完成之后,到了value这一层。value的其中一种类型还可以再是哈希。哈希类型中的映射关系通常称为field-value,用于区分Redis整体的键值对(key-value)。注意这里的 value…

为什么创业总是小部分人能成功?

每年都有大批量应届生等待就业,同时,也有一大批大龄中青人正在面临失业。在这种焦虑,内卷的氛围下,就会激发一波又一波的人走上创业的道路。想靠创业改变命运。辞职之后,第一时间能想到的创业方式要么就是就是 开个奶茶…

阿里云ECS服务器安装docker

首先查看阿里云ECS的服务器的版本 cat /etc/redhat-release如果是Alibaba Cloud Linux release 3,请执行以下命令 添加docker-ce的dnf源。 sudo dnf config-manager --add-repohttps://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo安装Alibaba Cloud Linux 3专…

【若依前后端分离】仪表盘绘制

示例&#xff1a; 代码&#xff1a; InstrumentPanel.vue组件 <template><div><!-- 在这里放置你的图表组件 --><div ref"echarts" style"width: 100%; height: 400px;"></div></div> </template><script&g…