Blog:
韬睿硬件的 Yocto 项目参考构建
本篇文章中将简要介绍韬睿基于 Ångström 发行版的默认 BSP 和 Yocto Project 参考构建系统 Poky 之间的差异和联系。第一章节将介绍使用 meta-distribution 的动机。如果您已经知道 bitbake 和 OpenEmbedded,以及它们的优点,那么你可以跳过该部分。
Distributions vs. Meta-distributions
为了高效地使用 Linux 和开源软件,发行版系统一般都包含预先编译以及打包好的开源软件。这使得在操作系统中可以方便地安装和移除额外的软件。然而,当软件包需要进一步定制时,例如移除某些功能、不同配置或者集成修复补丁,针对嵌入式项目处理一个大型发行版的软件打包过程将会遇到诸多问题。经典的编译系统仅使用本地编译,相比于在工作站或者编译服务器上,这在嵌入式设备上是相当慢的。软件包的定制无法被上传,因为这对于发行版的其他用户并不适用。在分支中维护这些更改,也是极费时间的。在另一方面,从底层开始构建定制化 Linux 文件系统,而不使用高级的编译系统,同样是十分耗费时间并且容易出错。
为了解决最大的灵活性和发行版的易用性之间的矛盾, meta-distributions 也就应运而生。一般来讲,这些发行版是针对嵌入式应用所涉设计的。一个完善的构建系统,允许定制每一个软件包,同时从源开始交叉编译整一个文件系统。两个针对嵌入式 Linux 最为广泛使用的 meta-distributions 分别是 Buildroot 和 OpenEmbedded。
本文将主要讨论 bitbake 和 OpenEmbedded - 韬睿所使用构建 BSP 的构建系统。bitbake 和 OpenEmbedded 目前在 Yocto 项目下进行开发,而 Yocto 项目则是 Linux 基金会工作组。
在 OpenEmbedded 中,distribution 层配置文件系统的基本功能。Yocto 项目有自己基于 bitbake 和 OpenEmbedded 的 distribution 层,称为 Poky。韬睿 BSP 则使用另一个针对 OpenEmbedded 广为使用的 distribution 层 Ångström。之所以选择 Ångström 的一个原因是 Ångström 提供预编译的软件包。预编译的软件源允许桌面发行版安装其他的软件。这在原型开发阶段会特别有用,我们的演示镜像也是基于这个目的。如果你希望使用 Yocto 项目的参考构建系统 Poky,这也是非常容易的,因为底层所使用的构建系统是一致的。
Yocto 详情
在 OpenEmbedded 环境中,一般发布的周期是 6 个月。但版本的名字和序号取决于(子)项目的开发情况。下面的表格能帮助你了解相关的版本情况。
OpenEmbedded Codename |
Yocto Project Release |
Poky Distribution |
Ångström Distribution |
Toradex Version |
dylan | 1.4 | 9.0 | v2013.06 | 2.1 |
dora | 1.5 | 10.0 | v2013.12 | 2.2 |
daisy | 1.6 | 11.0 | v2014.06 | 2.3 |
dizzy | 1.7 | 12.0 | v2014.12 | 2.4 |
fido | 1.8 | 13.0 | v2015.06 | 2.5 |
(master) | 1.9 |
OpenEmbedded 是一个分层的构建系统。这使得 meta-distributions 核心功能和各个板级支持的开发具有较大的独立性。韬睿提供自己的板级支持层 meta-toradex。与此同时,我们还维护着一个独立的层 meta-lxde,这包含了我们默认的用户界面,基于 GTK2 的 LXDE(Lightweight X11 Desktop Environment)。Poky 使用 Sato 作为其默认的用户界面,这是一个基于 GTK2 的定制化桌面环境。因此,使用 Poky 构建系统将不需要使用 meta-lxde 层。除此之外,韬睿还开始参与针对 NXP®/Freescale 开发板(meta-fsl-arm 和 meta-fsl-arm-extra)的社区 BSP 开发。目前,基于 NXP®/Freescale Vybrid 的计算机模块(Colibri VF50/VF61)在这些层中已经得到支持,我们在 近期 提供对 NXP®/Freescale i.MX 6 模块的支持。
目前,meta-toradex 并不是一个纯粹的 BSP 层。这已经随着时间增长了很多,我们计划将其分为软件层和相应的 BSP 层。韬睿的层中也包含了定制化镜像文件部署步骤:在镜像编译完成后,有一个专门的步骤来整合我们的烧写工具和脚本(例如 update.sh)以及生成一个可以分发的 tar.bz2 包。这个镜像定制过程不适用于 Poky 镜像。因此,韬睿使用 update.sh 的标准烧写流程将不起作用。当然,用户可以下载韬睿发布的二进制镜像文件并且使用其中的烧写脚本。
下面的步骤介绍了如何编译两个镜像文件:
- 根据 meta-toradex 层使用 Poky 参考发布 12.0 (dizzy)为 Apalis T30 模块编译的镜像。
- 根据 meta-fsl-arm-extra 层使用 Poky 参考发布 13.0 (fido)为 Colibri VF50/VF61 模块编译的镜像
为 Apalis T30 构建 Poky 的 Sato 镜像
在开始之前,针对不同的发行版,需要先执行 Yocto 项目 Quick Start 中描述的 准备步骤 。在你编译主机的终端中,执行下面的命令。我们首先需要下载 Poky 构建系统的 Dizzy 分支。
$ git clone http://git.yoctoproject.org/git/poky -b dizzy ...
下一步,我们需要获取 Toradex 层。因为这些层支持飞思卡尔 SoC 的 meta-fsl-arm 层,所以同样需要被添加:
$ cd poky $ git clone https://github.com/Freescale/meta-fsl-arm.git -b dizzy $ git clone git://git.toradex.com/meta-toradex.git -b V2.4-next
完成默认 OE 环境初始化。在初始化完成后,你会进入 Build 目录:
$ source oe-init-build-env
在层配置文件 conf/bblayers.conf 中添加需要的层:
BBLAYERS ?= " \ /build/ags/poky/meta \ /build/ags/poky/meta-yocto \ /build/ags/poky/meta-yocto-bsp \ /build/ags/poky/meta-toradex \ /build/ags/poky/meta-fsl-arm \ "
conf/local.conf 中配置设备
MACHINE ?= "apalis-t30"
meta-toradex 层中的一些 bbappend-recipes 对 LXDE 配置做了定制化修改。为了避免因基本配置的缺失导致的错误,需要在 conf/local.conf 中添加配置选项:
BB_DANGLINGAPPENDS_WARNONLY = "true"
现在可以使用 bitbake 工具开始编译。根据你的电脑配置,这个过程会花费数个小时,并且消耗大量 CPU 和磁盘读写资源。然而 bitbake 编译系统会重复使用已经编译好的软件包,所以后续修改所需的编译会较快得执行。
$ bitbake core-image-sato ...
在 Yocto 项目中烧写并不是一个标准化的步骤。韬睿提供烧写工具和脚本,可以创建 SD 卡来烧写目标板。我们同样可以利用这些工具来烧写 Poky 发行版。为此,需要下载韬睿 Linux 镜像文件,解压之后使用 Poky 文件系统系统替代基于 Ångström 的文件系统:
$ sudo su # tar xvjf Apalis_T30_LinuxImageV2.4Beta1_20150518.tar.bz2 # rm -rf rootfs/ # mkdir rootfs/ # tar xvjf path/to/poky/build/tmp/deploy/images/apalis-t30/core-image-sato-apalis-t30.tar.bz2 -C rootfs/ # echo "Apalis_T30" >> rootfs/etc/issue
同时把外部的内核和 U-Boot 文件复制进来:
# rm apalis-t30_bin/u-boot* # cp --preserve=links path/to/poky/build/tmp/deploy/images/apalis-t30/u-boot* apalis-t30_bin/ # rm apalis-t30_bin/uImage* # cp --preserve=links path/to/poky/build/tmp/deploy/images/apalis-t30/uImage* apalis-t30_bin/
使用 update.sh 制作包含 U-Boot bootloader, Linux kernel 和文件系统的 SD 卡。
./update.sh -o /run/media/user/UPDATE
最后的三个步骤,在每次使用编译系统生成新的镜像时都需要执行。
将 SD 卡插入模块的载板上,使用 u-Boot 命令启动韬睿的烧写脚本:
Apalis T30 # run update ... Apalis T30 # run setupdate ...
重启之后,系统就会加载 Yocto 文件系统,以及显示基于 GTK2 的 Sato 用户界面。
更多的信息,请参考 Yocto 项目说明文档:
获取所有可用文档,请访问 yoctoproject.org.
为 Colibri VF50/VF61 构建 Poky 的 Sato 镜像
这里大部分的内容和上面 Apalis T30 的指令一样,除了在层的选择和烧写步骤方面具有一些差别。在开始之前,针对不同的发行版,需要先执行 Yocto 项目 Quick Start 中描述的 准备步骤 。在你的电脑上运行下面的命令。我们首先需要下载 Poky 构建系统的 Fido 分支:
$ git clone http://git.yoctoproject.org/git/poky -b fido ...
下一步,我们需要飞思卡尔社区层 meta-fsl-arm 和 meta-fsl-arm-extra。因为 Colibri VF50/VF61 BSP 配置(主要是 Kernel/U-Boot)属于飞思卡尔社区层,所以 Vybrid 模块就无需使用韬睿层。
$ cd poky $ git clone https://github.com/Freescale/meta-fsl-arm.git -b fido $ git clone https://github.com/Freescale/meta-fsl-arm-extra.git -b fido
完成默认 OE 环境初始化。在初始化完成后,你会进入 Build 目录:
$ source oe-init-build-env
在层配置文件 conf/bblayers.conf 中添加需要的层:
BBLAYERS ?= " \ /build/ags/poky/meta \ /build/ags/poky/meta-yocto \ /build/ags/poky/meta-yocto-bsp \ /build/ags/poky/meta-fsl-arm \ /build/ags/poky/meta-fsl-arm-extra \ "
conf/local.conf 中配置设备:
MACHINE ?= "colibri-vf"
如同上面一样,使用 bitbake 工具开始编译:
$ bitbake core-image-sato
如有需要,boot loader 可以在第二步中编译:
$ bitbake u-boot
在 meta-fsl-arm-extra 中的设备配置文件直接生成一个 UBI 文件系统镜像,因此就不必使用 update.sh 生成镜像。将镜像复制到 FAT 格式的 SD 卡中:
$ cd tmp/deploy/images/colibri-vf/ $ cp core-image-sato-colibri-vf.ubifs /run/media/user/UPDATE/ubifs.img $ cp u-boot-nand.imx /run/media/user/UPDATE/u-boot-nand.imx
默认更新命令所需的更新脚本是韬睿镜像的一部分,同样需要从已解压的镜像包中复制出来:
$ cd path/to/Colibri_VF_LinuxImageV2.4 $ cp colibri-vf_bin/flash*.img /run/media/user/UPDATE
将 SD 卡插入模块的载板上,使用 u-Boot 命令启动韬睿的烧写脚本(请参考 Flashing Embedded Linux to Vybrid Modules):
Colibri VFxx # run update ... Colibri VFxx # run setupdate ...
重启之后,系统就会加载 Yocto 文件系统,以及显示基于 GTK2 的 Sato 用户界面。
更多的信息,请参考 Yocto 项目说明文档:
获取所有可用文档,请访问 yoctoproject.org.