[What]Yocto Project 初识

参考书籍:Embedded Linux System with the Yocto Project

  • 书籍比实际的yocto版本要低,所以yocto的详细命令需要参考其对应版本手册

运行环境:

  • ubuntu18.04 amd64
  • yocto 2.5.1

yocto代表 10^-24 的小数因子,是国际标准的最小小数精度。

而yocto project 使用此名称以代表其项目可以特别精细的调整嵌入式linux开发的各个阶段。

编译第一个yocto工程

yocto的完整离线构建工具

在yocto的下载页面提供了一个叫做 Yocto Project Build Appliance 的安装包,它其实是一个官方已经配置好的虚拟机, 并且已经安装好了一切依赖软件,可以直接在windows上通过虚拟机运行,这样可以方便的体验其编译及仿真运行流程。

准备工作

硬件推荐设置

  • CPU:单核速度越快越好,核心越多越好……
  • 内存: 4GB
    • 低于1GB将无法运行
  • 硬盘:500GB(如果是SSD的话最好)
    • 至少100GB
  • 需要网络连接:工具链会下载源码
    • 或者也可以提前下载自己需要的源码,离线编译

依赖库安装

需要安装的依赖包有:

  • git1.8.3.1 或更高等级
  • tar1.27 或更高
  • Python3.4.0 或更高
  • 安装QEMU所需要的基本依赖
sudo apt install gawk wget git diffstat unzip texinfo gcc-multilib \
build-essential chrpath socat cpio python python3 python3-pip python3-pexpect python-git \
xz-utils debianutils iputils-ping libsdl1.2-dev xterm subversion texi2html texinfo \
make xsltproc docbook-utils fop dblatex xmlto 

yocto源码获取

yocto项目更新分为次要版本和主要版本更新,其中主要版本更新每隔半年发布一次,次要版本则在半年之间发布更新。

  • 次要版本每次更新代表修复了上一主要版本的一些bug,但并不会加入新的功能
  • 主要版本每次更新都会带有新功能、新配置文件等加入

基于以上特性,建议使用 git 的方式获取其源码,以可以合并次要版本修复bug。

  • 实际做项目中不建议经常合并主要版本,因为这意味着会有很多冲突需要解决。

进入yocto的下载页面可以看到最新稳定版的公告,使用 git 获取当前源码:

git clone -b sumo git://git.yoctoproject.org/poky.git
#建立一个 learn 分支来折腾
git checkout -b learn

编译镜像文件

配置基本环境

yocto提供了脚本 oe-init-build-env 用于设置环境变量并在当前目录新建一个 build 文件夹并生成基本文件来作为构建目录。

  • 也可以在脚本后跟目录路径来别处生成目录
  • 此脚本执行后会将当前路径切换到bulid文件夹中
# 注意: =source oe-init-build-env= 命令需要在重启后都执行一次以设置环境变量, 否则会提示 =bitbake= 命令找不到!
source oe-init-build-env

执行以上步骤后,会在 build/conf 文件夹下生成配置文件, 可以通过配置这些文件来更改设置,其中的 local.conf 就是用于构建环境设置的文件:

  • 文件中 "#" 用于注释,注释已经很清楚的说明了各项参数的意义, 但以下几点需要注意
    • MACHINE : 目标板架构
    • TOPDIR : 其值就是 build 目录的路径
    • DL_DIR : 通过网络下载的源码的存放位置,此位置可以用于几个构建工程共享,当工具链发现已有安装包时,就不会再从网络下载了
      • 建议将此文件夹设置在 build 目录之外,这样即可以很好共享,也可以当不构建此工程时可以直接删除 build 目录
    • SSTATE_DIR : 共享缓存文件的存放位置,工具链生成的很多中间文件,与 DL_DIR 相似,可以多个工程共享中间文件
      • 建议将此文件夹设置在 build 目录之外,这样即可以很好共享,也可以当不构建此工程时可以直接删除 build 目录
    • TMPDIR : 构建的输出目录,默认即可
      • 此目录包含所有的编译输出,忒大……
  • 为了能够节约硬盘空间, 可以在 local.conf 文件中加入一行:
    • 用于删除一些不必要的编译中间文件
INHERIT += "rm_work"

开始编译

首次编译需要一定的时间, 因为需要首次下载文件.

  • 至于时间要根据网速而定,一般几个小时吧~~~~~

注意: 首次编译及下载会消耗很多CPU和内存, 对于配置不高的主机,最好将UI界面退出, 进入命令行界面.否则容易导致 ubuntu自动重启.

#编译完整的并带GUI的发行版
bitbake core-image-sato
#也可以加上 -k 选项当有一般错误时不停止编译
bitbake -k core-image-sato

也可以先下载文件再编译:

bitbake -c fetchall core-image-sato

开始仿真

使用 Ctrl -C 退出仿真环境.

runqemu qemux86

注意事项

从别处拷贝整个工程

由于工程内部很多变量依然保存的是之前工程的配置, 所以需要先 删除build/tmp/目录下的内容, 重新编译才能正常运行!

yocto工程全局概览

yocto工程是由好几个开源工程组合起来的,这些小工程都兼容 OpenEmbedded 项目, yocto团队与OpenEmbedded团队共同维护yocto项目。

其成员如下所示:

  • Application Developement Toolkit(ADT) : ADT提供了yocto构建的基础工具,包括:交叉编译工具链、QEMU、linux内核源码、根文件系统
    • Poky根据其配置而选择性的打包ADT中提供的工具和源码
  • AutoBuilder : AutoBuilder通过Buildbot实现构建的自动集成,yocto的QA团队使用此工具完成持续集成和回归测试。
  • BitBake : BitBake是由OpenEmbedded提供的构建工具,类似于make,cmake这类专用于编译的构建工具
  • Build Appliance : 完整安装yocto所有工具及依赖的ubuntu虚拟机,用于用户初次体验及测试
  • Cross-Prelink : 用于在编译时刻确定动态链接库的位置,以避免在运行时加载动态链接库而使性能下降。
  • Eclipse IDE Plugin : 为eclipse开发的专用插件
  • EGLIBC(embedded version of the GNU C Library) : 针对嵌入式的glibc库,但其体积小,性能高。
  • Hob : 用于BitBake的GUI程序,图形化的方式来配置编译过程。
  • Matchbox : 专用于嵌入式平台下的图形管理器
  • OpenEmbedded Core(OE Core) : OpenEmbedded项目的核心组件
  • Poky : Yocto所提供的一个默认发行版,实际开发以其为基础做修改
  • Pseudo : Pseudo提供了一个虚拟环境,使得普通用户也拥有root部分权限,便于修改文件系统、权限等功能
  • Swabber : 提供一个构建沙盒环境,此环境中的工具链都是嵌入式工具链,不会与主机上的工具链相互冲突
  • Toaster : Toaster也是一个GUI形式的构建配置工具,但是它是可以通过远程网页的形式来访问的
    • 这在多人协作开发大工程时很为有用

厉害的是,yocto团队将这些小工程的耦合性做到了最小,也就是每个小工程都可以单独使用!

yocto的历史简略

知道历史对理解现在有很大的意义。

OpenEmbedded 和 Yocto 都派生于开源项目 OpenZaurus,OpenZaurus是由夏普公司开发的基于Linux的应用于PDA的软件平台。 当时夏普公司致力于以最简洁的方式可以构建出一套完整的系统,由此便诞生了 OpenEmbedded 项目。

OpenEmbedded 项目于2003年建立,它通过元数据(metadata ,描述数据的数据)来配置构建流程,到2005年开发组将其分离为 BitBake 构建系统 和 OpenEmbedded metadata 系统。 OpenEmbedded 受到了很多Linux免费和商业发型版厂商的支持,其中的 MontaVista Software和OpenedHand 便构建出了 Poky 发行版。

  • 元数据文件指的是配置文件的总称,比如配置文件、recipes文件、append 文件等。

BitBake 派生于Gentoo Linux发行版下的 Portage(由Python实现), BitBake 在Portage的规则基础上做了一些扩展,Portage由以下两部分组成:

  • ebuild: 构建源码的系统
  • emerge: 管理ebulid下的包依赖

Poky 发行版是一个通用版本,能比较容易的移植到其他硬件平台,很多其他的嵌入式发行版都基于此版本。

为了能够实现将 Poky 可以轻松移植到很多其他架构上的目的,Intel找到了Linux基金会并提出了此想法, Linux基金会在2010年10月26日对外宣布Yocto项目启动,在2011年4月6日宣布其初始版本发布。

yocto 与 OpenEmbedded的关系

yocto与OpenEmbedded是两个相互合作的项目,两个项目的元数据是共享的避免重复开发。

  • OpenEmbedded专注于技术难点、recipes、还有板级支持(bsp),将这些部分进行分层开发
  • yocto专注于构建框架,致力于以简便的方式帮助用户构建嵌入式和后期的测试

yocto中的一些专业术语

术语 说明
Append file Append 文件使用 .bbappend 作为后缀,用于对 recipe 文件的扩展或修改
BitBake OpenEmbedded中的构建引擎,其通过读取元数据文件(如:recipe文件)等配置文件实现编译控制
Board Support package(BSP) 用于对硬件的软件支持包,包含代码、文档、数据文件等
Class Class文件使用 .bbclass 作为后缀,是元数据文件(如:recipe文件)的基类文件,很多文件都可以继承于它
Configuration file 配置文件包含对构建过程中的变量,通过对变量设置来改变构建行为
Cross-development toolchain 针对目标板的工具链集合
image 镜像文件包含bootloader,kernel,rootfs集合或其中单独的一个
Layer yocto使用分层的方式来分别配置软件各个部分,一个层就是当前部分软件的元数据文件的集合
metadata metadata指的是用于控制BitBake行为的文件,包含class,recipes,append,configuration文件
OpenEmbedded Core(OE Core) 用于OpenEmbedded与Yocto之间的metadata共享的机制
Package Package是将软件、库、文档打包为特定格式,供操作系统安装或卸载。Yocto中表示软件包或metadata包
Package management system 管理系统之上的package安装、升级、卸载,以及各个包之间的依赖、兼容性等问题
Poky yocto的基础发行版
recipe 使用 .bb 作为后缀,属于metadata file的一种,用于控制BitBake对某一小组件的构建行为,比如源码下载位置、patch位置、如何安装、依赖关系、如何编译等等
task BitBake分析recipe执行构建,每个构建都是一个task
Upstream 指对应部分源码的上游地址或补丁地址
Last Updated 2018-10-14 日 19:32.
Render by hexo-renderer-org with Emacs 26.1 (Org mode 9.1.14)