嵌入式linux构建之Yocto和buildroot

李肖遥 2023-11-23 22:08
    关注、星标公众号,直达精彩内容



做Linux系统开发其实大部分工作都是围绕根文件系统,因为uboot、kernel一般都是原厂提供,且外设官方也提供了驱动,移植就是了,本身开发工作不多。构建根文件系统最难做到的就是版本符合且完整。因为根文件系统涉及到的需求、库、源文件等很多,而且还有版本要求因此并不容易。


根文件系统构建最麻烦的是opengl库、java库、qt库、tslib库、openvg库、Python库、sqlite等等。下面分别介绍几种不同的构建方法,阐述途径依旧是原料和工具、过程、输出。


Yocto是常见的构建根文件系统的工具,当然uboot和kernel一并能构建出来但是大部分人只需要根文件系统。很多SOC厂比如NXP加入了Yocto计划整出Yocto版的SDK,这并不是什么好事SOC用户更喜欢每一款芯片单独提供一个SDK然后配置编译。Yocto构建原料和工具需要一台内存、主频、影盘比较高的电脑,还要Ubuntu环境和repo、git环境,一份SOC厂提供的Yocto包。过程就是下载、build配置、编译,整个编译要十几个小时还跟电脑性能有关。输出就是交叉编译工具链、二进制的uboot和kernel、还有最重要的包含了需要的各种库的根文件系统。


buildroot也是SOC厂提供SDK的惯用方法,比如瑞芯微、STM32MP等。buildroot配置和编译比较简单过程也不复杂,整个过程像极了kernel的配置编译过程,编译速度也比较快,从SDK厂商处获得SDK后编译并不难。


busybox仅仅用于构建根文件系统,但是只有一些基本的东西比如shell、telnet等。编译过程跟编译kernel很像,也是先make menuconfig,然后配置最后编译。

在构建根文件系统时笔者认为宁多勿缺,很多人会觉得flash资源有限不适合放这么多库,但是既然选择用Linux了就不要用做MCU的思维来做了,如果资源真的受限应该用RTOS来做不要考虑上Linux。因为缺一两个库最后应用跑不起来重新构建一遍根文件系统是非常痛苦的。


另外Android移植没有大家想象的困难,一般能跑Android的SOC官方都会发布一个公版SDK的。Andriod的难度在于深度定制和应用开发,移植本身难度比Linux还要小。


Buildroot 和 yocto的对比

对比内容:
(1) 
嵌入式构建系统
    目标是构建一个完整的,客制化的嵌入式Linux系统
    包括root filesystem, toolchain, kernel, bootloader
(2) 从源代码开始
(3) 使用交叉编译工具链
(4) 非常活跃的维护和开发工程
(5) 工业界广泛使用
(6) 有文档和培训课程
(7) 自由软件

buildroot的通用信条
(1) 专注于简单化
(2) 使用简单,理解简单,扩展简单
(3) 通过扩展脚本而不是buildroot本身来处理特殊情况
(4) 使用现存的技术/语言:kconfig, make. (值得投入时间去学习)
(5) 默认小
(6) 目的无关的(Purpose-agnostic)
(7) 开放社区,没有供应商、官僚/公司的管理

yocto的通用信条
(1) 支持主要的CPU架构
   OpenEmbedded:仅qemu
   Yocto Project:为一小部分机器增加支持
(2) 只提供核心方法,使用layers来支持更多的package和机器
(3) 客户的改动应该在一个单独的layer
(4) 多用途的构建系统:尽可能灵活的处理更多的使用情况
(5) 开放社区,但是该工程被公司赞助商发起的Yocto Project Advisory Board监管
(6) OpenEmbedded 是一个独立社区驱动的工程。

buildroot 输出
(1) 主要是根文件系统镜像
    同时包含:工具链, 内核镜像, bootloader等
(2) 支持多种格式:ext2/3/4, ubifs, iso9600等
(3) 没有二进制包, 没有包管理系统
    一些人称之为一个firmware generator
    通过包不可能更新
    更新需要一个完整的系统更新,像Andorid一样
    认为部分更新是有害的

Yocto 输出
(1) 构建distribution,主要的输出是一个package feed
    包管理系统是可选的
    装载和更新系统的一部分是可能的
(2) 通过安装一些包,也可以产生根文件系统镜像。支持ext2/3/4, ubifs, iso9600等,也支持VM镜像:vmdk,vdi,qcow2
(3) 最终,镜像类或者工具,wic可用来构建磁盘镜像
(4) 生成image时也可以生成SDK,可以让应用开发者编译和测试他们的应用(不用集成到build中)。但是SDK必须要和image匹配。

Buildroot 配置
(1) 和Linux kernel一样使用kconfig
(2) 简单的{menu,x,n,g}配置接口
(3) 整个配置保存在一个文件 .config/defconfig
(4) 定义系统的各个方面:架构,内核版本/内核配置,bootloader,用户空间package等等。
(5) make menuconfig, make
(6) 为不同的机器构建通用的系统:单独处理
    一个可以从fragment中构建出defconfig的工具
    可行的,但是并非超级简单
    每台机器完全独立的构建

Yocto 配置
(1) 配置分成几个部分:
    Distribution 配置 (package配置,toolchain和libc选择...)
    Machine Configuration (定义架构, CPU功能, BSP)
    Image recipe (target安装什么package)
    Local配置 (Distribution和默认machine选择, 编译时使用多少个线程, 是否删除build artifact)
(2) 有必要收集将要被使用的layers,并宣布它们。
(3) 允许为不同的机器构建相同的镜像,或者为同一个机器构建不同的distribution或镜像。

Buildroot layers
(1) 没有layer的概念
(2) 所有的包在官方repository中维护
(3) 添加BR2_EXTERNAL
    允许存储包定义、配置和其他人工文件
    一个BR2_EXTERNAL
    通常用作专有的/客制化的包和配置
    仅增加包,不覆盖buildroot中的包

yocto layers
(1) layer机制允许修改和增加新package或image
(2) core build system, BSP和custome modifications之间明确分离
(3) 第三方提供为它们layers提供BSP,或者一套处理专用应用程序的方法
(4) Layers需要兼容和使用相同的OE branch base
(5) 谨防layer quality, 检查不是系统性的
(6) OpenEmbedded Metadata Index 列出了可用的layers,recipes,machines:http://layers.openembedded.org/layerindex/
(7) 此外,有一个强大的override机制,可以基于machine或者distribution调整recipe variables

buildroot/yocto toolchain
相同的功能:
(1) 构建自己的toolchain,基于gcc、C库(glibc, uClibc, musl)
(2) 使用external toolchain, 对于buildroot更简单,因为内置有这个功能,对于yocto,只有在additional vendor layers正真完全支持。

buildroot new package
涉及三个文件Config.in xxx.mk xxx.hash

yocto new package
涉及一个文件×××.bb

buildroot: complexity
(1) 设计成简单使用
(2) 对于core,每个建议的功能以有用性/复杂度比来分析
(3) core逻辑完全使用make编写,少于1000行的code包含了230行注释:确实容易理解what、why、how;几乎和一个shell脚本一个接一个地下载、提取、构建、安装软件那样简单。
(4) 文档很充分,有很多资源可用
(5) 一个小时的talk足以描述所有内部实现(ELCE 2014)
(6) IRC上典型的反馈:来自Yocto,非常惊喜,使用起来这么简单。这是让我为难的第一件事。

Yocto Project: complexity
(1) 有点陡峭的学习曲线
(2) 核心是bitbake, 一个用python编写的单独项目(60千行代码)
(3) 一套class定义common task
(4) recipe 使用 bitbake specific language, python 和 shell 混合编写
(5) 日志和调试可帮助理解每个task具体做了什么
(6) 详细的文档,但是有很多不同的配置变量
(7) 并不总是容易理解最佳实践(比如, Poky 不能用于 production, distro/image 修改不能在local.conf中做, 删除tmp/)
(8) 人们依然对一些术语感到疑惑(Yocto Project, Poky, OpenEmbedded, bitbake)

Buildroot packages
(1) 1800+ packages
(2) Graphics: X.org, Wayland, Qt4/Qt5, Gtk2/Gtk3, EFL
(3) Multimedia: Gstreamer 0.10/1.x, ffmpeg, Kodi, OpenGL
(4) Languages: Python2/3, PHP, Lua, Perl, Erlang, Mono, Ruby, Node.js
(5) Networking: Apache, Samba, Dovecot, Exim, CUPS, lots of servers/tools
(6) Init systems: Busybox(default), initsysv, systemd
(7) No support for a toolchain on the target

Yocto Project packages
(1) 几千个recipes: 对于oe-core, meta-openembedded, meta-qt5大约2200个。通过Metadata Index知道多余8400
(2) 大部分和buildroot一样
(3) 更多的语言: Java, Go, Rust, smalltalk
(4) 对于Qt3仍有一个起作用的layer
(5) meta-virtualization(Docker, KVM, LXC, Xen)和 meta-openstack layers

Buildroot 依赖方法
(1) 极简依赖, 如果一个功能可以关闭,那么默认关闭
(2) 很多自动依赖,比如,如果你开启OpenSSL,将自动从其他可提供SSL支持的enabled的包中获得SSL支持
(3) 默认毫不费力的的得到小的根文件系统

Yocto Project 依赖方法
(1) 在distribution级进行package 配置
    开启OpenSSL将对所有package打开,但是可以对一些package关闭,相反,也可以对选定的pacakge开启一些功能。
(2) 可以在machine级进行修改,但是应该避免这样做
(3) 每个recipe可以定义自己的默认功能集,一个稳健的默认配置。

Buildroot 更新/安全
(1) 每三个月release,两个月开发,一个月稳定
(2) release包含package版本更新:security 更新和major 更新
(3) 核心架构也可能潜在性的发生改变
(4) 没有LTS版本,用于需要自己处理
(5) 正在提供一个脚本来评估给定buildroot配置中未解决的CVE (Common Vulnerabilities & Exposures)

Yocto Project 更新/安全
(1) 每6个月release,一次在4月,一次在10月
(2) 可通过wiki: https://wiki.yoctoproject.org/wiki/Yocto_Project_v2.1_Status了解planning和roadmap
(3) 在M1和最终release之间的三个月内包含4个milestone
(4) 至少先前和当前release的版本有指定维护者,他们获取安全和重要的解决方法,但是没有recipe更新
(5) 旧版本由社区维护

Buildroot 检测配置修改
(1) Buildroot不很智能
(2) 当修改配置是,它不尝试检测哪些需要rebuild
(3) 一旦build一个package,buildroot将不rebuild它,除非你强制
(4) 大的配置修改需要full rebuild
(5) 小的配置修改可以不需要full rebuild
(6) 一个配置,一个build,不能配置间不能分享

Yocto Project 检测配置修改
(1) bitbake 维护一个shared State Cache允许增加的builds
(2) 它通过创建inputs的checksum检测task的input修改
(3) 该cache可在所有的builds间共享, 对于类似的machines,build很快
(4) 可以跨主机分享该cache,比如一个夜间服务器和一个开发机,大大加快full build

Buildroot: architecture support
(1) 支持很多架构
(2) ARM(64), MIPS, PowerPC(64), x86/x86-64
(3) 也支持很多更专用的架构:Xtensa, Blackfin, ARC, m68k, SPARC, Microblaze, NIOSII; ARM noMMU, especially ARMv7-M
(4) 架构供应商提供援助: Imagination Technologies的MIPS, IBM的PowerPC64, Synopsys的ARC, Analog Devices的Blackfin

Yocto Project: architecture support
(1) core中, ARM, MIPS, PowerPC, X86,以及它们64bit 系列
(2) separate layers:Microblaze, NIOSII
(3) 通常芯片厂商维护他们自己的BSP layer:meta-intell, meta-altera (ARM & NIOSII), meta-atmel, meta-fsl, meta-ti, mtea-xilinx ...
(4) 社区提供:meta-rockchip, meta-sunxi

Buildroot: minimal build
最小的build花费15分25秒,image size 2.2MB

yocto project: minimal build
最小build花费50分47秒, image size为4.9MB。如果有存在的sstate-cache,花费1分21秒

License
(1) 都可以创建一个使用许可证的列表
(2) 都能够检测到许可证更改
(3) Yocto项目可以剔除GPLv3


Buildroot & Yocto 选择
Buildroot
(1) 非常专用的CPU架构
(2) 非常小的rootfs < 8M
(3) 对工程师没有很大的要求
(4) 不支持各种mechines或者类似的系统
(5) 不需要包/部分系统的更新
(6) 小系统

yocto
(1) 不是非常特殊的CPU架构,不是非常小的rootfs,需要有经验的工程师。
(2) 不是非常特殊的CPU架构,不是非常小的rootfs,需要有经验的工程师。支持几种类似的系统
(3) 不是非常特殊的CPU架构,不是非常小的rootfs,需要有经验的工程师。需要更新包和部分系统
(4) 不是非常特殊的CPU架构,不是非常小的rootfs,需要有经验的工程师。非常大的系统

       
版权声明:本文来源网络,免费传达知识,版权归原作者所有。如涉及作品版权问题,请联系我进行删除。

‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧  END  ‧‧‧‧‧‧‧‧‧‧‧‧‧‧‧

关注我的微信公众号,回复“加群”按规则加入技术交流群。


点击“阅读原文”查看更多分享,欢迎点分享、收藏、点赞、在看。

李肖遥 公众号“技术让梦想更伟大”,作者:李肖遥,专注嵌入式,只推荐适合你的博文,干货,技术心得,与君共勉。
评论 (0)
  • 一、引言:智能化趋势下的学爬玩具开发挑战随着早教理念的普及,学爬玩具作为婴幼儿早期运动能力开发的重要工具,市场需求持续增长。然而,传统学爬玩具开发面临多重挑战:需集成红外遥控、语音交互、电机控制等多模块,开发周期长、硬件成本高;复杂的红外编解码与语音功能实现依赖工程师深度参与,技术门槛陡增。如何以更低成本、更快速度打造差异化产品,成为行业亟待解决的痛点。二、传统开发模式痛点分析硬件冗余红外接收模块、语音芯片、主控MCU分立设计,导致PCB面积增加,BOM成本攀升。开发周期长需工程师独立完成红外协
    广州唯创电子 2025-04-16 08:40 56浏览
  • 一、智能门锁市场痛点与技术革新随着智能家居的快速发展,电子门锁正从“密码解锁”向“无感交互”进化。然而,传统人体感应技术普遍面临三大挑战:功耗高导致续航短、静态人体检测能力弱、环境适应性差。WTL580微波雷达解决方案,以5.8GHz高精度雷达感知技术为核心,突破行业瓶颈,为智能门锁带来“精准感知-高效触发-超低功耗”的全新交互范式。二、WTL580方案核心技术优势1. 5.8GHz毫米波雷达:精准感知的革命全状态人体检测:支持运动、微动(如呼吸)、静态(坐卧)多模态感知,检测灵敏度达0.1m/
    广州唯创电子 2025-04-15 09:20 98浏览
  • 三、芯片的制造1、制造核心流程 (1)晶圆制备:以高纯度硅为基底,通过拉晶、切片、抛光制成晶圆。 (2)光刻:光刻、离子注入、薄膜沉积、化学机械抛光。 (3)刻蚀与沉积:使用干法刻蚀(等离子体)精准切割图形,避免侧壁损伤。 (4)掺杂:注入离子形成PN结特性,实现晶体管开关功能。2、材料与工艺创新 (1)新材料应用: 高迁移率材料(FinFET中的应变硅、GaN在射频芯片中的应用); 新型封装技术(3D IC、TSV硅通孔)提升集成度。 (2)工艺创新: 制程从7nm到3nm,设计架构由F
    碧海长空 2025-04-15 11:33 221浏览
  • 展会名称:2025成都国际工业博览会(简称:成都工博会)展会日期:4月23 -25日展会地址:西部国际博览城展位号:15H-E010科士威传动将展示智能制造较新技术及全套解决方案。 2025年4月23-25日,中国西部国际博览城将迎来一场工业领域的年度盛会——2025成都国际工业博览会。这场以“创链新工业,共碳新未来”为主题的展会上,来自全球的600+ 家参展企业将齐聚一堂,共同展示智能制造产业链中的关键产品及解决方案,助力制造业向数字化、网络化、智能化转型。科士威传动将受邀参展。&n
    科士威传动 2025-04-14 17:55 90浏览
  • 2025年4月13日(中国武汉)——在全球经济分化与地缘政治不确定性加剧的背景下,科技与金融的深度融合已成为推动创新与繁荣的关键动力。为实现科技创新、产业进步和金融发展有机结合,发挥金融对科技创新和产业进步的支持作用,国际金融论坛(IFF)科技金融委员会启动大会暨首届科技金融圆桌会议于4月13日在湖北省武汉市武汉产业创新发展研究院成功举行。同时,IFF科技金融委员会由国际金融论坛IFF与武创院联合成立。本次大会汇聚了来自政府、产业与学术研究机构及金融等多领域的精英,共同探讨科技金融如何更好地服务
    华尔街科技眼 2025-04-15 20:53 52浏览
  • 一、智能语音播报技术演进与市场需求随着人工智能技术的快速发展,TTS(Text-to-Speech)技术在商业场景中的应用呈现爆发式增长。在零售领域,智能收款机的语音播报功能已成为提升服务效率和用户体验的关键模块。WT3000T8作为新一代高性能语音合成芯片,凭借其优异的处理能力和灵活的功能配置,正在为收款机智能化升级提供核心技术支持。二、WT3000T8芯片技术特性解析硬件架构优势采用32位高性能处理器(主频240MHz),支持实时语音合成与多任务处理QFN32封装(4x4mm)实现小型化设计
    广州唯创电子 2025-04-15 08:53 115浏览
  • 二、芯片的设计1、芯片设计的基本流程 (1)需求定义: 明确芯片功能(如处理器、存储、通信)、性能指标(速度、功耗、面积)及目标应用场景(消费电子、汽车、工业)。 (2)架构设计: 确定芯片整体框架,包括核心模块(如CPU、GPU、存储单元)的协同方式和数据流路径。 (3)逻辑设计: 通过硬件描述语言(如Verilog、VHDL)将架构转化为电路逻辑,生成RTL(寄存器传输级)代码。 (4)物理设计: 将逻辑代码映射到物理布局,涉及布局布线、时序优化、功耗分析等,需借助EDA工具(如Ca
    碧海长空 2025-04-15 11:30 177浏览
  • 一、引言:健康管理数字化浪潮下的血压监测转型在慢性病高发与老龄化加剧的双重压力下,家庭健康监测设备正从“被动测量工具”向“主动健康管家”演进。传统血压计虽能提供基础数值,却无法解决用户的核心痛点:数据如何解读?异常如何干预?风险如何预防?WT2605C芯片方案的诞生,通过“AI对话+云端互联+个性化服务”三重技术突破,重新定义了血压计的价值边界——它不仅是一台测量仪器,更是一个全天候在线的健康管理生态系统。二、传统血压计的局限与用户需求升级1. 功能单一性困境数据孤岛:仅显示收缩压/舒张压数值,
    广州唯创电子 2025-04-16 08:55 57浏览
  • 四、芯片封测技术及应用场景1、封装技术的发展历程 (1)DIP封装:早期分立元件封装,体积大、引脚少; (2)QFP封装:引脚密度提升,适用于早期集成电路。 (3)BGA封装:高密度互连,散热与信号传输优化; (4)3D封装:通过TSV(硅通孔)实现垂直堆叠,提升集成度(如HBM内存堆叠); (5)Chiplet封装:异质集成,将不同工艺节点的模块组合(如AMD的Zen3+架构)。 (6)SiP封装:集成多种功能芯片(如iPhone的A系列SoC整合CPU、GPU、射频模块)。2、芯片测试 (1
    碧海长空 2025-04-15 11:45 226浏览
  • 一、芯片的发展历程总结:1、晶体管的诞生(1)电子管时代 20世纪40年代,电子管体积庞大、功耗高、可靠性差,无法满足计算机小型化需求。(2)晶体管时代 1947年,贝尔实验室的肖克利、巴丁和布拉顿发明点接触晶体管,实现电子信号放大与开关功能,标志着固态电子时代的开端。 1956年,肖克利发明晶体管。(3)硅基晶体管时代 早期晶体管采用锗材料,但硅更耐高温、成本低,成为主流材料。2、集成电路的诞生与发展 1958年,德州仪器工程师基尔比用锗材料制成世界上第一块含多个晶体管的集成电路,同年仙童半导
    碧海长空 2025-04-15 09:30 136浏览
我要评论
0
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦