Rockchip RK3588 - Yocto构建rk3588平台镜像(上)

大奥特曼打小怪兽 / 2024-06-07 / 原文

----------------------------------------------------------------------------------------------------------------------------

开发板 :ArmSoM-Sige7开发板
eMMC64GB
LPDDR48GB
显示屏 :15.6英寸HDMI接口显示屏
u-boot2017.09
linux6.1
----------------------------------------------------------------------------------------------------------------------------

在过去我们介绍过bootloaderlinux kernelrootfs等镜像的构建,为了构建每个镜像我们需要分别下载相应源码,并执行不同的构建命令。

那我们就会想,我们是否可以通过一条命令构建出适应于某个平台的所有镜像文件呢?答案是必然的,并且已经有成熟的方案。

下面我将手把手带大家进入Yocto宏大的世界,一起领略下Yocto伟大,以后再也不用为编译bootloaderlinux kernel、第三方库或程序、以及如何制作文件系统而苦恼了!

一、Yocto简介

1.1 Yocto

Yocto项目是Linux基金会的一个工作组,它是一个开源协作项目,帮助开发人员创建基于Linux的定制系统,这些系统专为嵌入式产品而设计,与产品的硬件架构无关。Yocto项目提供了一个灵活的工具集和开发环境,使世界各地的嵌入式设备开发人员能够通过共享技术、软件栈、配置和最佳实践来创建这些定制的Linux映像。

1.2 Poky

Poky是默认的Yocto项目参考发行版,使用OpenEmbedded构建系统技术。它由一系列工具、配置文件和配方数据(称为元数据)组成。它与平台无关,使用BitBake工具、OpenEmbedded Core和默认元数据集执行交叉编译,如下图所示。

img

此外,它还提供了一种机制,用于构建和组合成千上万的分布式开源项目,从而形成一个完全可定制的、完整的、连贯的Linux软件栈。

1.2.1 Bitbake

BitBake是一个任务调度器和执行系统,可解析PythonShell脚本代码。解析后的代码会生成并运行任务,这些任务是根据代码的依赖关系排序的一系列步骤。

BitBake会评估所有可用的元数据,管理动态变量扩展、依赖关系和代码生成。此外,它还会跟踪所有任务以确保其完成,从而最大限度地利用处理资源,缩短构建时间并提高可预测性。

1.2.2 OpenEmbedded Core

OpenEmbedded Core元数据集提供了Poky构建系统的引擎。它提供核心功能,并力求通用和尽可能精简。它支持七种不同的处理器架构(ARMARM64x86x86-64PowerPCPowerPC 64MIPSMIPS64RISC-V32RISC-V 64),仅支持QEMU模拟的平台。

1.2.3 元数据

元数据(Metadata)包括配方和配置文件。它由PythonShell Script文本文件混合组成,提供了非常灵活的工具。

Poky利用它来扩展OpenEmbedded Core,并包含两个不同的层,即其他元数据子集,如下所示:

  • meta-poky:该层提供默认和支持的发布策略、可视化品牌和元数据跟踪信息(维护者、上游状态等)。该层将作为一个精心策划的模板,供发行版构建者用于为其自定义发行版提供种子;

  • meta-yocto-bsp:提供板级支持包(BSP),作为Yocto项目开发和质量保证(QA)过程的参考硬件。

二、准备编译环境

对编译主机的要求,建议ubuntu 16.04版本以上的修通,并且建议磁盘空闲大小是50GB以上。

2.1 ubuntu系统

这里实验我直接在我的腾讯云服务器上进行,查看系统版本:

ubuntu@VM-4-9-ubuntu:~$ uname -a
Linux VM-4-9-ubuntu 5.15.0-94-generic #104-Ubuntu SMP Tue Jan 9 15:25:40 UTC 2024 x86_64 x86_64 x86_64 GNU/Linux
ubuntu@VM-4-9-ubuntu:~$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 22.04 LTS
Release:        22.04
Codename:       jammy

这里我使用的服务器ubuntu版本为22.04

2.2 安装依赖

在执行Yocto构建时,以下是执行此操作所需的最基本软件工具。这些工具在所有主机上都是通用的,包括Ubuntu 22.04

  • Git:用于版本控制和获取Yocto项目源代码;
  • Tar:用于解压Yocto项目中的压缩文件;
  • Python 3Yocto构建系统依赖Python 3
  • Wget:用于从网络下载文件;
  • MakeYocto构建系统使用Makefile进行构建;

确保在ubuntu 22.04主机上安装了这些工具,以便能够顺利进行Yocto构建。

 ubuntu@VM-4-9-ubuntu:~$ sudo apt update
 ubuntu@VM-4-9-ubuntu:~$ sudo apt install git git-lfs tar python3 python3-pip wget make

2.3 ubuntu指定软件包

除了上面列出的最低要求之外,还需要一些主机软件包才能成功执行Yocto构建。为了安装这些软件包,请执行以下命令;

ubuntu@VM-4-9-ubuntu:~$ sudo apt install gcc gawk diffstat unzip texinfo build-essential chrpath socat cpio python3-pexpect xz-utils debianutils iputils-ping python3-git python3-jinja2 libegl1-mesa libsdl1.2-dev xterm python3-subunit mesa-common-dev zstd liblz4-tool

三、Yocto构建

3.1 下载Poky项目

环境准备好之后开始下载源代码,假设在/opt目录中,执行如下命令。

ubuntu@VM-4-9-ubuntu:/opt$ git clone git://git.yoctoproject.org/poky
ubuntu@VM-4-9-ubuntu:/opt$ cd poky

注意:Poky下载和编译的整个环节(除了运行QEMU虚拟机外)不需要root权限,请尽可能不要在root环境下去操作。

考虑到下载网速较慢的问题,可以在如下网址下载:

ubuntu@VM-4-9-ubuntu:/opt$ git clone https://gitee.com/skearth/poky.git\
ubuntu@VM-4-9-ubuntu:/opt$ cd poky
# 将源修改为官方
ubuntu@VM-4-9-ubuntu:/opt/poky$ git remote set-url origin git://git.yoctoproject.org/poky

我们尽量选择一个稳定的长期支持的版本来做开发,比如kirkstoneyocto-4.0)版本,推荐使用,支持到2026年。

切换到对应的版本:

ubuntu@VM-4-9-ubuntu:/opt/poky$ git checkout -b kirkstone origin/kirkstone
/
ubuntu@VM-4-9-ubuntu:/opt/poky$ ll
drwxrwxr-x  6 ubuntu ubuntu  4096 Jun  6 23:11 bitbake/
drwxrwxr-x  4 ubuntu ubuntu  4096 Jun  6 23:09 contrib/
drwxrwxr-x 20 ubuntu ubuntu  4096 Jun  6 23:11 documentation/
drwxrwxr-x  8 ubuntu ubuntu  4096 Jun  6 23:11 .git/
-rw-rw-r--  1 ubuntu ubuntu   702 Jun  6 23:11 .gitignore
-rw-rw-r--  1 ubuntu ubuntu   834 Jun  6 23:09 LICENSE
-rw-rw-r--  1 ubuntu ubuntu 15394 Jun  6 23:09 LICENSE.GPL-2.0-only
-rw-rw-r--  1 ubuntu ubuntu  1286 Jun  6 23:09 LICENSE.MIT
-rw-rw-r--  1 ubuntu ubuntu  2202 Jun  6 23:11 MAINTAINERS.md
-rw-rw-r--  1 ubuntu ubuntu  1222 Jun  6 23:11 Makefile
-rw-rw-r--  1 ubuntu ubuntu   244 Jun  6 23:09 MEMORIAM
drwxrwxr-x 20 ubuntu ubuntu  4096 Jun  6 23:11 meta/
drwxrwxr-x  5 ubuntu ubuntu  4096 Jun  6 23:11 meta-poky/
drwxrwxr-x  9 ubuntu ubuntu  4096 Jun  6 23:11 meta-selftest/
drwxrwxr-x  8 ubuntu ubuntu  4096 Jun  6 23:11 meta-skeleton/
drwxrwxr-x  8 ubuntu ubuntu  4096 Jun  6 23:11 meta-yocto-bsp/
-rwxrwxr-x  1 ubuntu ubuntu  1297 Jun  6 23:09 oe-init-build-env*
lrwxrwxrwx  1 ubuntu ubuntu    33 Jun  6 23:09 README.hardware.md -> meta-yocto-bsp/README.hardware.md
lrwxrwxrwx  1 ubuntu ubuntu    14 Jun  6 23:09 README.md -> README.poky.md
-rw-rw-r--  1 ubuntu ubuntu   791 Jun  6 23:11 README.OE-Core.md
lrwxrwxrwx  1 ubuntu ubuntu    24 Jun  6 23:09 README.poky.md -> meta-poky/README.poky.md
-rw-rw-r--  1 ubuntu ubuntu   529 Jun  6 23:09 README.qemu.md
drwxrwxr-x 10 ubuntu ubuntu  4096 Jun  6 23:11 scripts/
-rw-rw-r--  1 ubuntu ubuntu  1177 Jun  6 23:11 SECURITY.md
-rw-rw-r--  1 ubuntu ubuntu    65 Jun  6 23:11 .templateconf

3.2 创建构建环境

构建目录是存放所有Yocto构建的地方。这使我们能够清晰地划分构建,同时尽可能地重复使用资源。在构建目录中,包含着平台配置、镜像/平台需要的特定变量、要添加到镜像中的其他recipes等。

要创建一个构建目录,只需执行一个名为oe-init-build-env的脚本,它将创建构建环境(路径、快捷方式、变量等)。

ubuntu@VM-4-9-ubuntu:/opt/poky$ source oe-init-build-env <name of your build directory>

如果没有指定名称,将自动创建一个名为build的构建目录。下次要使用相同的目录时,只需再次调用相同的命令。

此外,一旦执行了这个命令,就已经位于新创建的构建目录中。

ubuntu@VM-4-9-ubuntu:/opt/poky/build$ ll
drwxrwxr-x  2 ubuntu ubuntu 4096 Jun  6 23:21 conf/
ubuntu@VM-4-9-ubuntu:/opt/poky/build$ ll conf
-rw-rw-r-- 1 ubuntu ubuntu   262 Jun  6 23:21 bblayers.conf
-rw-rw-r-- 1 ubuntu ubuntu 11885 Jun  6 23:21 local.conf
-rw-rw-r-- 1 ubuntu ubuntu    15 Jun  6 23:21 templateconf.cfg
3.2.1 local.conf

conf目录下会创建local.conf文件,这个配置文件功能强大,几乎可以配置构建过程的方方面面。

我们可以为自定义跨工具链设置目标机器和工具链主机架构,优化选项以最大限度地缩短构建时间等等。

local.conf文件内的注释是极好的文档,也是可能的变量及其默认值的参考。我们可能需要更改默认值的最小变量集如下:

MACHINE ??= "qemux86-64"

通过MACHINE变量,我们可以确定要构建的目标机器。比如:

  • beaglebone-yocto:是32位ARM的参考平台;
  • genericx86:这是对基于x8632位机器的通用支持;
  • genericx86-64:这是对基于x8664位机器的通用支持;
  • edgerouter:这是EdgeRouter Lite,是64MIPS的参考平台;

Yocto构建默认选择的目标平台是qemux86-64

除了这些机器外,OpenEmbedded Coremeta目录中还提供了对以下快速仿真 (QEMU) 机器的支持:

  • qemuarmQEMU ARMv7仿真;
  • qemuarmv5QEMU ARMv5仿真;
  • qemuarm64QEMU ARMv8仿真;
  • qemumipsQEMU MIPS仿真;
  • qemumips64QEMU MIPS64仿真;
  • qemuppcQEMU PowerPC仿真;
  • qemuppc64QEMU PowerPC 64仿真;
  • qemux86-64QEMU x86-64仿真;
  • qemux86QEMU x86仿真;
  • qemuriscv32QEMU RISC-V 32仿真;
  • qemuriscv64QEMU RISC-V 64仿真;

3.3 开始Yocto构建

第一次构建通常是最耗时的,因为它从recipe提及的各种上游源下载数百个tarballs。因此,将其分为两个部分是个好主意;

  • 第一步只是获取所有的源代码、tarballs等;
  • 第二步是使用下载的资源以及配置元数据和配方进行实际构建。

谈到recipe,已经有许多核心镜像recipe可供我们使用。这些核心recipe使我们能够创建一个可工作的Linux镜像,而无需对平台进行任何自定义。成功创建这样一个镜像证明了我们的构建设置有效,然后我们可以继续为目标平台进行更复杂的构建。

在执行source oe-init-build-env时屏幕上已经显示了这些核心镜像的一个小子集。一些流行的核心镜像包括:

其中:

  • core-image-minimal:一个允许设备仅进行启动的小型镜像;
  • core-image-full-cmdline: 一个仅支持控制台的镜像,安装了更多功能丰富的Linux系统功能;
  • core-image-sato: 这是一个支持Sato的镜像,为使用X11的移动设备提供移动环境。它提供终端、编辑器、文件管理器、媒体播放器等应用程序;
  • core-image-weston:这个图像配置通常包括Weston显示服务器,它是用于嵌入式系统的Wayland协议的参考实现。core-image-weston提供了一个基本的Weston环境,适用于测试和验证嵌入式图形系统。

在本次实现我们使用 core-image-minimal 作为目标镜像,目标平台是qemux86-64

3.3.1 获取资源

首先获取资源:

ubuntu@VM-4-9-ubuntu:/opt/poky/build$ bitbake core-image-minimal --runall=fetch
Loading cache: 100% |                                                                                                  | ETA:  --:--:--
Loaded 0 entries from dependency cache.
Parsing recipes: 100% |#################################################################################################| Time: 0:01:30
Parsing of 883 .bb files complete (0 cached, 883 parsed). 1644 targets, 45 skipped, 0 masked, 0 errors.
NOTE: Resolving any missing task queue dependencies

Build Configuration:
BB_VERSION           = "2.0.0"
BUILD_SYS            = "x86_64-linux"
NATIVELSBSTRING      = "ubuntu-22.04"
TARGET_SYS           = "x86_64-poky-linux"
MACHINE              = "qemux86-64"
DISTRO               = "poky"
DISTRO_VERSION       = "4.0.14"
TUNE_FEATURES        = "m64 core2"
TARGET_FPU           = ""
meta
meta-poky
meta-yocto-bsp       = "kirkstone:3e73216a32a2b01916eb8c555a41579bd69a47aa"
......
3.3.2 编译

成功获取资源后我们进行编译, 编译时间取决于我们的系统资源;

ubuntu@VM-4-9-ubuntu:/opt/poky/build$ bitbake core-image-minimal

3.4 运行镜像

一旦构建完成,输出的镜像可以在tmp/deploy/images/qemux86-64文件夹中找到。

我们可以使用硬件模拟来加快开发进程,因为它可以在不涉及任何实际硬件的情况下进行测试运行。幸运的是,大多数项目只有很小一部分依赖于硬件。

Qemu是一款免费的开源软件包,可执行硬件虚拟化。基于Qemu的机器允许在没有实际硬件的情况下进行测试和开发。目前支持 ARMv5ARMv7ARMv8MIPSMIPS64PowerPCPowerPC 64RISC-V 32RISC-V 64、x86 和 x86-64 仿真。我们将在 "通过仿真加速产品开发 - QEMU "一文中详细介绍QEMU的使用。

OpenEmbedded Core提供了runqemu脚本工具,它是一个封装工具,能让Qemu的使用更简单。运行脚本工具的方法如下:

ubuntu@VM-4-9-ubuntu:/opt/poky/build$ runqemu qemux86-64 nographic

nographic参数告诉runqemu我们不希望启动图形用户界面(GUI)。这很方便,因为有时图形访问可能会有问题,可能导致崩溃。

参考文章

[1] yocto系列之yocto是个什么东东

[2] yocto系列之配置ubuntu主机

[3] yocto系列之构建与运行第一个镜像

[4] yocto系列之针对rk3588平台构建一个基础镜像

[5] 使用Yocto进行嵌入式Linux开发1 Yocto简介

[6] 基于Yocto构建嵌入式Linux系统U-bootkernel内核、rootfs文件系统

[7] Yocto系列讲解[入门篇] 1 - 快速入门熟悉Yocto的构建