构建 i.MX8 Yocto BSP 镜像

本文所使用的构建主机是 i5 四核 8GB 内存的 Ubuntu 20.04(官方建议在 Ubuntu 18.04),构建目标系统为 Linux 5.4 版本(Yocto 3.0 Zeus)。

Yocto 概述

什么是 Yocto

Yocto Project 起源于一群年轻人想给他们自己的 PDA 编写一个操作系统,当时没有一家公司给 PDA 编写操作系统,于是这些人便想自己写一个。他们采用了 Linux Gentoo 桌面的几个工具,尤其是采用了编译工具 bitbake。刚开始 bitbake 和元数据是打包在一起的,但几年后 bitbake 从元数据中分离出来,形成了现在的 OpenEmbedded。当时有些公司采用了 OpenEmbedded 作为他们的工具,但大多数的嵌入式系统厂商依然采用自己的工具和流程来裁剪 Linux。

到了2010年,由于看到大多数公司花费大量的人力和财力干相同的事情,Wind River Systems 和 Intel 开源技术中心牵头成立了一个开源项目,旨在开发一套标准的构建工具,这套工具采用了 OpenEmbedded 的几个关键组件,任何人都可以使用,任何人都可以贡献。这个项目不以盈利为目的,而是保持开放和中立,为需要他们的社区提供工具和支持,因此这个项目开始与 Linux 基金会合作,由此诞生了 Yocto Project。

如今,Yocto Project 已经成为嵌入式 Linux 系统创建的标准方式,有18个组织和社区成员,这包括了数十家公司、数百名贡献者,以及超过140个国家的开发人员。这是世界上最大的合作开源软件项目之一。

官方网站:https://www.yoctoproject.org

为什么要用 Yocto

使用 Yocto Project 构建 i.MX8 Linux 系统的原因包括:

  1. Yocto Project 是一个由许多专家和半导体企业组织的开源项目,发展至今已经相当可靠;
  2. NXP 是 Yocto Project 项目的重要成员,旗下的 i.MX 系列处理器(i.MX6、i.MX7、i.MX8)均采用该方式构建系统,我们选择 Yocto 方式便于与 Linux 和 NXP 社区同步。
  3. Yocto Project 可以帮助您创建定制的 Linux 系统和嵌入式产品,不必过于关心硬件体系,简化了客制化 Linux 的开发过程。
  4. 通过创建和维护自己的 layer,可以实现不同硬件平台、不同产品的兼容与管理,提高代码复用率。

下载资源包

点击 这里 找到并下载资料包,本专栏使用 L5.4.47_2.2.0_LINUX_DOCS 版本。下载解压后会看到一个《i.MX Yocto Project User’s Guide》文档(简称 IMXLXYOCTOUG),本文部分内容就是参考该文档的,建议仔细阅读哦~

主机设置

安装依赖

sudo apt install -y gawk wget git-core diffstat unzip texinfo \
     gcc-multilib build-essential chrpath socat cpio python \
     python3 python3-pip python3-pexpect xz-utils debianutils \
     iputils-ping python3-git python3-jinja2 libegl1-mesa \
     libsdl1.2-dev pylint3 xterm

安装 repo 工具

Repo 是基于 Git 的一个构建工具,便于管理多个 Git 仓库。Repo 很好地补充了 Yocto 项目的分层性质,使用户更容易将自己的层添加到 BSP 中。

安装 repo 工具的步骤:

  1. 在家目录中创建 bin 目录
    $ mkdir ~/bin # this step may not be needed if the bin folder already exists
    $ curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
    $ chmod a+x ~/bin/repo
    
  2. 在 .bashrc 文件中添加下面一行,确保 ~/bin 目录在 PATH 变量中
    export PATH=~/bin:$PATH
    

另外一种安装方式是使用 Ubuntu 的包管理系统,命令如下:

$ sudo apt-get install repo

提示:repo 自 Ubuntu 16.04 后开始支持,但 Ubuntu 20.04 不支持!使用 apt 方式安装不需要创建 ~/bin 目录和修改 .bashrc 文件。

Git 配置

Repo 工具依赖 Git,因此使用之前需要确保已经配置好 Git 账户。

$ git config --list
$ git config --global user.name "Your Name"
$ git config --global user.email "Your Email"

准备 i.MX Yocto 工程

下面给出我的操作示例,在这个示例中,我们创建一个名为 imx-yocto-bsp 的工程目录,您可以根据需要修改它。接着设置 manifest 填充 Yocto Project 层源。

$ mkdir imx-yocto-bsp
$ cd imx-yocto-bsp
$ repo init -u https://source.codeaurora.org/external/imx/imx-manifest -b imx-linux-zeus -m imx-5.4.47-2.2.0.xml
$ repo sync

Tips:https://source.codeaurora.org/external/imx/imx-manifest/tree/?h=imx-linux-zeus 列出了此发行版中支持的所有清单文件(manifest files)。

执行完上述步骤,源代码将检出到 imx-yocto-bsp/sources 目录。

您可以执行 repo sync 命令同步仓库,周期性地执行可以更新到最新代码。

如果仓库初始化过程出现错误,请尝试删除 .repo 目录,然后再次运行初始化命令。

上面 repo init 一行使用最新的补丁进行配置,按照 index: imx-manifest.git 中的指示检索原始 GA。否则,默认情况下会提取 GA plus 补丁。要从 zeus base 获取以前的发行版,请在 repo 初始化行的末尾添加 -m(加上 release manifest 名字),它将检索以前的发行版。上面提供的链接中的 README 文件中提供了示例。

以下是我的目录结构:

imx-yocto-bsp$ tree -L 1
.
├── imx-setup-release.sh -> sources/meta-imx/tools/imx-setup-release.sh
├── README -> sources/base/README
├── README-IMXBSP -> sources/meta-imx/README
├── setup-environment -> sources/base/setup-environment
└── sources

构建系统映像

构建配置

i.MX 提供了一个 imx-setup-release.sh 脚本,用于简化 i.MX 机器的配置过程。要使用脚本,需要指定要为其构建的特定计算机的名称(MACHINE)以及所需的图形后端(DISTRO)。该脚本为指定的计算机和后端设置目录和配置文件。

使用 imx-setup-release.sh 脚本进行配置的语法如下:

DISTRO=<distro name> MACHINE=<machine name> source imx-setup-release.sh -b <build dir>

可以看到,您可以根据实际情况设置 DISTRO、MACHINE 和 build 目录。build 目录的名称可以随便指定(只要能认出来即可,因为后面可能会有多个 build 目录),所以关键在于 DISTRO 和 MACHINE 的设定。

在 meta-imx 层中,i.MX 提供了覆盖 meta-freescale 机器配置的新的或更新的机器配置。这些文件通过 imx-setup-release.sh 脚本复制到 meta-freescale/conf/machine 目录中。

$ ls sources/meta-freescale/conf/machine/
imx23evk.conf          imx6sxsabreauto.conf  include
imx25pdk.conf          imx6sxsabresd.conf    ls1012afrwy.conf
imx28evk.conf          imx6ulevk.conf        ls1012ardb.conf
imx51evk.conf          imx6ullevk.conf       ls1021atwr.conf
imx53ard.conf          imx7dsabresd.conf     ls1028ardb.conf
imx53qsb.conf          imx7ulpevk.conf       ls1043ardb.conf
imx6qdlsabreauto.conf  imx8mmevk.conf        ls1046afrwy.conf
imx6qdlsabresd.conf    imx8mqevk.conf        ls1046ardb.conf
imx6slevk.conf         imx8qmmek.conf        ls1088ardb.conf
imx6sllevk.conf        imx8qxpmek.conf       ls1088ardb-pb.conf

以下是可以选择的 i.MX 机器配置文件。您可以检查发行说明或计算机目录中的最新内容。

i.MX6 i.MX7 i.MX8
imx6qpsabreauto
imx6qpsabresd
……
imx7dsabresd
imx7ulpevk
imx8qmmek
imx8qxpmek
……
imx8mqevk

DISTRO 主要指定发行版的图形后端,包括 Frame Buffer、Wayland 和 XWayland 都具有发行版配置,如果没有指定,那么默认使用 XWayland 发行版。发行版配置保存在 DISTRO 设置的 local.conf 文件中,并在运行 bitbake 时显示。

这里列出 DISTRO 的配置列表,需要注意的是 i.MX 8 不支持 fsl-imx-fb,并且不再支持 fsl-imx-x11。

  • fsl-imx-wayland – Wayland weston graphics.
  • fsl-imx-xwayland – Wayland graphics and X11. X11 applications using EGL are not supported.
  • fsl-imx-fb – Frame Buffer graphics – no X11 or Wayland. Frame Buffer is not supported on i.MX 8.

比如对于 i.MX8MQ-EVK 平台,我们可以这样配置:

DISTRO=fsl-imx-wayland MACHINE=imx8mqevk source imx-setup-release.sh -b build-wayland

注意:每个构建文件夹必须以仅使用一个发行版的方式进行配置。每次 DISTRO_FEATURES 变量改变了,都需要重新指定一个干净的 build 目录。

执行完成,您会看到如下信息,并且已经进入 build-wayland 目录。

Welcome to Freescale Community BSP

The Yocto Project has extensive documentation about OE including a
reference manual which can be found at:
    http://yoctoproject.org/documentation

For more information about OpenEmbedded see their website:
    http://www.openembedded.org/

You can now run 'bitbake <target>'

Common targets are:
    core-image-minimal
    meta-toolchain
    meta-toolchain-sdk
    adt-installer
    meta-ide-support

Your configuration files at build/ have not been touched.

构建映像

Yocto Project 使用 bitbake 命令进行构建。例如,bitbake <component> 构建对应的组件。每个组件的构建都包含多个任务,比如拉取(fetching)、配置(configuration)、编译(compilation)、打包(packaging)以及发布(deploying)到目标 rootfs 中。bitbake image 构建会收集映像所需的所有组件,并按每个任务的依存关系进行构建。第一个构建是工具链以及构建组件所需的工具。

值得注意的是,Yocto Project 提供了一些可在不同层上使用的映像,Poky 也提供了一些映像,meta-freescale 和 meta-freescale-distro 提供了一些映像,并且在 meta-imx 层中提供了其他映像配方。i.MX Yocto project 映像如下表所示。

Image name Target Provided by layer
core-image-minimal A small image that only allows a device to boot. Poky
core-image-base A console-only image that fully supports the target device hardware. Poky
core-image-sato An image with Sato, a mobile environment and visual style for mobile devices. The image supports a Sato theme and uses Pimlico applications. It contains a terminal, an editor and a file manager. Poky
imx-image-core An i.MX image with i.MX test applications to be used for Wayland backends. This image is used by our daily core testing. meta-imx/meta-sdk
fsl-image-machine-test An FSL Community i.MX core image with console environment – no GUI interface. meta-freescale-distro
imx-image-multimedia Builds an i.MX image with a GUI without any Qt content. meta-imx/meta-sdk
imx-image-full Builds an opensource Qt 5 image with Machine Learning features. These images are only supported for i.MX SoC with hardware graphics. They are not supported on the i.MX 6UltraLite, i.MX 6UltraLiteLite, i.MX 6SLL, and i.MX 7Dual. meta-imx/meta-sdk

您可以根据实际情况选择一个 image,不同的 image 包含不同层次内容,所以最终构建的大小和所需的时间都不一样。针对产品级应用来说,当然建议使用官方提供的 meta-imx 层的 image。

比如我这里选择不带 Qt 的 imx-image-multimedia 映像进行构建:

$ bitbake imx-image-multimedia

等待完成

接下来就是漫长的等待…… 你可以去喝杯茶、看份报纸、睡一觉,再回来看看。

对啦,如果你在重启电脑或退出终端后想重新进入配置环境,在 imx-yocto-bsp 目录执行下面命令即可。

source  setup-environment <build dir>

发布映像

历尽艰辛,终于构建完了!完整的文件系统映像已部署到 <build directory>/tmp/deploy/images

映像在大多数情况下是特定于环境设置中设置的机器的。每个映像构建都基于计算机配置文件中定义的 IMAGE_FSTYPES 创建一个 U-Boot,一个内核和一个映像类型。大多数机器配置都提供 SD 卡映像(.wic)和 rootfs 映像(.tar)。

$ cd tmp/deploy/images/imx8mqevk/
$ ls imx-image-multimedia*
imx-image-multimedia.env
imx-image-multimedia-imx8mqevk-20210226114323.rootfs.manifest
imx-image-multimedia-imx8mqevk-20210226114323.rootfs.tar.bz2
imx-image-multimedia-imx8mqevk-20210226114323.rootfs.wic.bmap
imx-image-multimedia-imx8mqevk-20210226114323.rootfs.wic.bz2
imx-image-multimedia-imx8mqevk-20210226114323.testdata.json
imx-image-multimedia-imx8mqevk.manifest
imx-image-multimedia-imx8mqevk.tar.bz2
imx-image-multimedia-imx8mqevk.testdata.json
imx-image-multimedia-imx8mqevk.wic.bmap
imx-image-multimedia-imx8mqevk.wic.bz2
imx-image-multimedia-imx-imx-boot-bootpart.wks

烧写 SD 卡映像

SD 卡映像(.wic)包含适用于引导相应硬件的分区映像(具有 U-Boot,内核,rootfs 等)。使用如下命令烧写 SD 卡映像:

$ bunzip2 -dk -f imx-image-multimedia-imx8mqevk.wic.bz2
$ sudo dd if=imx-image-multimedia-imx8mqevk.wic of=/dev/sdb bs=1M conv=fsync

bunzip2 命令是 .bz2 文件的解压缩程序。bunzip2 可解压缩 .bz2 格式的压缩文件。bunzip2 实际上是 bzip2 的符号连接,执行 bunzip2 与 bzip2 -d 的效果相同。

注意:确保您的 SD 卡是否为 /dev/sdb,如果不是请自行修改!

从 SD 卡启动系统

如果您的硬件平台与 MCIMX8M-EVK 板兼容,将 SD 卡插入板卡,选择从 SD 卡启动,上电即可启动我们刚刚制作好的映像!

打开串口终端,登录 root 账户。

root@imx8mqevk:~# uname -a
Linux imx8mqevk 5.4.47-g94d6dc139-dirty #3 SMP PREEMPT Thu Mar 4 14:50:32 CST 2021 aarch64 aarch64 aarch64 GNU/Linux

好啦!本节已经很长了,到这里就先结束了,更多细节将在本专栏后面章节展开讨论。

参考资料

Leave a Reply