嵌入式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构建文件系统 的相关文章

  • ioctl 命令的用户权限检查

    我正在实现 char 驱动程序 Linux 并且我的驱动程序中有某些 IOCTL 命令仅需要由 ADMIN 执行 我的问题是如何在 ioctl 命令实现下检查用户权限并限制非特权用户访问 IOCTL 您可以使用bool capable in
  • 仅使用containerd(不使用Docker)修剪容器镜像

    如果我刚刚containerd安装在 Linux 系统上 即 Docker 是not安装 如何删除未使用的容器映像以节省磁盘空间 Docker 就是这么方便docker system prune https docs docker com
  • SSH,运行进程然后忽略输出

    我有一个命令可以使用 SSH 并在 SSH 后运行脚本 该脚本运行一个二进制文件 脚本完成后 我可以输入任意键 本地终端将恢复到正常状态 但是 由于该进程仍在我通过 SSH 连接的计算机中运行 因此任何时候它都会登录到stdout我在本地终
  • 相当于Linux中的导入库

    在 Windows C 中 当您想要链接 DLL 时 您必须提供导入库 但是在 GNU 构建系统中 当您想要链接 so 文件 相当于 dll 时 您就不需要链接 为什么是这样 是否有等效的 Windows 导入库 注意 我不会谈论在 Win
  • 在 C 中使用单个消息队列是否可以实现双向通信

    我希望服务器向客户端发送一些消息 并让客户端确认它 我被分配了这个任务 我可以在 C linux 中使用单个消息队列来完成它还是我需要创建两个 谢谢 是的 可以使用 sysV 消息队列来做到这一点 从您之前的问题来看 您正在使用该队列 您可
  • 在centos中安装sqlite3 dev和其他包

    我正在尝试使用 cpanel 在 centos 机器上安装 sqlite dev 和其他库 以便能够编译应用程序 我对 debian 比 centos 更熟悉 我知道我需要的库是 libsqlite3 dev libkrb5 dev lib
  • Linux 上的静态 Qt5 构建:部署时如何处理字体?

    我使用这些配置选项创建了 Qt 5 2 0 库的静态版本 Ubuntu 12 04 开源 确认许可 force pkg config 发布 静止的 前缀 home juzzlin qt5 无icu opengl桌面 无油嘴滑舌 辅助功能 n
  • 就分页分段内存而言的程序寿命

    我对 x86 Linux 机器中的分段和分页过程有一个令人困惑的概念 如果有人能澄清从开始到结束所涉及的所有步骤 我们将很高兴 x86 使用分页分段内存技术进行内存管理 任何人都可以解释一下从可执行的 elf 格式文件从硬盘加载到主内存到它
  • 执行“minikube start”命令时出现问题

    malik malik minikube start minikube v1 12 0 on Ubuntu 18 04 Using the docker driver based on existing profile Starting c
  • GMail 421 4.7.0 稍后重试,关闭连接

    我试图找出为什么它无法使用 GMail 从我的服务器发送邮件 为此 我使用 SwiftMailer 但我可以将问题包含在以下独立代码中
  • 使用循环在 C 中管道传输两个或多个 shell 命令

    我正在尝试执行ls wc l通过 C 语言程序 而不是使用命令行 这是我当前的工作代码 int main int pfds 2 pipe pfds pid t pid fork if pid 0 The child process clos
  • 使用 MAX_ORDER / 包含 mmzone.h

    根据https www kernel org doc Documentation networking packet mmap txt https www kernel org doc Documentation networking pa
  • 如何让R使用所有处理器?

    我有一台运行 Windows XP 的四核笔记本电脑 但查看任务管理器 R 似乎一次只使用一个处理器 如何让 R 使用全部四个处理器并加速我的 R 程序 我有一个基本系统 我使用它在 for 循环上并行化我的程序 一旦您了解需要做什么 此方
  • 使用包管理器时如何管理 Perl 模块?

    A 最近的问题 https stackoverflow com questions 397817 unable to find perl modules in intrepid ibex ubuntu这让我开始思考 在我尝试过的大多数 Li
  • Bash - 在与当前终端分开的另一个终端中启动命令的新实例

    我有一个简单的 bash 脚本 test sh 设置如下 bin bash args if args 0 check capture then watch n 1 ls lag home user capture0 watch n 1 ls
  • 内核的panic()函数是否完全冻结所有其他进程?

    我想确认内核的panic 功能和其他类似kernel halt and machine halt 一旦触发 保证机器完全冻结 那么 所有的内核和用户进程都被冻结了吗 是panic 可以被调度程序中断吗 中断处理程序仍然可以执行吗 用例 如果
  • 静态方法的 Java 内存模型

    我来自操作系统和 C 语言背景 在代码编译时 世界很简单 需要处理和理解堆栈 堆文本部分等 当我开始学习 Java 时 我确实了解 JVM 和垃圾收集器 我对静态方法感到很有趣 根据我的理解 类的所有实例都会在堆中创建 然后被清理 但是 对
  • C修改printf()输出到文件

    有没有办法修改printf为了将字符串输出到文件而不是控制台 我尝试在互联网上查找一些内容 发现了类似的电话dup dup2 and fflush这可能与此有关 EDIT 也许我不清楚 问题是这是C考试问题 问题如下 解释一个通常将字符串输
  • cdc_acm:无法设置 dtr/rts - 无法与 USB cdc 设备通信

    我试图使用 pic24fj128gb206 枚举 usb cdc 设备 设备似乎已正确枚举 但是当我将设备连接到 Linux PC 时 我从内核收到以下警告消息 cdc acm 1 8 1 6 7 1 0 failed to set dtr
  • 如何在 Mac OSX Mavericks 中正确运行字符串工具?

    如何在 Mac OSX Mavericks 中正确运行字符串工具 我尝试按照我在网上找到的示例来运行它 strings a UserParser class 但我收到此错误 错误 Applications Xcode app Content

随机推荐

  • 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