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.youkuaiyun.com/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

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

Develop powerful embedded Linux systems with the Yocto Project components About This Book A hands-on guide to enhance your ability to develop captivating embedded Linux projects Learn about the compelling features offered by the Yocto Project, such as customization, virtualization, and many more Illustrates concepts such device-emulation and cross-compiling in a pragmatic and lucid way Who This Book Is For If you are a Yocto and Linux enthusiast who wants to build embedded Linux systems but do not have the knowledge to do it, this is the book for you. It will also help those of you who have a bit of knowledge about Linux and the embedded world and are keen on learning more about the technology. This book will provide you with the skills needed to successfully interact with the Yocto Project components regardless of the fact that you are new to embedded development or an expert. In Detail This book offers readers an idea of what embedded Linux software and hardware architecture looks like, cross-compiling, and also presents information about the bootloader and how it can be built for a specific board. This book will go through Linux kernel features and source code, present information on how to build a kernel source, modules, and the Linux root filesystem. You'll be given an overview of the available Yocto Project components, how to set up Yocto Project Eclipse IDE, and how to use tools such as Wic and Swabber that are still under development. It will present the meta-realtime layer and the newly created meta-cgl layer, its purpose, and how it can add value to poky. Table of Contents Chapter 1. Introduction Chapter 2. Cross-compiling Chapter 3. Bootloaders Chapter 4. Linux Kernel Chapter 5. The Linux Root Filesystem Chapter 6. Components of the Yocto Project Chapter 7. ADT Eclipse Plug-ins Chapter 8. Hob, Toaster, and Autobuilder Chapter 9. Wic and Other Tools Chapter 10. Real-time Chapter 11. Security Chapter 12. Virtualization Chapter 13. CGL and LSB
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值