譯自 Buildroot vs. OpenEmbedded or Yocto Project: A Four Hands Discussion - 2016.pdf
Buildroot 和 yocto的對比
對比內(nèi)容:
(1) 嵌入式構(gòu)建系統(tǒng)
目標是構(gòu)建一個完整的,客制化的嵌入式Linux系統(tǒng)
包括root filesystem缅叠, toolchain锻离, kernel, bootloader
(2) 從源代碼開始
(3) 使用交叉編譯工具鏈
(4) 非巢酃鳎活躍的維護和開發(fā)工程
(5) 工業(yè)界廣泛使用
(6) 有文檔和培訓課程
(7) 自由軟件
buildroot的通用信條
(1) 專注于簡單化
(2) 使用簡單捉蚤,理解簡單,擴展簡單
(3) 通過擴展腳本而不是buildroot本身來處理特殊情況
(4) 使用現(xiàn)存的技術(shù)/語言: kconfig炼七, make. (值得投入時間去學習)
(5) 默認小
(6) 目的無關(guān)的(Purpose-agnostic)
(7) 開放社區(qū)缆巧,沒有供應商、官僚/公司的管理
yocto的通用信條
(1) 支持主要的CPU架構(gòu)
OpenEmbedded:僅qemu
Yocto Project: 為一小部分機器增加支持
(2) 只提供核心方法豌拙,使用layers來支持更多的package和機器
(3) 客戶的改動應該在一個單獨的layer
(4) 多用途的構(gòu)建系統(tǒng):盡可能靈活的處理更多的使用情況
(5) 開放社區(qū)陕悬,但是該工程被公司贊助商發(fā)起的Yocto Project Advisory Board監(jiān)管
(6) OpenEmbedded 是一個獨立社區(qū)驅(qū)動的工程。
buildroot 輸出
(1) 主要是根文件系統(tǒng)鏡像
同時包含:工具鏈按傅, 內(nèi)核鏡像捉超, bootloader等
(2) 支持多種格式: ext2/3/4, ubifs唯绍, iso9600等
(3) 沒有二進制包拼岳, 沒有包管理系統(tǒng)
一些人稱之為一個firmware generator
通過包不可能更新
更新需要一個完整的系統(tǒng)更新,像Andorid一樣
認為部分更新是有害的
Yocto 輸出
(1) 構(gòu)建distribution况芒,主要的輸出是一個package feed
包管理系統(tǒng)是可選的
裝載和更新系統(tǒng)的一部分是可能的
(2) 通過安裝一些包裂问,也可以產(chǎn)生根文件系統(tǒng)鏡像。支持ext2/3/4牛柒, ubifs堪簿, iso9600等,也支持VM鏡像:vmdk皮壁,vdi椭更,qcow2
(3) 最終,鏡像類或者工具蛾魄,wic可用來構(gòu)建磁盤鏡像
(4) 生成image時也可以生成SDK虑瀑,可以讓應用開發(fā)者編譯和測試他們的應用(不用集成到build中)湿滓。但是SDK必須要和image匹配。
Buildroot 配置
(1) 和Linux kernel一樣使用kconfig
(2) 簡單的{menu舌狗,x叽奥,n,g}配置接口
(3) 整個配置保存在一個文件 .config/defconfig
(4) 定義系統(tǒng)的各個方面:架構(gòu)痛侍,內(nèi)核版本/內(nèi)核配置朝氓,bootloader,用戶空間package等等主届。
(5) make menuconfig赵哲, make
(6) 為不同的機器構(gòu)建通用的系統(tǒng):單獨處理
一個可以從fragment中構(gòu)建出defconfig的工具
可行的,但是并非超級簡單
每臺機器完全獨立的構(gòu)建
Yocto 配置
(1) 配置分成幾個部分:
Distribution 配置 (package配置君丁,toolchain和libc選擇...)
Machine Configuration (定義架構(gòu)枫夺, CPU功能, BSP)
Image recipe (target安裝什么package)
Local配置 (Distribution和默認machine選擇绘闷, 編譯時使用多少個線程橡庞, 是否刪除build artifact)
(2) 有必要收集將要被使用的layers,并宣布它們印蔗。
(3) 允許為不同的機器構(gòu)建相同的鏡像扒最,或者為同一個機器構(gòu)建不同的distribution或鏡像。
Buildroot layers
(1) 沒有l(wèi)ayer的概念
(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, 檢查不是系統(tǒng)性的
(6) OpenEmbedded Metadata Index 列出了可用的layers爪喘,recipes颜曾,machines:http://layers.openembedded.org/layerindex/
(7) 此外,有一個強大的override機制秉剑,可以基于machine或者distribution調(diào)整recipe variables
buildroot/yocto toolchain
相同的功能:
(1) 構(gòu)建自己的toolchain泛豪,基于gcc、C庫(glibc侦鹏, uClibc诡曙, musl)
(2) 使用external toolchain, 對于buildroot更簡單略水,因為內(nèi)置有這個功能价卤,對于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腳本一個接一個地下載、提取岁疼、構(gòu)建阔涉、安裝軟件那樣簡單。
(4) 文檔很充分五续,有很多資源可用
(5) 一個小時的talk足以描述所有內(nèi)部實現(xiàn)(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) 日志和調(diào)試可幫助理解每個task具體做了什么
(6) 詳細的文檔函荣,但是有很多不同的配置變量
(7) 并不總是容易理解最佳實踐(比如, Poky 不能用于 production扳肛, distro/image 修改不能在local.conf中做傻挂, 刪除tmp/)
(8) 人們依然對一些術(shù)語感到疑惑(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) 極簡依賴, 如果一個功能可以關(guān)閉尖飞,那么默認關(guān)閉
(2) 很多自動依賴症副,比如,如果你開啟OpenSSL政基,將自動從其他可提供SSL支持的enabled的包中獲得SSL支持
(3) 默認毫不費力的的得到小的根文件系統(tǒng)
Yocto Project 依賴方法
(1) 在distribution級進行package 配置
開啟OpenSSL將對所有package打開贞铣,但是可以對一些package關(guān)閉,相反沮明,也可以對選定的pacakge開啟一些功能咕娄。
(2) 可以在machine級進行修改,但是應該避免這樣做
(3) 每個recipe可以定義自己的默認功能集珊擂,一個穩(wěn)健的默認配置圣勒。
Buildroot 更新/安全
(1) 每三個月release费变,兩個月開發(fā),一個月穩(wěn)定
(2) release包含package版本更新: security 更新和major 更新
(3) 核心架構(gòu)也可能潛在性的發(fā)生改變
(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之間的三個月內(nèi)包含4個milestone
(4) 至少先前和當前release的版本有指定維護者吁峻,他們獲取安全和重要的解決方法滑负,但是沒有recipe更新
(5) 舊版本由社區(qū)維護
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) 它通過創(chuàng)建inputs的checksum檢測task的input修改
(3) 該cache可在所有的builds間共享痴鳄, 對于類似的machines,build很快
(4) 可以跨主機分享該cache缸夹,比如一個夜間服務器和一個開發(fā)機痪寻,大大加快full build
Buildroot: architecture support
(1) 支持很多架構(gòu)
(2) ARM(64), MIPS虽惭, PowerPC(64)橡类, x86/x86-64
(3) 也支持很多更專用的架構(gòu): Xtensa, Blackfin, ARC, m68k, SPARC, Microblaze, NIOSII; ARM noMMU, especially ARMv7-M
(4) 架構(gòu)供應商提供援助: 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) 社區(qū)提供: 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) 都可以創(chuàng)建一個使用許可證的列表
(2) 都能夠檢測到許可證更改
(3) Yocto項目可以剔除GPLv3
Buildroot & Yocto 選擇
Buildroot
(1) 非常專用的CPU架構(gòu)
(2) 非常小的rootfs < 8M
(3) 對工程師沒有很大的要求
(4) 不支持各種mechines或者類似的系統(tǒng)
(5) 不需要包/部分系統(tǒng)的更新
(6) 小系統(tǒng)
yocto
(1) 不是非常特殊的CPU架構(gòu)库继,不是非常小的rootfs箩艺,需要有經(jīng)驗的工程師窜醉。
(2) 不是非常特殊的CPU架構(gòu),不是非常小的rootfs艺谆,需要有經(jīng)驗的工程師榨惰。支持幾種類似的系統(tǒng)
(3) 不是非常特殊的CPU架構(gòu),不是非常小的rootfs静汤,需要有經(jīng)驗的工程師琅催。需要更新包和部分系統(tǒng)
(4) 不是非常特殊的CPU架構(gòu),不是非常小的rootfs虫给,需要有經(jīng)驗的工程師藤抡。非常大的系統(tǒng)