Buildroot 构建 Linux 系统

news2024/9/20 20:50:18

Buildroot 是一个工具,以简化和自动化为嵌入式系统构建完整 Linux 系统的过程。使用交叉编译技术,Buildroot 能够生成交叉编译工具链、根文件系统、Linux 内核映像和针对目标设备的引导加载程序。可以独立地使用这些选项的任何组合,例如,可以使用现有的交叉编译工具链,然后使用 Buildroot 构建根文件系统。

Buildroot 特别适用于嵌入式系统开发人员,因为嵌入式系统通常使用不同于常规 x86 处理器的处理器架构,如 PowerPC、MIPS、ARM、RISC-V 等。Buildroot 支持多种处理器及其变种,并为许多常见的开发板提供了默认配置。此外,一些第三方项目基于 Buildroot,或者在 Buildroot 基础上开发其 BSP(板支持包)或 SDK(软件开发工具包)。

Buildroot 是为在 Linux 系统上运行而设计的。虽然 Buildroot 会构建大部分编译所需的宿主包,但一些标准的 Linux 工具预计已经在宿主系统上安装好了。

下面是一些必需包的概述(请注意,包名可能因发行版而异)。

  • which:查找命令的绝对路径。
  • sed:文本流编辑器,用于文本替换和转换。
  • make:自动化构建工具,通过Makefile文件控制编译过程。
  • binutils:包含链接器、汇编器等二进制工具。
  • build-essential(Debian系统):包含编译软件所需的基本包。
  • diffutils:包含diff和patch工具,用于比较和合并文件差异。
  • gcc/g++:GNU编译器集合,用于编译C/C++代码。
  • bash:常用的Unix shell,用于命令行交互和脚本编写。
  • patch:应用补丁文件到原始文件或目录。
  • gzip/bzip2:用于文件压缩和解压缩的工具。
  • perl:通用的文本处理编程语言。
  • tar:打包和解包文件的归档工具。
  • cpio:另一个归档工具,常与tar一起使用。
  • unzip:解压缩zip格式文件的工具。
  • rsync:用于同步文件和目录的增量备份工具。
  • file:确定文件类型的工具。
  • bc:任意精度的计算器语言。
  • findutils:包含find等用于搜索文件的工具。
  • wget:从网络上下载文件的命令行工具。

从 buildroot 目录运行以下命令:

  • $ make menuconfig:使用基于 curses 的原始配置器。
  • $ make nconfig:使用新的基于 curses 的配置器。
  • $ make xconfig:使用基于 Qt 的配置器。
  • $ make gconfig:使用基于 GTK 的配置器

配置工具将生成一个包含整个配置的 .config 文件。这个文件将由顶层 Makefile 读取。

要开始构建过程,请运行以下命令: $ make

下面是 make 命令的一般执行步骤:

  • 下载源文件(如果需要);
  • 配置、构建和安装交叉编译工具链,或者导入一个外部工具链;
  • 配置、构建和安装所选的目标软件包;
  • 构建一个内核映像(可选);
  • 构建一个引导加载程序映像(可选);
  • 创建一个根文件系统,并以所选的格式保存。

Buildroot 的输出存储在一个单独的目录 output/ 中。该目录包含几个子目录:

  • images/ 存储所有映像文件(内核映像、引导加载程序和根文件系统映像)。这些文件是需要放在目标系统上的文件。
  • build/ 存储所有组件的构建结果(包括 Buildroot 在主机上使用的工具和为目标编译的软件包)。该目录为每个组件包含一个子目录。
  • host/ 包含为主机构建的工具,以及目标工具链的系统根。前者是为主机编译的工具的安装,用于 Buildroot 的正确执行,包括交叉编译工具链。后者是类似于根文件系统层次结构的层次结构。它包含所有用户空间软件包的头文件和库,这些软件包提供和安装其他软件包使用的库。然而,该目录并不意味着用作目标的根文件系统:它包含许多开发文件、未剥离的二进制文件和库,使其对于嵌入式系统来说太大了。这些开发文件用于为目标编译依赖于其他库的库和应用程序。
  • staging/ 是指向 host/ 中目标工具链系统根的符号链接,仅用于向后兼容。
  • target/ 包含几乎完整的目标根文件系统:除了 /dev/ 中的设备文件之外,一切都已准备就绪( Buildroot 无法创建它们,因为 Buildroot 不以 root 权限运行,也不希望以 root 权限运行)。另外,它没有正确的权限(例如 busybox 二进制文件的 setuid )。因此,这个目录不应该在目标上使用。相反,应该使用 images/ 目录中构建的任何一个映像。如果需要一个用于通过 NFS 引导的根文件系统的提取映像,则使用在 images/ 中生成的 tarball 映像,并以 root 权限进行提取。与 staging/ 相比,target/ 只包含运行所选目标应用程序所需的文件和库:开发文件(头文件等)未出现,二进制文件被剥离。

这些命令,make menuconfig | nconfig|gconfig | xconfig 和 make,是基本命令,可以轻松快速地生成适合自己需求的映像,包含启用的所有功能和应用程序。

可以用来构建许多常见的嵌入式硬件的系统,如:Lego Mindstorms EV3 和树莓派等。

以树莓派 3B 为例,使用 Buildroot 来构建一个完整的系统,可以遵循以下步骤:

1. 下载并解压 Buildroot

  • 从 Buildroot 官方网站(Buildroot - Making Embedded Linux Easy)下载适合开发环境的 Buildroot 版本。例如,可以选择 buildroot-2020.02.x 或更新的版本。
  • 将下载的 Buildroot 压缩包解压到你的工作目录。

2. 配置 Buildroot

  • 进入解压后的 Buildroot 目录。
  • 执行 make raspberrypi3_defconfig(或根据版本和需要选择适当的配置,如: make raspberrypi3_64_defconfig),使配置生效。这个命令会根据树莓派3B的硬件配置预设一些必要的选项。

  raspberrypi3_defconfig 的文件内容如下:

BR2_arm=y
BR2_cortex_a53=y
BR2_ARM_FPU_NEON_VFPV4=y

# patches
BR2_GLOBAL_PATCH_DIR="board/raspberrypi/patches"
BR2_DOWNLOAD_FORCE_CHECK_HASHES=y

BR2_TOOLCHAIN_BUILDROOT_CXX=y

BR2_SYSTEM_DHCP="eth0"

# Linux headers same as kernel, a 6.1 series
BR2_PACKAGE_HOST_LINUX_HEADERS_CUSTOM_6_1=y

BR2_LINUX_KERNEL=y
BR2_LINUX_KERNEL_CUSTOM_TARBALL=y
BR2_LINUX_KERNEL_CUSTOM_TARBALL_LOCATION="$(call github,raspberrypi,linux,17f135b742c4edb340afb365873c3a574f7e16cb)/linux-17f135b742c4edb340afb365873c3a574f7e16cb.tar.gz"
BR2_LINUX_KERNEL_DEFCONFIG="bcm2709"

# Build the DTB from the kernel sources
BR2_LINUX_KERNEL_DTS_SUPPORT=y
BR2_LINUX_KERNEL_INTREE_DTS_NAME="bcm2710-rpi-3-b bcm2710-rpi-3-b-plus bcm2710-rpi-cm3"

BR2_LINUX_KERNEL_NEEDS_HOST_OPENSSL=y

BR2_PACKAGE_RPI_FIRMWARE=y
BR2_PACKAGE_RPI_FIRMWARE_BOOTCODE_BIN=y
BR2_PACKAGE_RPI_FIRMWARE_VARIANT_PI=y
BR2_PACKAGE_RPI_FIRMWARE_CONFIG_FILE="board/raspberrypi3/config_3.txt"

# Required tools to create the SD image
BR2_PACKAGE_HOST_DOSFSTOOLS=y
BR2_PACKAGE_HOST_GENIMAGE=y
BR2_PACKAGE_HOST_MTOOLS=y

# Filesystem / image
BR2_TARGET_ROOTFS_EXT2=y
BR2_TARGET_ROOTFS_EXT2_4=y
BR2_TARGET_ROOTFS_EXT2_SIZE="120M"
# BR2_TARGET_ROOTFS_TAR is not set
BR2_ROOTFS_POST_BUILD_SCRIPT="board/raspberrypi3/post-build.sh"
BR2_ROOTFS_POST_IMAGE_SCRIPT="board/raspberrypi3/post-image.sh"

# Enable compressed kernel module support
BR2_PACKAGE_BUSYBOX_SHOW_OTHERS=y
BR2_PACKAGE_KMOD_TOOLS=y
BR2_PACKAGE_XZ=y
BR2_PACKAGE_KMOD=y
BR2_PACKAGE_HOST_KMOD_XZ=y

3. 定制系统(可选)

  • 如果需要,可以使用 make menuconfig 命令来图形化地定制系统配置。这包括选择Linux内核版本、用户空间软件包、文件系统类型等。

4. 编译系统

  • 执行 make 命令开始编译。根据电脑配置和选择的软件包数量,编译可能需要一段时间。
  • 编译完成后,在 output/images/ 目录下会生成一个或多个镜像文件,如 sdcard.img

5. 烧录镜像到 SD 卡

  • 使用适当的工具(在 Linux 下使用 dd 命令)将 sdcard.img 文件烧录到一张 SD 卡中。

        $ sudo dd if=output/images/sdcard.img of=/dev/sdX

6. 启动树莓派 3B

  • 将烧录好的 SD 卡插入树莓派 3B 的 SD 卡槽。
  • 连接必要的硬件(如电源、显示器、键盘等)。
  • 启动树莓派 3B,此时应该能够启动并运行通过 Buildroot 构建的系统。

7. 注意事项:

  • 确保开发环境已经安装了所有必要的依赖项和工具,以便能够顺利编译 Buildroot。
  • 在配置和编译过程中,可能需要根据实际情况调整一些选项和参数。
  • 编译完成后,建议进行一些基本的系统测试和验证,以确保系统的稳定性和可用性。

归纳:

通过以上步骤,可以使用 Buildroot 为树莓派 3B 构建一个完整的 Linux 系统。这个系统可以根据需要进行定制和优化,以满足特定的应用场景和需求。同时,Buildroot 还提供了强大的配置和定制能力,使得开发者能够轻松地构建出符合自己需求的嵌入式 Linux 系统。

                                                                                         老徐,2024/7/27

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

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

相关文章

Vitis AI 使用 VAI_Q_PYTORCH 工具

目录 1. 简介 2. 资料汇总 3. 示例解释 3.1 快速上手示例 4. 总结 1. 简介 vai_q_pytorch 是 Vitis AI Quantizer for Pytorch 的缩写,主要作用是优化神经网络模型。它是 Vitis AI 平台的一部分,专注于神经网络的深度压缩。 vai_q_pytorch 的作用…

大数据管理中心设计规划方案(可编辑的43页PPT)

引言:随着企业业务的快速发展,数据量急剧增长,传统数据管理方式已无法满足高效处理和分析大数据的需求。建立一个集数据存储、处理、分析、可视化于一体的大数据管理中心,提升数据处理能力,加速业务决策过程&#xff0…

Spring Boot:图书管理系统(一)

1.编写用户登录接口 代码: package com.example.demo;import jakarta.servlet.http.HttpSession; import org.springframework.util.StringUtils; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotatio…

HarmonyOS和OpenHarmony区别联系

前言 相信我们在刚开始接触鸿蒙开发的时候经常看到HarmonyOS和OpenHarmony频繁的出现在文章和文档之中,那么这两个名词分别是什么意思,他们之间又有什么联系呢?本文将通过现有的文章和网站内容并与Google的AOSP和Android做对比,带…

Vue.js 2 项目实战(五):水果购物车

前言 Vue.js 是一个用于构建用户界面的渐进式 JavaScript 框架。它的设计目标是通过采用易于上手的结构和强大的功能,使前端开发变得更加简便和高效。以下是 Vue.js 的一些关键特性和优点: 核心特性 声明式渲染 Vue.js 使用声明式语法来描述用户界面&a…

AI周报(7.21-7.27)

AI应用-一款能提供情绪价值的智能鸟类喂食器(Bird Buddy) 图像识别技术:Bird Buddy装备了图像识别技术,能够识别超过1000种鸟类,涵盖了常见的鸟类品种。这种技术能够在鸟类经过时,通过内置麦克风捕捉的声音…

PID 控制实验 - 整定实验

Arduino PID Arduino-PID-LibraryArduino-PID-AutoTune-Library PID控制实验 – 制作测试台 PID Control Experiment – Making the Testing Rig PID (Proportional, Integral, Derivative) control is a classic control algorithm that I have used for a few projects,…

Debug-018-elementUI-el-tree中通过CSS隐藏任意一项的选择框checkbox

前情提要: 我们项目中使用的是elementUI,业务中经常需要使用到el-tree组件去实现一些有层级关系的功能。现在有一个需求描述一下:首先是这个el-tree是个有checkbox的树,每一子节点都可以被选择,用于去实现一些系统的权…

Shell编程之正则表达式与文本三剑客

目录 一、正则表达式 1.引言--什么是正则表达式 1.1正则表达式的功能 2.基础正则表达式(BRE) 2.1特殊字符 2.2定位符 2.3非打印字符 3.扩展正则表达式(ERE) 4.元字符操作的案列 二、命令小工具 1.cut:列截取工具 2.sort排序 …

vue3获取、设置元素高度

前言 在web端常见的需求场景中,会经常遇到table表格需要根据页面可视区域使高度自适应的情况。 傻喵(作者本人)昨天在尝试使用vue3实现这个需求时,看了几篇网上写的回答,都不太全面,所以干脆自己写个总结吧.(第一次写&#xff0c…

深入探讨 I/O 多路复用:提升系统 I/O 效率的关键技术

摘要 I/O(输入/输出)操作是计算机系统中不可或缺的一部分,而 I/O 多路复用技术则是提高系统 I/O 效率的重要手段。本文将浅谈 I/O 的基本概念,重点探讨 I/O 多路复用技术的原理、优势以及在现代系统中的应用。 引言 在现代计算…

php收银系统源码-收银员操作权限

收银系统是很多门店,尤其是连锁门店营业的必备工具,收银员每天需要通过收银系统记录商品的售卖数量,以及收款,会员开卡,核销订单等工作。但很多门店都不希望给收银员太高的权限,自然就离不开收银员的权限管…

flask开启调试模式,热部署

这里写自定义目录标题 功能快捷键 什么是热部署?简单说就是你程序改了,现在要重新启动服务器,嫌麻烦?不用重启,服务器会自己悄悄的把更新后的程序给重新加载一遍,这就是热部署(抄的)…

NameSilo域名注册和解析2024版教程(附优惠码)

上次给大家介绍了国外知名的域名注册商Dynadot,今天再给大家分享另一家国外知名的域名注册商NameSilo,同样性价比很高。使用本站提供的优惠码:ieearn.com,你还可以在首次注册购买域名时享受1美元的优惠: NameSilo简介…

10 VUE Element

文章目录 VUE1、概述2、快速入门3、Vue 指令4、生命周期5、案例 Elemant1、快速入门2、Element 布局3、常用组件-案例 VUE 1、概述 Vue 是一套前端框架,免除原生JavaScript中的DOM操作,简化书写基于MVVM(Model-View-ViewModel)思想,实现数据…

AI机器人本地免费部署(部署Llama 3.1详细教程)

昨日,Meta公司发布了人工智能模型——Llama 3.1。 那么Llama 3.1 405B的效果怎么样?我们来对比一张图,横向对比一下GPT-4。 可以看出,Llama 3.1 405B在各类任务中的表现可以与GPT-4等顶级的模型相差无几。 那么,我们…

4G新型智能电表是什么?

4G新型智能电表是一种利用第四代移动通信技术(4G)进行数据传输的先进计量设备。它不仅具备传统电表的基本功能,如电量计量,还能实现远程抄表、用电监控、故障检测等多种智能化服务。本文旨在详细介绍4G新型智能电表的技术特点、优势及应用场景。 一、4G…

【C++刷题】优选算法——队列+宽搜

N 叉树的层序遍历 vector<vector<int>> levelOrder(Node* root) {vector<vector<int>> ret;if (root nullptr) return ret;queue<Node*> q;q.push(root);ret.push_back({root->val});int size 1;while (!q.empty()) {vector<int> v…

03。正式拿捏ArkTS语言第一天

1, 打印日志命令 &#xff1a; console.log() 2, 三种基本数据类型&#xff1a; number 数字类型 &#xff08;数字&#xff09; string 字符串类型&#xff08;例如&#xff1a;“我是字符串”&#xff09; boolean 布尔类型 (true 或者 false) ***…

宝塔Docker部署Nuxt3 BBS项目

体验地址 BBS&#xff1a;http://bbs.sourcebyte.vip Nuxt3&#xff1a;https://nuxt.com.cn BBS项目介绍 BBS是开源字节最新研发的社区项目&#xff0c;包含产品中心&#xff0c;需求墙&#xff0c;工具&#xff0c;资讯4大板块。 1、产品中心&#xff1a;开源字节有众多…