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
- 软件测试精品书籍文档下载持续更新 https://github.com/china-testing/python-testing-examples 请点赞,谢谢!
- 本文涉及的python测试开发库 谢谢点赞! https://github.com/china-testing/python_cn_resouce
- python精品书籍下载 https://github.com/china-testing/python_cn_resouce/blob/main/python_good_books.md
- Linux精品书籍下载 https://www.cnblogs.com/testing-/p/17438558.html
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
$ 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运行了映像,这让我们对可用功能有了很好的概览。