天天看点

初识 Yocto 项目

本章开始介绍 Yocto 项目,将阐述主要概念,贯穿本专栏的种种概念,都会在本章里一一说明。我们将要简述 Yocto 专案的发展历史、建置系统、Poky、OpenEmbedded-Core、BitBake、后设资料(metadata),以及使用 Yocto 的工作流程。

Yocto 项目

Yocto 是项总括计划,犹如一把大伞,涵盖与嵌入式 Linux 系统相关的各种技术,其涵盖范围非常广。尚请注意,Yocto 本身并不是 Linux 发行版(distribution)。其​​官方网站​​如此形容 Yocto 项目:

Yocto Project – It’s not an embedded Linux distribution – it creates a custom one for you.

Yocto 是一个开源项目,涵盖各种协力专案,提供样板、工具、方法,帮助你能够以 Linux 为基础来构建系统,不论底层硬件架构是什么,都可以自订并且建立系统,供嵌入式产品使用。

Yocto 项目背后有着 Linux 基金会的资助,不仅仅是一套构建系统,还提供各种工具、程序、样板与方法,让开发人员能够快速地建立软件系统、部署到嵌入式设备(比如 Raspberry Pi、Beagleboard、Nitrogen6x、SAMA5D3、Olinuxino 等)或 QEMU。Yocto 项目主要组成元件有两个:

  • Poky—— 这是构建系统(供我们参考的官方建议标准);
  • BitBake—— 这是排程器,此项工具基于 Gentoo 发行版。

Linux 基金会于 2010年11月左右,发表声明宣布这整套成果将会在 Yocto 专案的旗帜之下继续发展,并由 Linux 基金会提供资助(由基金会成员 Richard Purdie 担任主架构师)。然后,Yocto 项目与 OpenEmbedded 通力合作,以称为 OE-Core 的套件后设资料核心集合为基础,结合 Poky 与 OpenEmbedded 最出色的部分,加上其他许多软件层,提供额外的工具元件。

了解建置系统

如前所述,我们和 Yocto 项目身处于建置系统的世界。所谓建置系统,需要具备的功能如下:

  • 编译或交叉编译应用程序
  • 把应用程序包装成套件
  • 测试二进制程序档与生态系统相容性
  • 部署产生出来的映像档

为了进行这些步骤,已经存在着许许多多的工具,其中部分如下:

  • Buildroot(​​https://buildroot.org​​)
  • LTIB(​​http://ltib.org​​)
  • OpenWRT(​​https://openwrt.org​​)
  • Yocto/OpenEmbedded(​​https://www.yoctoproject.org​​)

举例而言,Buildroot 是一组 makefile 档,用来自动化嵌入式系统的构建过程,支持编译 bootloader(如 U-Boot)和 Linux 内核(zImage 或 bzImage),并以 BusyBox 和第三方应用程序支持基本的控管工具;Buildroot 可在各种架构上头运作,诸如 ARM、x86 和 MIPS。如果想进一步了解,请参阅完整的官方文件 ​​https://buildroot.org/docs.html​​

初识 Yocto 项目
Buildroot 这套工具,部分由 Free Electrons 公司维护,这家法国公司专精于开发嵌入式 Linux 系统。

比起本专栏所介绍的 Yocto 专案,Buildroot 采用的做法较为简单、单纯,Buildroot 比较适用于产生“初体”,而 Yocto/OpenEmbedded 的方向则是产生整套系统的“发行版”。Buildroot 提供的配方数量约为 700 个,与之相比,Yocto 项目提供超过 8000 个配方。

主要元件

Yocto 项目的主要元件(其他可用工具属于选用性),条列如下:

  • BitBake
  • OpenEmbedded-Core
  • Poky
  • BSP 层(meta-raspberry、meta-fsl-arm、meta-ti、meta-intel、meta-sunxi 等等)

下图列出将会介绍的所有层级,后续章节会透过各种各样的范例,逐一学习其中各项工具,让读者能充分掌握。

初识 Yocto 项目

何谓 Poky?

Poky 是 Yocto 项目官方提供的参考建置系统,包含一些 OpenEmbedded 的基本元件(称为建置系统),以及一组用来建立嵌入式发行版的后设资料,支持好几种目标架构。Poky 是独立的平台,使用 BitBake 工具(任务排程器)、OpenEmbedded-Core 与预设的后设资料组合来进行交叉编译,如下图所示。Poky 提供一整套机制,能构建并整合数以千计的开源软件包。

Poky 构建系统将会成为工业领域的参考标准,各大业界领袖,如 Win River、Intel、Montavista 和 Mentor Graphics 都已表态支持。

初识 Yocto 项目
​​Angstrom​​ 是另一套以 OpenEmbedded-Core 为基础所打造出来的系统,你可以把 Angstrom 和 Poky 想象成表兄弟,因为 Poky 也同样基于 OpenEmbedded-Core。

发令中心:BitBake

BitBake 构建引擎,扮演着任务排程器(如同 GNU Make)的角色,负责解析各种脚本档案(例如 shell 脚本和 Python 程序)。

一旦开始构建环境,BitBake 就会着手执行你要求的任务,若没提供任务,BitBake 则会执行叫做 build 的预设任务。

执行任务前,BitBake 会先查询叫做 ​

​do_<task name>​

​​ 的环境变量,应含有需要执行的任务程序(以 Python 或 shell 脚本语言编写),所以,如果要编译某 Yocto 配方,将会使用记录在环境变量 ​

​do_compile​

​ 里的程序。

简言之,根据配方(或后设资料 metadata)里含有的信息,BitBake 会到网络、本地端的某目录、或是某版本控制系统(如 Git),下载项目的源代码,然后根据动态产生的相依关系图,按照顺序进行构建工作;最后,BitBake 会安装编译好的二进制文件、产生相对应的套件、并且构建出最终的镜像,之后就可以安装到目标机器(对我们来说将会是 Raspberry Pi)。

下图展示 BitBake 是如何工作的:

初识 Yocto 项目

OpenEmbedded-Core

OpenEmbedded-Core 后设资料集(下图中 meta 那一块),提供作为 Poky 构建工具的引擎,其设计理念是提供几项核心功能(几个配方)。支持六种不同的处理器架构(ARM、x86、x86-64、PowerPC、MIPS、MIPS64),另外,仅支持以 QEMU 模拟出来的虚拟机器。

初识 Yocto 项目

OpenEmbedded-Core 的内容组织如下所示。这一层包含各个不同的配方,描述如何抓取所需档案、设定组态、编译并包装应用程序和镜像。

├── classes
├── conf
├── files
├── lib
├── recipes-bsp
├── recipes-connectivity
├── recipes-core
├── recipes-devtools
├── recipes-extended
├── recipes-gnome
├── recipes-graphics
├── recipes-kernel
├── recipes-multimedia
├── recipes-rt
├── recipes-sato
├── recipes-support
├── site
├── COPYING.MIT
└── recipes.txt      

在本专栏后续的篇幅里,我们将会混合这一层和 Raspberry Pi 的 BSP 层(meta-raspberrypi)。

探索后设资料

后设资料(metadata)由 Python 程序和 shell 脚本文件(.conf、.bb、.bbclass、.inc)混合组成,提供极度有弹性的系统。后设资料意指构建指令本身,以及各种用来控制该构建何物、影响构建过程的相关资料;后设资料所包含的指令和资料,还用来指出该使用哪个版本的软件,以及从哪里获取。Poky 以 OpenEmbedded-Core 为基础并予以扩充,加上另两个不同的层级,属于另外的后设资料子集合,详细描述如下:

  • meta-yocto:这一层提供支持的预设发行版、视觉标签、后设资料追踪资讯(维护者、上游状态等等);
  • meta-yocto-bsp:使用者应在这一层之上,提供硬件参考板子支持套件包(BSP),提供给 Poky。

Yocto 项目的工作流程

下图比较高层面的形式描绘出 Yocto 项目的开发环境,以展现交叉编译框架。

初识 Yocto 项目

让我们逐一检视图中每个组成部分的作用:

  • User Configuration(使用者组态):此处的后设资料,作用是控制整个构建程序。
  • Metadata(后设资料层):此处有好几层,提供软件、机器、发行版的后设资料。
  • Sources(源代码):包含上游释出、本地端项目以及源代码版本控制系统(Git、SVN 等)。
  • Build system(构建系统):这些是在 BitBake 控制之下的程序,这一大区块可再细分,分为 BitBake 如何抓取源代码、补丁、完成编译工作、分析产生套件、建立并测试套件、产生镜像、以及产生交叉开发工具组。
  • Package Feeds(套件源):此处目录包含输出后的套件(RPM、DEB 或 IPK),之后再由构建系统拿去用于建立镜像和 SDK。也可使用网站服务器或其他管道,复制与分享这些套件源,在执行期间扩充、更新装置上既有的映像档内容,如果启用执行期间套件管理功能的话。
  • Images(映像档):由开发程序产生出来的映像档(组成作业系统的各个部分,诸如内核镜像、bootloader 和根文件系统)。
  • SDK:由 BitBake 产生的交叉开发工具组,可跟着映像档一同产生,或是分开产生。

总结

本章概述 Yocto 项目的主要组成元件,包括 Poky、OpenEmbedded-Core 和 BitBake,以及其运作概况,如何同在 Yocto 大伞之下协力合作。

  • metadata 在这里翻译为后设资料,包括建置指令本身和相关配置。
  • image 在这里翻译为映像档,其他常见译词为镜像档。
  • recipe 在这里翻译为配方,描述需要执行的动作,例如抓档案、设定组态、编译等等。
  • BSP 是 Board Support Package 的缩写,译为板级支持包,内容物是各个板子专属的组态设定、资料、规格等。

继续阅读