Linux IoT 开发:从二进制操作系统调整到 Yocto 项目工作流程

作者:Mirza Krak

介绍 Yocto 项目以及在嵌入式 Linux 开发中使用它的好处。

在嵌入式 Linux 开发中,关于在设备上运行什么操作系统,有两种方法。您可以构建自己的发行版(使用 Yocto/OpenEmbedded-Core、Buildroot 等工具),或者您可以使用二进制发行版,其中 Debian 及其衍生版本很常见。

从二进制发行版开始是很常见的。这是一种自然的方法,因为对于大多数在 PC 上使用过 Linux 的人来说,这是一个熟悉的环境。所有必需品都已到位,并且其他人已经创建了发行版镜像供您下载。通常会有针对特定硬件的自定义供应商镜像,其中包含优化,以便于您轻松开始充分利用硬件。

任何可以想象到的软件包都可以通过 apt install 命令安装。当然,这使其适用于原型设计和评估,让您在开发应用程序和产品方面抢占先机。在某些情况下,您甚至可以使用此设置交付预系列设备,以进一步评估您的想法和产品。这被称为“黄金镜像”方法,涉及以下步骤

  1. 将下载的 Debian 镜像刷入 SD 卡。
  2. 启动 SD 卡,登录并进行任何需要的修改(例如,安装自定义应用程序)。一旦所有修改完成,这就成为您的黄金镜像。
  3. 将 SD 卡复制到工作站上的镜像中(例如,使用 dd)。
  4. 将“黄金镜像”刷入到一批设备中。

每次您需要进行更改时,只需重复步骤 2-4,但有一个变化——也就是说,在步骤 2 中启动已经保存的“黄金镜像”而不是“原始”镜像。

在某个时候,下载预构建的发行版镜像并手动对其应用更改的方法将成为一个问题,因为它不能很好地扩展,并且由于可能导致不一致输出的大量人工劳动而容易出错。优化方法是找到自动化此过程的方法,以可重现的方式生成包含您的应用程序和配置的发行版镜像。

这是一个十字路口,您可以在这里决定是坚持使用二进制发行版,还是将您的想法以及评估和原型设计阶段的结果转移到一个能够以可重现和自动化的方式生成自定义发行版和镜像的工具。

当然,有一些方法可以生成自定义 Debian 镜像,但这里的问题是碎片化。如果您使用供应商提供的镜像,他们可能已经创建了自己的工具(围绕 debootstrap 的 bash 脚本包装器)来生成这些镜像,您可能会获得访问权限。碎片化导致重用性很低,如果您稍后决定更换硬件,但仍然基于 Debian,您可能需要完全重新设计您的流程,因为这可能使用不同的工具集。

本文的其余部分假设您已选择切换到能够构建 Linux 发行版的工具——特别是基于 OpenEmbedded-Core 的 Yocto 项目。这有一些影响,我将尝试涵盖关键部分。

以下是来自 yoctoproject.org 网站的引述,为您快速总结 Yocto 项目

Yocto 项目 (YP) 是一个开源协作项目,旨在帮助开发人员创建自定义的基于 Linux 的系统,而无需考虑硬件架构。

该项目提供了一套灵活的工具和一个空间,全球嵌入式开发人员可以在其中共享技术、软件堆栈、配置和最佳实践,这些可以用于为嵌入式和物联网设备或任何需要定制 Linux 操作系统的地方创建量身定制的 Linux 镜像。

接下来,让我们看看从二进制发行版迁移到 Yocto 项目时,将影响您工作流程的关键差异。

Yocto 项目是一个交叉开发环境

由于 Yocto 项目是一个交叉开发环境,这意味着自定义 Linux 发行版镜像的构建和生成发生在主机上,目的是在目标机上运行输出。这可能意味着主机是 x86_64 机器,而目标是 ARM-v7——因此,称为“交叉开发”。

而且,乍一看这可能会让人感到害怕;从二进制发行版过渡过来,您可能以前没有遇到过这种工作流程。在“黄金镜像”示例中,您在实际设备上执行所有更改,但在 Yocto 环境中很少需要这样做,因为更改是在主机上的构建过程中应用的,您只需使用输出镜像来配置目标设备。

您可以在此 Wikipedia 帖子中阅读有关交叉编译器的更多信息。理解这个概念对于更顺畅地使用 Yocto 非常重要。

Yocto 项目是一种从头开始的方法

Yocto 的起点是构建一个包含启动系统所需基本组件的发行版镜像,仅此而已。当然,这本身并没有什么用处,但它是您构建的基础,并且只包含您选择包含的组件,不包含其他任何内容。这意味着您可以完全控制生成的发行版,并且可以为非常特定的用例量身定制。

了解哪些组件构成了 Linux 发行版可能需要额外的知识积累。当使用二进制发行版时,这通常不是您自己拼凑起来的东西,因为它已经由其他人完成。一个很好的参考是 Linux From Scratch 项目,这是一个关于如何创建自己的 Linux 发行版的循序渐进的教程。它本质上是 Yocto 所做的事情,但以自动化的方式进行。我不认为您需要详细了解每个步骤,但您可以使用 LFS 书籍快速了解哪些组件可以构成 Linux 发行版。

Yocto 项目从源代码构建

这意味着,使用 Yocto 项目,您不是使用由其他人编译和打包的二进制软件包,而是使用描述如何从源代码构建软件包的元数据。这意味着一切都从源代码构建,包括工具链、Linux 内核镜像、引导加载程序镜像、应用程序等等。

在 Yocto 中将软件包安装到您的自定义发行版中的工作流程是更改配置并重新构建。这相当于在 Debian 发行版上运行 apt install

“从源代码构建”的方法是 Yocto 项目在灵活性方面的优势之一。使用这种方法,您可以根据自己的需要自定义每个软件包,并且所有必要的更改都在构建时应用,这意味着输出镜像将包含所有期望的自定义——这与使用“黄金镜像”相比是一个很大的不同。

“从源代码构建”的方法也有缺点。它对构建发行版镜像所需的时间有重大影响,构建时间通常在几个小时内,并且涉及获取源代码、解包、编译、安装等步骤。Yocto 支持缓存机制,这意味着后续构建将快得多,通常在几分钟而不是几小时的范围内。

由于 Yocto 是一个资源密集型工具,因此使用它的项目需要规划基础设施更改和优化。这可能包括采购功能强大的机器来加速构建,或设置可以由开发人员利用的构建服务器,也可以在其中运行自动化构建。Yocto 中有很多优化可以帮助加速构建;您可以在 Yocto 项目 Mega-Manual 中阅读更多相关信息。

Yocto 项目—开源许可证合规性

值得一提的是,Yocto 中的开源许可证合规性略有不同,因为如果您需要重新分发生成的二进制文件(例如,对于 GPL 许可的代码),您将持有这些二进制文件的源代码。在二进制发行版中,生成的二进制文件的源代码由发行版托管。

有关更多信息,请参阅 Yocto Mega-Manual 中的 在产品生命周期内保持开源许可证合规性 部分。

结论

Yocto 有陡峭的学习曲线,您应该为此做好准备。Yocto 的优势在于灵活性,但这也会增加复杂性。

执行基本镜像的 快速构建 相当容易,但障碍通常是从此转向创建自定义内容,为此,您需要花时间阅读 Yocto 项目 Mega-Manual 以了解核心概念。以下是一些入门主题

学习 Yocto 的投入确实会带来长期的有价值的好处

  • 您将掌握一种工具,该工具使您可以充分了解和控制如何构建发行版镜像。更深入地了解系统肯定会在产品投入使用后调试问题时有所帮助。
  • 您将拥有简化的开发工作流程,具有更高的自动化程度和更高的可重现性。
  • 如果您决定更换硬件或计划发布基于同一平台的类似产品,您将提高软件堆栈的重用性。
  • 您将可以访问庞大的经验丰富的开发人员社区,他们愿意一路帮助您。
  • 由于 Yocto 的分层设计,您将可以访问庞大的生产级软件生态系统,该生态系统可以轻松集成到您的软件堆栈中。
资源

本文中的大部分信息和思考都来自我在嵌入式 Linux 领域的工作经验以及我参与的众多基于 Linux 的产品交付项目。

更多资源

Mirza Krak 是一位嵌入式 Linux 解决方案专家,在开源 Mender.io 项目中负责管理物联网更新。他拥有八年的行业经验。他参与了各种其他开源项目,并且是 Linux 内核贡献者。Mirza 曾在包括嵌入式 Linux 会议在内的各种会议上发表演讲。

加载 Disqus 评论