使用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 项目参考手册》(https://docs.yoctoproject.org/4.0.4/ref-manual/index.html )以获取完整的最新列表。

为目标构建镜像的过程很简单。但首先,在使 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运行了映像,这让我们对可用功能有了很好的概览。

热门相关:总裁的秘密爱人   嫡嫁千金   名门盛婚:首席,别来无恙!   网游三国之城市攻略   重生之嫡女祸妃