通过Buildroot自制根文件系统

news2024/11/24 4:48:36

前言

根文件系统是Linux内核启动之后读取的一个文件系统,并从这个文件系统中加载第一个init应用程序并启动,就是Linux上俗称的root进程、根进程

制作它的方式有很多,例如busybox、yocto,但是这两个方式有缺点,第一个是busybox太精简了,不足以满足最新版Linux内核运行时所需的目录结构,而Yocto比较庞大,Buildroot是最合适的选择,它基于Busybox来构建根文件系统,Buildroot完善了busybox目录结构,并且支持创建用户,如果使用busybox需要我们自己来手动构建目录结构与文件体系

因为新版Linux内核启动时不单单只是需要文件系统里存在几个目录,还需要有system v的一些服务,目前4.x版本用的是systemD,如果你对内核没有足够的了解的情况下最好还是使用这些构建工具帮助我们来创建,否则你创建的根文件系统很可能无法引导Linux,就算引导起来了可能也会因为缺失某些文件而导致无法正常工作。

当然你也可以通过copy某些发行版的Linux文件结构到你的根文件系统下,不过最好还是使用一些构建工具来完成,例如你创建用户的话是需要使用Linux的加密程序与了解Linux用户存储结构才能创建用户。

制作根文件系统纯粹就是在通过文件形式来构造一个Linux系统,为内核提供用户态的体系

Buildroot与Yocto一样,它也是用来构建Linux嵌入式系统的,但与Yocto不同的是,它比较迷你、小巧,但缺点是移植包比较少,大多数情况下需要我们自己来移植包,用来构建一些小型Linux嵌入式系统比较方便,但如果真正想制作成类型Ubuntu那样的发行版还是需要使用Yocto和Debian

Buildroot是使用make来管理项目,通过make menuconfig来控制构建哪些项目,同时它也是需要从互联网下载所需tools的,但是不同的是它不会向Yocto那样需要个七八十G的内存,所以Buildroot是比较小巧的项目,但可以通过基于Buildroot来定制化你自己的构建项目。

获取源码

官网下载地址:https://buildroot.org/

github下载地址:https://github.com/buildroot/buildroot

开始制作

将源代码下载下来之后,Buildroot移植Linux内核上的menuconfig,使用与Linux一样的配置命令:make menuconfig进入配置界面来对它进行配置

首先选择Target options,然后根据你板子的信息配置一下,下面是我的配置内容:

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

然后选择Toolchian

Toolchain
  -> Toolchain type = External toolchain //使用用户自己的编译器
  -> Toolchain = Custom toolchain //使用自定义工具链
  -> Toolchain origin = Pre-installed toolchain //预装的编译器
  -> Toolchain path = /home/zhihao/arm/bin  //编译器绝对路径
  -> Toolchain prefix = $(ARCH)-linux-gnueabihf //编译器前缀
  -> External toolchain gcc version = 8.x    //编译器版本,需要与你编译器版本对上
  -> External toolchain kernel headers series = 4.1.x    //外部工具链内核标头,你可以在编译器arm-buildroot-linux-gnueabihf/sysroot/usr/include/linux/version.h目录下找到它的值,是十六进制的,需要转换
  -> External toolchain C library = glibc/eglibc     //选择嵌入式gcc库
  -> [*] Toolchain has SSP support? (NEW) //选中
  -> [*] Toolchain has RPC support? (NEW) //选中
  -> [*] Toolchain has C++ support? //选中
  -> [*] Enable MMU support (NEW) //选中

然后在选择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

最后在配置文件系统格式

-> 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

最后在将内核、bootload关掉,只编译根文件系统

-> Kernel
 -> [ ] Linux Kernel //不要选择编译 Linux Kernel 选项!
 
-> Bootloaders
 -> [ ] U-Boot //不要选择编译 U-Boot 选项!

如果你想配置第三方库,可以选择Target packages

在这个里面你可以选择opencv、ffmpeg这些库,buildroot会自动编译到根文件系统lib目录下

配置完成之后直接make即可开始编译

make

在make期间可能会出现下载404的问题

或者一直卡在下载处Time out的问题,这个原因是因为Buildroot里的链接可能失效了,又或者你无法科学上网的原因导致的

有两种解决方案,你可以先跟着报错包的名字到github上去找release版本或者去官网找,找到下载地址以后进入到package目录下,然后进入到包名字的目录,里面有一个包名字.mk的文件,打开它可以看到如下内容:

PKGCONF_VERSION = 1.6.3
PKGCONF_SITE = https://github.com/pkgconf/pkgconf/archive/refs/tags
PKGCONF_SOURCE = pkgconf-$(PKGCONF_VERSION).tar.gz
PKGCONF_LICENSE = pkgconf license
PKGCONF_LICENSE_FILES = COPYING
PKGCONF_CPE_ID_VENDOR = pkgconf
 
PKG_CONFIG_HOST_BINARY = $(HOST_DIR)/bin/pkg-config

将PKGCONF_SITE修改为你找到可用的地址就可用了,Buildroot会把PKGCONF_VERSION 、PKGCONF_SITE 、PKGCONF_SOURCE 组成一个完整的下载链接,注意仔细分割

如果你修改了名字,还需要修改pkgconf.hash里的名字

第二种方法就是在dl目录下创建一个包名字的目录,然后把包下载下来放进去就可以了,需要注意,包的版本名字压缩方式都需要与报错的名字一致

当下载完成之后几秒钟就完成了根文件系统的制作,根文件系统会输出到output目录下为rootfs.tar文件

同时如果你想修改busybox可以使用如下命令来设置

    
sudo make busybox-menuconfig

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

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

相关文章

JVM级别内存屏障如何禁止指令重排序的

承接上文证明CPU指令是乱序执行的当多个cpu访问同一份数据的时候怎么保证数据的一致性?在最底层级别的控制有好多种:第一种叫关中断,就是访问任何数据的时候必须有一个中断信号量的存在。很多传统的cpu就是靠它实现的,从内存读东西…

高速风筒的IPM模块解决方案

高速吹风筒是利用高转速产生的大风量来快速吹干头发,同时,高转速也使得电机与叶轮的体积缩小,便于设计出灵巧便携的外形。12万转的高速风筒的整体解决方案,满足高速吹风筒的所有应用场景,让客户用芯能的功率器件能更快…

PMP认证的PDU是什么?

PDU(Professional Development Units)即专业发展单元,是指您获取认证后,就项目管理专业进行学习、授课、或提供志愿服务的累积时间,以小时为单位,1小时即累积1个PDU。自证书获取日起,以三年为A周…

Ansible 多机自动化工具 初学笔记

此文档仅张聪明同学个人笔记;新负责KTH-RPL Cluster GPU的漫漫学习长路 English Docs: official https://docs.ansible.com/ansible/latest/index.html 中文相关文档: https://ansible.leops.cn/basic/Quickstart/https://blog.csdn.net/xinshuzhan/a…

java基础学习 day44(多态的优点和劣势)

1. 多态的优势 在多态形式下,右边对象可以实现解耦合(即之后的代码与右边的子类对象不绑定,在更改子类对象后,之后的代码仍可以使用),便于扩展和维护在定义方法的时候,使用父类型作为参数&…

北京/东莞/广州/深圳2023年上半年软考(中/高级)报名>>>

软考是全国计算机技术与软件专业技术资格(水平)考试(简称软考)项目,是由国家人力资源和社会保障部、工业和信息化部共同组织的国家级考试,既属于国家职业资格考试,又是职称资格考试。 系统集成…

TCP/IP体系结构、Socket、进程PID、端口Port

计算机网络小结 一、TCP/IP体系结构 首先OSI参考模型,OSI将网络分为七层,自下而上分别是物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。 TCP/IP体系结构则将网络分为四层,自下而上分别是网络接口层、网络层、传输层、应用…

(二十五)、实现评论功能(5)【uniapp+uinicloud多用户社区博客实战项目(完整开发文档-从零到完整项目)】

1,实现二级回复的入库操作 1.1 两个子组件(comment-item和comment-frame)与父组件reply之间的属性传值 comment-item: props: {item: {type: Object,default () {return {}}}},comment-frame: props: {commentObj: {…

LoRaWAN模块在车辆跟踪定位中的应用

目前 GPS已经在资产的管理中得到了越来越多的运用,如车辆跟踪、车队跟踪、资产监控等;人员跟踪,宠物跟踪,等等。在所有追踪装置中,最重要的是它的电池期望和监视距离。鉴于 LoRaWAN的功率消耗很小,而且能在…

Allegro如何快速检查走线是否跨分割操作指导

Allegro如何快速检查走线是否跨分割操作指导 在做PCB设计的时候,信号线跨分割的情况需要尽量避免,尤其是信号速率较高的情况,Allegro可以快速的检查PCB上哪个位置跨分割了,并且以高亮的形式报出来,类似下图 TOP层走线跨了L2层参考层空洞, 如何检查,具体操作步骤如下 点…

ArkUI实战,自定义饼状图组件PieChart

本节笔者带领读者实现一个饼状图 PieChart 组件,该组件是根据笔者之前封装的 MiniCanvas 实现的, PieChart 的最终演示效果如下图所示: 饼状图实现的拆分 根据上图的样式效果,实现一个饼状图,实质就是绘制一个个的实…

如何保护 IP 地址的隐私问题

是不是只有运营商才能查到某个人的住址信息呢?在大数据时代的今天,各种互联网应用收集了大量的数据信息,它们其实也可以根据这些信息,推断出某个人的大致地址位置。例如百度地图会一直用 App SDK 以及网页的方式记录 IP 和地址位置…

MySQL-redo log和undo log

什么是事务 事务是由数据库中一系列的访问和更新组成的逻辑执行单元 事务的逻辑单元中可以是一条SQL语句,也可以是一段SQL逻辑,这段逻辑要么全部执行成功,要么全部执行失败 举个最常见的例子,你早上出去买早餐,支付…

位运算(C/C++)

1. 基础知识 程序中的所有数在计算机内存中都是以二进制的形式储存的。位运算就是直接对整数在内存中的二进制位进行操作。比如,and运算本来是一个逻辑运算符,但整数与整数之间也可以进行and运算。举个例子,6的二进制是110,11的二…

Python概述 基础语法 判断 循环

Python概述常用快捷键第二章-Python基础语法01-字面量02-注释03-变量04-数据类型05-数据类型转换06-标识符07-运算符08-字符串的三种定义方式09-字符串的拼接10-字符串格式化11-字符串格式化的精度控制 12-字符串格式化-快速写法13-对表达式进行格式化14-字符串格式化练习题讲解…

【Jmeter】ForEach控制器

一、什么是ForEach控制器 ForEach控制器是遍历某个数组读取不同的变量值,来控制其下的采样器或控制器执行一次或多次。而这个数组可以是用户自定义变量,也可以是从前面接口请求中提取到需要的数据,然后进行遍历循环。 二、ForEach控制器相关…

【概念辨析】二维数组传参的几种可能性

一、二维数组传参竟然不是用二级指针进行接收? 今天进行再一次的二级指针学习时,发现了一条以前没怎么注意过的知识点:二维数组进行传参只能用二维数组(不能省略列)进行接收或者是数组指针。 问题复现代码如下&#xf…

深度卷积对抗神经网络 进阶 第三部分 GANs Unpaired Translation with Cycle GAN 模型

非配对的图像转换应用 Unpaired Image-to-Image Translation Unpaired image-to-image translation 主要用于学习两组图像之间的对应关系,检查和寻找两堆数据中的共同内容(content)以及每堆独有的特点(style)。而这个…

FinClip 的 2022 与 2023

相比往年,今年复盘去年与展望新年的文章来的稍慢一点。不过也希望能够借这篇文章,和关注 FinClip 的用户朋友们一起聊聊,我们在去年和今年的想法与计划。 2022 在过去的一年中,我们的身边发生了很多事情,这些事情在不…

英语二-电子邮件邀请短文写作

1. 邮件模板 Dear 邀请人, Hope you have a great day. I am writing this email to invite you to attend 主题. Please kindly find the following information for your reference: Time: 时间 Address: 地点 We hope that nothing will prevent you from coming, as…