本章开始介绍 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
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 等等)
下图列出将会介绍的所有层级,后续章节会透过各种各样的范例,逐一学习其中各项工具,让读者能充分掌握。
何谓 Poky?
Poky 是 Yocto 项目官方提供的参考建置系统,包含一些 OpenEmbedded 的基本元件(称为建置系统),以及一组用来建立嵌入式发行版的后设资料,支持好几种目标架构。Poky 是独立的平台,使用 BitBake 工具(任务排程器)、OpenEmbedded-Core 与预设的后设资料组合来进行交叉编译,如下图所示。Poky 提供一整套机制,能构建并整合数以千计的开源软件包。
Poky 构建系统将会成为工业领域的参考标准,各大业界领袖,如 Win River、Intel、Montavista 和 Mentor Graphics 都已表态支持。
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 是如何工作的:
OpenEmbedded-Core
OpenEmbedded-Core 后设资料集(下图中 meta 那一块),提供作为 Poky 构建工具的引擎,其设计理念是提供几项核心功能(几个配方)。支持六种不同的处理器架构(ARM、x86、x86-64、PowerPC、MIPS、MIPS64),另外,仅支持以 QEMU 模拟出来的虚拟机器。
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 项目的开发环境,以展现交叉编译框架。
让我们逐一检视图中每个组成部分的作用:
- 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 的缩写,译为板级支持包,内容物是各个板子专属的组态设定、资料、规格等。