Yocto进行嵌入式Linux开发

1 Yocto简介

1.1 什么是Yocto项目?

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

全球数以千计的开发人员发现,Yocto项目在系统和应用程序开发、存档和管理以及用于速度、占用空间和内存利用率的定制方面都具有优势。该项目是提供嵌入式软件栈的标准。该项目允许针对多个硬件平台进行软件定制和构建交换,并允许维护和扩展软件栈。

Yocto提供模板、工具和方法,帮助我们为嵌入式产品创建基于Linux的定制系统,而无需考虑硬件架构。它可以根据glibc和 musl C 标准库以及实时操作系统 (RTOS Real-Time Operating System) 工具链生成定制的 Linux 发行版,用于裸机开发,如Zephyr项目所做的那样。

该项目由Linux基金会成员管理,独立于成员组织,成员组织以多种方式参与该项目并为其提供资源。

该项目成立于2010年,由众多硬件制造商、开源操作系统、供应商和电子公司合作完成,旨在减少重复工作,并为新老用户提供资源和信息。这些资源包括OpenEmbedded项目提供的核心系统组件OpenEmbedded Core。

Yocto项目汇集了多家公司、社区、项目和工具,其目的都是一样的--构建基于Linux的嵌入式产品。这些利益相关者同舟共济,在社区需求的驱动下携手合作。

为了便于我们理解Yocto项目的职责和成果,我们可以用计算器来进行类比。输入是一组描述我们所需的数据,也就是我们的规范。
输出则是我们想要的基于Linux的嵌入式产品。输出由操作系统的各个部分组成。它包括Linux内核、引导加载器和根文件系统(rootfs),它们被捆绑在一起并组织在一起工作。

Yocto项目的工具可用于所有中间步骤,以生成rootfs捆绑包和其他可交付成果。先前构建的软件组件可在不同的构建过程中重复使用(应用程序、库或任何软件组件)。

如果无法重复使用,则按照正确的顺序和所需的配置构建软件组件,包括从各自的源代码库(如Linux内核档案库(www.kernel.org)、GitHub、BitBucket 和 GitLab)获取所需的源代码。

Yocto项目的工具会准备好构建环境、实用程序和工具链,从而减少对主机软件的依赖。这些实用程序、版本和配置选项与主机Linux发行版无关,在产生相同结果的同时,最大限度地减少了需要依赖的主机实用程序的数量。它大大提高了确定性,减少了对构建主机的依赖,同时提高了首次构建的成功率。

BitBake和OpenEmbedded Core属于OpenEmbedded项目,而Poky等一些项目则属于Yocto项目。它们互为补充,在系统中发挥着特定的作用。我们将在本章和本书中详细了解它们是如何协同工作的。

1.2 OpenEmbedded项目与Yocto项目的联盟

OpenEmbedded项目是在2003年1月左右创建的,当时来自OpenZaurus项目的一些核心开发人员开始使用新的构建系统。从一开始,OpenEmbedded构建系统就是一个受 Gentoo Portage软件包系统启发并基于该系统的任务调度程序,名为BitBake。因此,项目的软件集和支持的机器列表迅速增加。

由于开发过程混乱且不协调,在需要更稳定、更完善代码库的产品中使用OpenEmbedded十分具有挑战性,因此Poky发行版应运而生。Poky最初是OpenEmbedded构建系统的一个子集,在有限的体系结构中拥有更完善、更稳定的代码库。此外,由于规模缩小,Poky还能开发一些亮点技术,如集成开发环境插件和快速模拟器 (QEMU) 集成,这些技术目前仍在使用中。

Yocto项目和OpenEmbedded项目在名为 OpenEmbedded Core的核心构建系统上进行了整合。它采用了Poky和OpenEmbedded的精华,强调更多使用附加组件、元数据和子集。2010年11月左右,Linux基金会宣布Yoct 项目将在Linux基金会赞助的项目下继续这项工作。

1.3 了解Poky

Poky是默认的Yocto项目参考发行版,使用OpenEmbedded构建系统技术。它由一系列工具、配置文件和配方数据(称为元数据)组成。它与平台无关,使用BitBake工具、OpenEmbedded Core和默认元数据集执行交叉编译,如下图所示。此外,它还提供了一种机制,用于构建和组合成千上万的分布式开源项目,从而形成一个完全可定制的、完整的、连贯的 Linux 软件栈。

Poky的主要目标是提供嵌入式开发人员所需的所有功能。

1.3.1 BitBake

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

BitBake会评估所有可用的元数据,管理动态变量扩展、依赖关系和代码生成。此外,它还会跟踪所有任务以确保其完成,从而最大限度地利用处理资源,缩短构建时间并提高可预测性。BitBake 的开发在 bitbake-devel@lists.openembedded.org | Home 邮件列表中进行,源代码在Poky的bitbake子目录中。

1.3.2 OpenEmbedded Core

OpenEmbedded Core元数据集提供了Poky构建系统的引擎。它提供核心功能,并力求通用和尽可能精简。它支持七种不同的处理器架构(ARM、ARM64、x86、x86-64、PowerPC、PowerPC 64、MIPS、MIPS64、RISC-V32 和 RISC-V 64),仅支持QEMU模拟的平台。
开发工作集中在 https://lists.openembedded.org/g/openembedded-
core (mailto:openembedded-core@lists.openembedded.org) 邮件列表,并将其元数据存放在Poky的meta子目录中。

1.3.2元数据

元数据(Metadata)包括配方和配置文件。它由Python和Shell Script文本文件混合组成,提供了非常灵活的工具。Poky利用它来扩展 OpenEmbedded Core,并包含两个不同的层,即其他元数据子集,如下所示:

  • meta-poky

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

  • meta-yocto-bsp

提供板级支持包(BSP),作为 Yocto 项目开发和质量保证(QA)过程的参考硬件。
第9章 "使用 octo项目开发"将更详细地探讨元数据,并在我们编写配方时作为参考。

1.4 Yocto项目的发布Yocto

项目每六个月发布一次版本,分别在四月和十月。这种发布周期确保了持续的开发流程,同时提供了更多的测试点,并注重稳定性。只要一个版本准备就绪,它就会成为稳定版或长期支持 (LTS) 版。

稳定版和长期支持版的支持期有很大不同。稳定版的支持期为7个月,每个稳定版有1个月的重叠支持期。LTS版本的最低支持期为2年,可选择延长。官方支持期结束后,转为社区支持,最后达到生命周期结束(EOL)。

官方发布支持期结束后,如果有社区成员加入成为社区维护者,发布版本就可以转为社区支持版本。最后,当源代码在两个月内没有任何变化,或者社区维护者不再是活跃成员时,发布版本就会转为EOL。

下图显示了两个发布周期:

下表提供了 Yocto 项目的版本、代号、发布日期和当前支持级别,如下所示。更新后的表格见 Yocto Project

使用Yocto进行嵌入式Linux开发2 第一个基于Poky的系统 

2 第一个基于Poky的系统

2.1 构建主机系统

  • Ubuntu:
$ sudo apt install gawk wget git diffstat unzip texinfo gcc build-essential chrpath socat cpio python3 python3-pip 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

  • Fedora

$ sudo dnf install gawk make wget tar bzip2 gzip python3 unzip perl patch diffutils diffstat git cpp gcc gcc-c++ glibc-devel texinfo chrpath ccache perl-Data-Dumper perl-Text- perl-Thread-Queue perl-bignum socat python3-pexpect findutils which file cpio python python3-pip xz python3-GitPython python3-jinja2 SDL-devel xterm rpcgen mesa-libGL-devel perl-
FindBin perl-File-Compare perl-File-Copy per-locale zstd lz4

2.2 下载Poky 代码

在我们的开发主机系统上安装了所需的软件包后,我们可以使用 Git 下载当前 LTS 版本的 Poky 源代码,命令如下:


$ git clone https://git.yoctoproject.org/poky -b kirkstone

下载完成后,poky 目录中的内容如下:

2.3 准备构建环境

在poky目录中存在oe-init-build-env脚本,用于设置构建环境。


$ source oe-init-build-env [build-directory]

这里,[build-directory] 是一可选参数,用于指定配置环境的目录名称。如果为空,则默认为 build。

2.4 local.conf

初始化构建环境时,它会创建build/conf/local.conf文件。这个配置文件功能强大,几乎可以配置构建过程的方方面面。我们可以为自定义跨工具链设置目标机器和工具链主机架构,优化选项以最大限度地缩短构建时间等等。build/conf/local.conf文件内的注释是极好的文档,也是可能的变量及其默认值的参考。我们可能需要更改默认值的最小变量集如下:

MACHINE ??= "qemux86-64"

通过 MACHINE 变量,我们可以确定要构建的目标机器。在撰写本文时,Poky的参考BSP支持以下机器:

  • beaglebone-yocto

BeagleBone,是 32 位 ARM 的参考平台

  • genericx86

这是对基于x86的32位机器的通用支持

  • genericx86-64

这是对基于x86的64位机器的通用支持

  • edgerouter

这是 EdgeRouter Lite,是64位MIPS 的参考平台。

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

  • qemuarm: QEMU ARMv7 仿真
  • qemuarmv5:这是 QEMU ARMv5 仿真
  • qemuarm64:这是 QEMU ARMv8 仿真
  • qemumips: 这是 QEMU MIPS 仿真
  • qemumips64: 这是 QEMU MIPS64 仿真
  • qemuppc: 这是 QEMU PowerPC 仿真
  • qemuppc64: 这是 QEMU PowerPC 64 仿真
  • qemux86-64: 这是 QEMU x86-64 仿真
  • qemux86: 这是 QEMU x86 仿真
  • qemuriscv32:这是 QEMU RISC-V 32 仿真
  • qemuriscv64: 这是 QEMU RISC-V 64 仿真

一些供应商提供的额外BSP层为其他机器提供支持。使用额外BSP层的过程参见第11章 "探索外部层"。

注意local.conf文件是覆盖整个Yocto项目工具中若干全局默认配置的便捷方法。基本上,我们可以更改或设置任何变量,例如在映像文件中添加额外的软件包。更改 build/conf/local.conf文件非常方便,但源代码管理系统通常不会跟踪此目录中的临时更改。

build/conf/local.conf 文件可以设置多个变量。值得花些时间阅读生成的文件注释,以便大致了解可以设置哪些变量。
构建目标映像Poky提供了几种预先设计好的映像配方,我们可以用它们来构建二进制映像。我们可以在 poky 目录下运行以下命令来查看可用图像列表:

$ ls meta*/recipes*/*images/*.bb 

所有配方提供的镜像都是一组解包和配置好的软件包,生成的文件系统可用于硬件或受支持的 QEMU 机器之一。
接下来,我们可以看看最常用的镜像列表:

  • core-image-minimal 镜像: 这是一个允许设备启动的小型镜像。它便于内核和引导加载器的测试和开发。
  • core-image-base: 该图像仅用于控制台,为目标设备提供基本硬件支持。
  • core-image-weston: 该镜像提供 Wayland 协议库和参考 Weston 合成器。
  • core-image-x11:这是一个带有终端的基本 X11 映像。
  • core-image-sato:这是一个支持 Sato 的镜像,为使用 X11 的移动设备提供移动环境。它提供终端、编辑器、文件管理器、媒体播放器等应用程序。
  • core-image-full-cmdline: 纯控制台镜像,安装了功能更全面的 Linux 系统功能。

社区还提供其他参考镜像。有几种镜像支持实时、initramfs 和 MTD(闪存工具)等功能。最好查看源代码或《Yocto 项目参考手册》(Yocto Project Reference Manual — The Yocto Project ® 4.0.4 documentation )以获取完整的最新列表。

为目标构建镜像的过程很简单。但首先,在使 BitBake 之前,我们需要使用源代码 oe-init-build-env [build-directory] 来设置构建环境。要构建镜像,我们可以使用下面命令中的模板:

$ bitbake core-image-full-cmdline

2.5 在QEMU中运行映像

我们可以使用硬件模拟来加快开发进程,因为它可以在不涉及任何实际硬件的情况下进行测试运行。幸运的是,大多数项目只有很小一部分依赖于硬件。
QEMU是一款免费的开源软件包,可执行硬件虚拟化。基于QEMU的机器允许在没有实际硬件的情况下进行测试和开发。目前支持 ARMv5、ARMv7、ARMv8、MIPS、MIPS64、PowerPC、PowerPC 64、RISC-V 32、RISC-V 64、x86 和 x86-64 仿真。我们将在 "通过仿真加速产品开发 - QEMU "一文中详细介绍QEMU的使用。

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

$ runqemu <machine> <zimage> <filesystem>
$ runqemu qemux86-64 core-image-full-cmdline

这里, 是要用作 qemux86-64 的机器/架构,或任何其他受支持的机器。此外, 是内核的路径(例如,bzImage-qemux86-64.bin)。
最后, 是ext4 映像的路径(例如,filesystem-qemux86-64.ext4)或NFS目录的路径。前面调用 runqemu 和 时的所有参数都是可选的。只需运行runqemu 足以在设置了构建环境的 shell 中启动映像,因为它会自动获取构建环境时的默认设置。
因此,举例来说,如果我们运行runqemu qemux86-64 core-image-full-cmdline,就会看到与下面截图类似的内容:
 


在完成 Linux 启动后,你会看到登录提示:

我们可以使用空密码登录root账户。即使在QEMU内执行,系统也会像普通机器一样运行。在实际硬件中部署映像的过程各不相同,这取决于所使用的存储类型、引导加载程序等。不过,生成镜像的过程是相同的。我们将在第15章"启动自定义嵌入式 Linux"中探讨如何在真实硬件中构建和运行映像。

2.6 小结

在本章中,我们学习了设置Poky和构建第一个映像所需的步骤。然后,我们使用runqemu运行了映像,这让我们对可用功能有了很好的概览。

3 Toaster

我们已经知道了如何在Poky中使用BitBake构建图像image,那么我们将学习如何使用Toaster完成同样的操作。

3.1 什么是Toaster?

Toaster是一个用于配置和运行构建的Web接口。它与BitBake和Poky构建系统通信,以管理和收集有关构建、软件包和镜像的信息。

使用Toaster的两种方法:

  • 本地

可以将Toaster作为本地实例运行,适用于单用户开发,为BitBake命令行和一些构建信息提供图形界面。

  • 托管

适合多用户使用。Toaster服务器会构建和存储用户的工件。使用托管实例时,其组件可以分布在多台机器上。

在本章中,我们将把Toaster作为本地实例使用。不过,如果您想将其用作托管实例,请访问以下网站获取说明--《Toaster 手册》(https://docs.yoctoproject.org/4.0.4/toaster-manual/index.html)。

3.2 安装Toaster

Toaster使用Python Django框架。

$ pip3 install --user -r bitbake/toaster-requirements.txt 

启动:

$ source oe-init-build-env
$ source toaster start

浏览器打开http://127.0.0.1:8000。 默认情况下,Toaster通过端口8000启动。网络端口参数允许您使用不同的端口,例如:$source toaster start webport=8400。

参考资料

3.2 构建映像

创建新项目

项目主界面,下图所示:

在"Configuration"选项卡上,转到"Machine",将目标机器更改为qemux86-64:

点击Image recipes选项卡,选择要构建的映像。我们将构建 core-image-full-cmdline:

构建过程需要一些时间,但之后我们就可以看到已构建的图像以及一些统计数据,如下图所示:

下图为core-image-full-cmdline目录结构:

Toaster是一款功能强大的工具。您可以在本地开发机器或共享服务器上使用它,以图形方式显示构建过程。你可以返回启动Toaster的终端,运行runqemu qemux86-64 core-image-full-cmdline。您将看到下面的截图:
 


在完成Linux启动后,你会看到登录提示。

我们可以使用空密码登录root账户。

附录A:搭建环境问题解决方法

开发环境

名称

版本

ubuntu

24.04

问题:Please make sure locale 'en_US.UTF-8' is available on your system

解决方法:sudo locale-gen en_US.UTF-8

问题:User namespaces are not usable by BitBake, possibly due to AppArmor.

网址:https://bugs.launchpad.net/ubuntu/+source/apparmor/+bug/2056555


解决方法:sudo apparmor_parser -R /etc/apparmor.d/unprivileged_userns


问题:yocto闪退

sudo dmesg
[689378.340967] audit: type=1400 audit(1736761255.856:2391): apparmor="DENIED" operation="userns_create" class="namespace" info="Userns create restricted - failed to find unprivileged_userns profile" error=-13 profile="unconfined" pid=1412713 comm="libdnf-native:c" requested="userns_create" denied="userns_create" target="unprivileged_userns"

解决方法:sudo gedit /etc/apparmor.d/bitbake
内容:
abi <abi/4.0>,
include <tunables/global>
profile bitbake /**/bitbake/bin/bitbake flags=(unconfined) {
        userns,
}

sudo apparmor_parser -r /etc/apparmor.d/bitbake


问题:error: externally-managed-environment

× This environment is externally managed
╰─> To install Python packages system-wide, try apt install
    python3-xyz, where xyz is the package you are trying to
    install.


网址:https://blog.csdn.net/tobinator3105/article/details/143582997


有两种解决方法:
1、临时解决方法在pip命令后使用--break-system-packages
pip3 install --user -r bitbake/toaster-requirements.txt --break-system-packages

2、永久解决办法:
mkdir -p ~/.config/pip
nano ~/.config/pip/pip.conf

在nano编辑器中,加
[global]
break-system-packages = true
user = true

/*------完------*/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值