嵌入式Linux驱动笔记(二十三)------使用buidroot构建文件系统

2023-11-08

你好!这里是风筝的博客,
欢迎和我一起交流。

所有的buidroot使用问题都可以看这个在线使用文档:https://buildroot.org/downloads/manual/manual.html#_about_buildroot

  Buildroot是一种使用交叉编译简化和自动化为嵌入式系统构建完整Linux系统的过程的工具。
  为了实现这一点,Buildroot能够为您的目标生成交叉编译工具链,根文件系统,Linux内核映像和引导加载程序。Buildroot可以独立地用于这些选项的任意组合(例如,您可以使用现有的交叉编译工具链,并仅使用Buildroot构建根文件系统)。

  如上所述,Buildroot基本上是一组Makefiles,可以使用正确的选项下载,配置和编译软件。它还包括各种软件包补丁-主要参与的交叉编译工具链的那些(gcc,binutils和 uClibc)。

  toolchain/目录包含Makefile文件和相关文件的有关交叉编译工具链的所有软件:binutils,gcc,gdb, kernel-headers和uClibc。
  arch/目录包含Buildroot支持的所有处理器体系结构的定义。
  package/目录包含所有用户空间工具和库的Makefile和相关文件,Buildroot可以编译并添加到目标根文件系统。每个包有一个子目录。
  linux/目录包含Linux内核的Makefile和相关文件。
  boot/目录包含Buildroot支持的引导加载程序的Makefile和关联文件。
  system/目录包含对系统集成的支持,例如目标文件系统框架和init系统的选择。(存放着文件系统目录的和设备节点的模板,这些模板会被拷贝到output/目录下,用于制作根文件系统rootfs
  fs/目录包含与生成目标根文件系统映像相关的软件的Makefile和相关文件。
  configs/目录放置开发板的一些配置文件。
  dl/目录存在从官网上下载的开源软件包,第一次下载后,下次就不会再去从官网下载了,而是从dl/目录下拿开源包,以节约时间。

每个package目录至少包含2个文件:
  something.mk是下载,配置,编译和安装包的Makefile something。
  Config.in是配置工具描述文件的一部分。它描述了与包相关的选项

重要提示:您可以而且应该以普通用户身份构建所有内容。无需root用户即可配置和使用Buildroot。通过以常规用户身份运行所有命令,可以保护系统免受在编译和安装期间表现不佳的程序包的影响。

  使用Buildroot的第一步是创建配置。Buildroot有一个很好的配置工具,类似于Linux内核或 BusyBox中的配置工具。
从buildroot目录中运行

make ARCH=arm menuconfig

因为我们只是构建根文件系统,就直接修改默认配置了,否则可以选择对应的板子,如:make mini2440_defconfig
当然,也可以使用:make list-defconfigs 命令查看支持的板子。

toolchain设置
进入Toolchain选项:
Toolchain —>
  Toolchain type (External toolchain) —> (设定采用自己定义的交叉编译工具)
  Toolchain (Custom toolchain) —>
  Toolchain origin (Pre-installed toolchain) —>(预先安装了交叉编译工具)
  (/opt/FriendlyARM/toolchain/4.9.3/) Toolchain path (设定自定义交叉编译工具的路径)
   ($(ARCH)-linux) Toolchain prefix (设置toolchain的前缀)
   External toolchain gcc version (4.9.x) —>(设置toolchain的版本)
  External toolchain kernel headers series (3.10.x) —> (最好选用与平台所用的linux版本一致的headers,具体还要看交叉编译工具是否支持)
  External toolchain C library (glibc/eglibc) —> (选择自定义交叉编译工具所用的C库)
  [* ] Toolchain has SSP support? (根据报错选上的)
  [* ] Toolchain has RPC support? (根据报错选上的)
  [*] Toolchain has C++ support? (支持C++)

我的toolchain版本是4.9.3,Linux header可以自行查看:就在version.h里,199261是十进制,换成十六进制即可发现是3.10版本
version
toolchain
Target options设置
Target options —>
  Target Architecture (ARM (little endian)) —>(小端模式)
  Target Binary Format (ELF) —>(二进制格式是ELF)
  Target Architecture Variant (cortex-A7) —>(我的板子CPU是a7)
  Target ABI (EABIhf) —> (支持EABIhf)
  Floating point strategy (VFPv4-D16) —> (浮点处理采用VFP-v4)
  ARM instruction set (Thumb2) —> (采用精简指令集Thumb2)
这部分是按自己的板子来设置的:
cpu
CPU target

System configuration设置
System configuration —>
  (buildroot) System hostname (设置主机名)
  (Welcome to Buildroot) System banner (输入欢迎语)
  Init system (BusyBox) —>
  /dev management (Dynamic using devtmpfs + mdev) —>(使用mdev动态加载设备节点的方式,devtmpfs是Linux内核中的一个虚拟文件系统,需要启用内核配置选项: CONFIG_DEVTMPFS和CONFIG_DEVTMPFS_MOUNT
  () Root password(进入linux控制台终端后的密码)
  [*] remount root filesystem read-write during boot(可以进行动态的挂载)
  Run a getty (login prompt) after boot —>
    (console) TTY port(设置成串口登陆的设备节点)
    Baudrate (115200) —> (设置波特率)
system

Filesystem images设置
Filesystem images —>
  [*] ext2/3/4 root filesystem
    ext2/3/4 variant (ext4) —>

  [*] tar the root filesystem
    Compression method (no compression) —>
filesystem
不编译kernel
Kernel—>
  [] Linux Kernel 不选

不编译U-BOOT
Bootloaders —>
  [] U-Boot 不选

Target packages设置
Target packages —> : 按自己需求增加或裁剪Target packages,里面包含了一大堆第三方的开源工具和库,包括常用的busybox的选用、音频、网络等。一切都是按自己需求来配置。
在许多程序中,BusyBox具有基本init程序的实现,这对于大多数嵌入式系统来说已经足够了。启用BR2_INIT_BUSYBOX将确保BusyBox将构建和安装其init程序。这是Buildroot中的默认解决方案。BusyBox init程序将/etc/inittab在启动时读取文件以了解如何操作。

配置完所有内容后,配置工具将生成.config包含整个配置的 文件。该文件将由顶级Makefile读取。
要开始构建过程,只需运行:

make

编译过程中要联网,因为可能需要下载一些packages。

编译后生成的文件夹格式的rootfs在buildroot/output/images/rootfs.tar。先创建一个文件夹作为根文件目录,我们将rootfs.tar解压到这个文件内,得到的就是一个完整的可以工作的文件夹形式的rootfs了

你永远不应该使用make -jN与Buildroot里面:目前不支持顶级并行make。相反,使用该BR2_JLEVEL选项告诉Buildroot运行每个包的编译make -jN。

Buildroot输出存储在一个目录中output/。该目录包含几个子目录:
images/其中存储了所有images(内核 image,引导加载程序和根文件系统 image)。这些是您需要放在目标系统上的文件。
ibuild//构建所有组件的位置(包括主机上Buildroot所需的工具和为目标编译的包)。该目录包含每个组件的一个子目录。
staging/其中包含类似于根文件系统层次结构的层次结构。此目录包含交叉编译工具链的标头和库以及为目标选择的所有用户空间包。但是,此目录不是目标的根文件系统:它包含许多开发文件,未被剥离的二进制文件和库,这使得它对于嵌入式系统来说太大了。这些开发文件用于编译依赖于其他库的目标库和应用程序。
target/它几乎包含了目标的完整根文件系统:除了/ dev /中的设备文件外,所有需要的东西都存在(Buildroot无法创建它们,因为Buildroot不以root身份运行,也不想以root身份运行)。此外,它没有正确的权限(例如busybox二进制文件的setuid)。因此,不应在目标上使用此目录 。相反,您应该使用images/目录中内置的一个图像。如果需要提取的根文件系统映像以通过NFS引导,则使用生成的tarball映像images/并以root身份提取它。相比staging/,target/ 仅包含运行所选目标应用程序所需的文件和库:开发文件(标题等)不存在,二进制文件被剥离。
host/ 包含为正确执行Buildroot所需的为主机编译的工具的安装,包括交叉编译工具链。

其中每次开机都要登录,太麻烦了,我们修改根文件系统:
vi etc/inittab

console::respawn:/sbin/getty -L  console 115200 vt100 # GENERIC_SERIAL

这一行注释掉,替换成:

console::respawn:-/bin/sh

保存重启即可。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

嵌入式Linux驱动笔记(二十三)------使用buidroot构建文件系统 的相关文章

  • Linux:如何从特定端口发送TCP数据包?

    如何打开原始套接字以从特定 TCP 端口发送 我希望所有连接始终来自临时端口以下的一系列端口 如果您正在使用raw套接字 然后只需在数据包标头中填写正确的 TCP 源端口即可 相反 如果您使用 TCP 套接字接口 socket connec
  • 如何在shell中输出返回码?

    我正在尝试通过调用自定义 shell 脚本sh bin sh c myscript sh gt log txt 2 gt 1 echo 该命令的输出是创建的后台进程的 PID 我想指导 bin sh保存返回码myscript sh到某个文件
  • jpegtran 优化而不更改文件名

    我需要优化一些图像 但不更改它们的名称 jpegtran copy none optimize image jpg gt image jpg 但是 这似乎创建了 0 的文件大小 当我对不同的文件名执行此操作时 大小仍然完全相同 怎么样 jp
  • 在我的 index.php 中加载 CSS 和 JS 等资源时出现错误 403

    我使用的是 Linux Elementary OS 并在 opt 中安装了 lampp My CSS and JS won t load When I inspect my page through browser The console
  • docker容器大小远大于实际大小

    我正在尝试从中构建图像debian latest 构建后 报告的图像虚拟大小来自docker images命令为 1 917 GB 我登录查看尺寸 du sh 大小为 573 MB 我很确定这么大的尺寸通常是不可能的 这里发生了什么 如何获
  • 如何使用 GOPATH 的 Samba 服务器位置?

    我正在尝试将 GOPATH 设置为共享网络文件夹 当我进入 export GOPATH smb path to shared folder I get go GOPATH entry is relative must be absolute
  • 如何更改 Apache 服务器的根目录? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 如何更改 Apache 服务器的文档根目录 我基本上想要localhost从 来 users spencer projects目录而不是
  • 删除 Git 存储库,但保留所有文件

    在我使用 Linux 的过程中的某个时刻 我决定将我的主目录中的所有内容都放入源代码管理中是个好主意 我不是在问这是否是一个好主意 我是在问如何撤销它 删除存储库的原因是我最近安装了 Oh My Zsh 而且我非常喜欢它 问题是我的主目录有
  • 我不明白 execlp() 在 Linux 中如何工作

    过去两天我一直在试图理解execlp 系统调用 但我还在这里 让我直奔主题 The man pageexeclp 将系统调用声明为int execlp const char file const char arg 与描述 execl exe
  • 当 grep "\\" XXFile 我得到“尾随反斜杠”

    现在我想查找是否有包含 字符的行 我试过grep XXFile但它暗示 尾随反斜杠 但当我尝试时grep XXFile没关系 谁能解释一下为什么第一个案例无法运行 谢谢 区别在于 shell 处理反斜杠的方式 当你写的时候 在双引号中 sh
  • 按进程名称过滤并记录 CPU 使用情况

    Linux 下有选项吗顶部命令 https www man7 org linux man pages man1 top 1 html我可以在哪里按名称过滤进程并将每秒该进程的 CPU 使用情况写入日志文件 top pgrep 过滤输出top
  • 如何减去两个 gettimeofday 实例?

    我想减去两个 gettimeofday 实例 并以毫秒为单位给出答案 这个想法是 static struct timeval tv gettimeofday tv NULL static struct timeval tv2 gettime
  • Linux:如何设置进程的时区?

    我需要设置在 Linux 机器上启动的各个进程的时区 我尝试设置TZ变量 在本地上下文中 但它不起作用 有没有一种方法可以使用与系统日期不同的系统日期从命令行运行应用程序 这可能听起来很愚蠢 但我需要一种sandbox系统日期将被更改的地方
  • 使用 Grep 查找两个短语之间的文本块(包括短语)

    是否可以使用 grep 来高亮所有以以下内容开头的文本 mutablePath CGPathCreateMutable 并以以下内容结尾 CGPathAddPath skinMutablePath NULL mutablePath 这两个短
  • 如何在c linux中收听特定接口上的广播?

    我目前可以通过执行以下操作来收听我编写的简单广播服务器 仅广播 hello int fd socket PF INET SOCK DGRAM 0 struct sockaddr in addr memset addr 0 sizeof ad
  • Fortran gfortran linux 中的“分段错误(核心转储)”错误

    我正在创建一个程序 该程序将分析目录中的文件 fits 然后它将在另一个目录中创建另一个文件 txt 它只是一个转换器 当我尝试执行该程序 编译正常 时 它给了我一条错误消息 程序收到信号 SIGSEGV 分段错误 无效的内存引用 此错误的
  • 在 Mac OSX 上交叉编译 x86_64-unknown-linux-gnu 失败

    我尝试将我的 Rust 项目之一编译到 x86 64 unknown linux gnu 目标 cargo build target x86 64 unknown linux gnu Compiling deployer v0 1 0 fi
  • Capistrano 3 部署无法连接到 GitHub - 权限被拒绝(公钥)

    我使用 Capistrano v3 和 capistrano symfony gem 设置了以下部署脚本 我正在使用 Ubuntu 14 4 部署到 AWS EC2 实例 我正在连接从 AWS 下载的 pem 文件 我的deploy rb中
  • git 错误:无法处理 https

    当我尝试使用 git clone 时https xxx https xxx我收到以下错误我不处理协议 https 有人可以帮我吗 完整消息 dementrock dementrock A8Se git 克隆https git innosta
  • 为什么我可以在 /proc/pid/maps 输出中看到几个相同的段?

    测试在32位Linux上进行 代码如下 int foo int a int b int c a b return c int main int e 0 int d foo 1 2 printf d n d scanf d e return

随机推荐

  • AdaBoost算法实例详解

    提升树Boosting Tree算法实例详解 程大海的博客 CSDN博客 从提升树Boosting Tree过度到梯度提升Gradient Boosting 程大海的博客 CSDN博客 GBDT梯度提升之回归算法个人理解 程大海的博客 CS
  • Centos7.6安装docker

    一 环境准备 Docker 支持以下的 64 位 CentOS 版本 CentOS 7 CentOS 8 更高版本 二 安装步骤 1 如果是重装 则需要卸载旧版本 sudo yum remove docker docker client d
  • k8s flannel划分子网方案

    目标 对宿主节点划分子网 同时实现对不同应用划分子网 实现说明 部署k8s时 划分宿主节点ip 对每个节点配置不同net conf json 这样pod调度到宿主节点时 根据net conf json内的network配置分配ip 实现po
  • git基本使用

    1 git init 初始化本地仓库 2 git add 或文件名 暂存 3 git commit m 自己定名字 4 git status 查看 5 git remote add origin https github com xxx 6
  • 强化学习之混合动作空间

    强化学习之混合动作空间 基本介绍 在强化学习的动作空间设定中有连续动作空间 离散动作空间和混合动作空间 在大多数的论文中研究的都是连续动作空间和离散动作空间 而混合动作空间研究的比较少 在游戏ai 自动驾驶等一些领域中有时动作空间可以是混合
  • 安装Elasticsearch

    gt 安装 1 创建基础环境 环境 centos7 9 es版本 7 13 3 按照如下的步骤一步步走 就可以正常完成安装 groupadd es useradd es g es p es123 cd home mkdir p elk es
  • nuxt.js局部引用quill富文本编辑器

    想在nuxt js中使用quill富文本编辑器 按照网上常见的方法 将css js 添加到 nuxt config js 这是全局调用了quill的css js 文件 在每个页面的源码中 都可以看到quill 的css js 这是没有必要的
  • 老板让你做性能优化,第一步你应该做什么?

    前言 项目的性能决定了用户对项目的整体感观度 优秀的性能可以保证项目的流畅与自然给用户愉快的体验感受 当我们开发完成一个项目以后最重要的环节就是要保证项目拥有一个良好的性能 所以开发完成以后需要我们针对项目做好性能优化 那么 要使一个项目拥
  • 大模型杀手级场景到底什么会到来

    大模型大潮之下 熙熙攘攘 皆为利来 皆为利往 所以很多人观望之后发现到现在还没有杀手级落地场景 便有些不耐烦了 觉得可能又是一股泡沫 但究竟是不是泡沫 需要从宏观角度分析下当前大模型的现状 笔者认为这种不耐烦其实来源于两个原因 1 天下事
  • 最适合零基础的爬虫教程,从零开始教你爬取十万表情包。非常简单。

    前言 事情要从几天前说起 我有一个朋友 他在和他喜欢的小姐姐聊天时 聊天的气氛一直非常尬 这时他就想发点表情包来缓和一下气氛 但一看自己的表情包收藏都是这样的 这发过去 基本就直接和小姐姐说拜拜了 然后他就向我求救问我有没有表情包 表情包我
  • 1、TCP三次握手、四次挥手;2、ADSL定义

    1 TCP三次握手 四次挥手详解 1 建立连接协议 三次握手 1 客户端发送一个带SYN标志的TCP报文到服务器 这是三次握手过程中的报文1 2 服务器端回应客户端的 这是三次握手中的第2个报文 这个报文同时带ACK标志和SYN标志 因此它
  • Appium 全新 2.0 全新跨平台生态,版本特性抢鲜体验!

    关于Appium V2 Appium V2 beta版本在2021年发布 从2022年1月1号开始 Appium核心团队不会再维护Appium 1 x版本了 所有近期官方发布的平台驱动 如Android平台的UIAutomator IOS平
  • W801上电自动重连wifi并通过蓝牙更新账号密码

    一 项目流程 项目整体思路比较简单 W801上电后读取内部flash中保存在固定位置的Wifi账号密码 同时开始蓝牙 每当蓝牙接收到命令后 就对其进行解析 如果为连接wifi命令 则断开当前wifi 并进行新的wifi连接 连接成功后将账号
  • 使用pkg打包Node.js应用:跨平台运行你的应用程序!

    使用pkg打包Node js应用 跨平台运行你的应用程序 你是否曾经遇到过在不同操作系统中运行同一个Node js应用程序时出现的问题 这是因为Node js不具备跨平台能力 所以需要一个打包工具来解决这个问题 幸运的是 有一个名为pkg的
  • 颜色、形状和纹理:使用 OpenCV 进行特征提取

    点击上方 小白学视觉 选择加 星标 或 置顶 重磅干货 第一时间送达 如何从图像中提取特征 第一次听说 特征提取 一词是在 YouTube 上的机器学习视频教程中 它清楚地解释了我们如何在大型数据集中提取特征 很简单 数据集的列就是特征 然
  • Error: Command failed: C:\windows\system32\cmd.exe /s /c "E:\programfiles\androidSDK\platform-tools\...

    问题 appium等自动化环境都安装配置号后 遇到如下问题 Error Command failed C windows system32 cmd exe s c E programfiles androidSDK platform too
  • 基于深度学习的指针式仪表图像智能读数方法

    针对传统图像处理的仪表识别方法鲁棒性较差 难以满足复杂环境下的指针式仪表图像读数 而深度学习的方法通过样本的训练能够适应更多的复杂场景 越来越多的仪表读数解决方案更偏向于使用深度学习的方法 而现在的基于深度学习的方法在仪表识别的解决方案中主
  • 某直装外挂卡密校验逆向分析

    前言 最近分析了一款外挂软件的卡密校验 过程挺有趣的 故记录下来 正文 该软件的界面如下图 登录卡密是该界面的一个按钮 首先是获取该界面的类名 如下 该界面所在的类是com app batman MainActivity 获取到该界面所在的
  • VUE:v-for的使用及源码

    一 前言 v for可以说是vue中使用最多的指令之一 不过 你真的了解它吗 v for不仅仅能用于遍历数组 也不仅仅能用于遍历对象 二 使用 先说结论 v for可以遍历数组 对象 数字以及字符串 以及 在vue3版本新增的对于部署了it
  • 嵌入式Linux驱动笔记(二十三)------使用buidroot构建文件系统

    你好 这里是风筝的博客 欢迎和我一起交流 所有的buidroot使用问题都可以看这个在线使用文档 https buildroot org downloads manual manual html about buildroot Buildr