许多开发人员认为物联网和嵌入式 Linux 设备是他们今天工作环境的扩展。但现实情况是,为嵌入式 Linux 设备开发和维护应用程序伴随着一系列独特的挑战和工作流程。此外,一些创建新物联网产品的嵌入式开发人员由于各种原因没有采用容器等现代工具及其实践。
软件开发更复杂
毫无疑问,软件开发,尤其是云计算,这些年来变得更加复杂。同样的复杂程度也适用于物联网和嵌入式 Linux 系统。嵌入式设备越来越复杂,并将继续变得越来越复杂。当前的 Raspberry Pi 和 Nvidia 板就是很好的例子。这些是片上系统 (SOC) 的示例,它提供了许多具有许多创新功能的资源,可以使开发和管理应用程序和其他系统变得更加复杂。
云开发人员所需的技能范围广泛而多样,无论是从单个开发人员的角度来看,还是从整个团队的角度来看都是如此。云开发人员需要处理许多不同的系统,从像 Git 这样的源代码控制存储库到像 Kubernetes 这样的自动化持续集成和部署管道和编排系统。尽管如此,在你开始将应用程序部署到云之前,你还需要掌握开发应用程序的语言和框架以及存储系统。
嵌入式工程师和硬件
嵌入式工程师还有管理硬件的额外要求。与拥有近乎无限资源的云不同,嵌入式工程师还必须评估板的功能和限制。
嵌入式 Linux 产品也往往会在市场上销售很长时间,有时甚至长达 10 年。因此,另一个考虑因素是软件和固件必须可靠且易于更新。大多数设备都是连接的,并且像裸机服务器一样是物联网基础设施的基本组件。嵌入式开发人员最不想担心的是会导致整个网络或生态系统崩溃的关键软件错误。
嵌入式工程和现代云技术
通过采用容器及其实践等现代云技术,可以满足许多这些特定于嵌入式的要求。但采用容器还有许多其他好处,可以帮助嵌入式工程团队,例如更快的周转时间,以将概念原型验证到生产就绪,以及提高开发速度。
从概念验证到生产就绪
在处理新的和复杂的框架和库时,嵌入式工程师必须保持高效并领先于曲线。例如,工程师需要快速构建和迭代可与客户一起评估和测试的概念证明或产品原型,以快速确定其是否是可构建并推向市场的可行产品。
上市速度
原型经过测试和批准后,你需要做好准备并尽快将其推向市场。如果测试成功,你还希望成为市场上第一个使用有望领先于竞争对手的新一代产品的人。
生命周期管理的长期视野
嵌入式 Linux 设备需要长期维护,需要一种可靠的方式来安全地更新和维护设备。对于嵌入式系统,嵌入式开发人员需要一致的电源和一种简单的方法来回滚或转发到良好状态,以防出现问题而不是最终导致设备变砖。
在没有容器的情况下构建嵌入式 Linux 系统
多年来,构建嵌入式 Linux 系统几乎没有变化。尽管有像 Buildroot 和 Yocto 这样专门针对嵌入式系统的发行版,但围绕嵌入式系统设计和架构的开发方法和实践与 20 年前相似。
传统上,嵌入式团队的发布周期很慢,包括每隔几个月甚至每年一次的整体发布,其中包含每个小的更改到一个大版本中。这种类型的释放可能适用于封闭的设备。但是,如果你的设备连接到互联网或在一个车队中呢?如果是这种情况,则需要快速交付其中一些更改和更新。
单映像整体部署
以下是嵌入式 Linux 工程师在创建嵌入式系统时将采用的传统工作流程。编译和调试后,结果是部署到板上的单个图像。
在组装和定制板级支持包以及 Linux 内核库和模块后,你需要决定要用于你的应用程序的框架和库。然后,整个系统使用 Yocto 或 Buildroot 分层构建或“配方”。
当然,这从来没有听起来那么简单,而且在使用特定工具链进行交叉编译时,通常会出现依赖冲突需要调试。但是,一旦完成,最终结果是部署到设备的单个整体映像。
单一映像部署的优缺点
单个图像的一个优点是可以对其进行优化以在设备上运行得更快。但是,一个缺点是,如果有关键补丁、新功能或任何其他类型的更新,嵌入式开发人员必须重复整个过程,这可能很耗时。
容器和管理复杂性
还记得开发人员说“在我的机器上工作!”的日子。使用容器,你现在可以做到这一点。本质上,容器允许你将带有应用程序及其底层依赖项的机器移动到另一台机器上,并确信它按预期运行。这是因为容器将应用程序和任何依赖项打包为可以在任何环境(包括嵌入式 Linux 设备)中运行的标准化单元。
将所有依赖项打包到一个独立的单元中,使系统和应用程序能够在没有任何外部帮助的情况下完成工作,并提供了许多单体架构所不具备的独特优势。
嵌入式 Linux 系统的便携式构建模块
自包含的标准化软件单元的一个显着优势是能够将你的整体系统划分为逻辑组件。每个组件都可以独立地使用容器之间的接口和容器运行时来管理它们。例如,你可以将系统级组件与应用程序分开。你还可以在用户空间中为你的应用程序使用你想要的任何语言或框架,而不必担心下面运行的是什么操作系统。有关更多信息,请参阅“掌握嵌入式 Linux 设备上的容器”或观看演讲“(发行版)是否仍然相关”。
便携式构建块为嵌入式世界提供了与云开发人员如今所使用的语言独立性相同的优势。今天,大多数云开发人员甚至都没有考虑他们正在运行什么 Distro,甚至没有考虑在一个集群中运行了多少其他语言。相反,开发人员将时间花在他们的应用程序或服务上,以便为客户而不是基础设施提供价值。这些相同的好处也可以扩展到构建物联网的嵌入式开发Linux工程团队。
更高效、更敏捷的工程团队
将内核库与用户区分开组件化的另一个优点是能够将更高级别的应用程序开发移交给另一个团队。例如,嵌入式 Linux 操作系统可以由根文件系统、引导加载程序、内核和 BSP 在单独的容器和其他可选实用程序(如容器中的网络和图形库)中组件化。一旦硬件工程师为特定板构建了系统,就可以使用简单的 Docker 组合文件跨项目共享标准系统级容器。
同样,应用程序开发人员使用的框架(例如 UI 或分布式存储)也可以构建为容器,并以可移植的方式在应用程序开发团队之间共享。同样,这可以提高开发效率,并有助于快速完成概念验证,然后最终更快地将可生产的产品推向市场。
简化的软件生命周期管理
容器化嵌入式 Linux 系统和应用程序库的另一个好处是它们可以更快、更有效地更新。通过容器管理不同版本库的能力,你无需重新开始并通过更新构建新的单体应用程序,你可以更新单个组件,而无需每次都重新构建整个系统。由于容器是不可变且可移植的,你还可以将测试和部署自动化为 CICD 管道,从众多可用的开放工具中进行选择,并使用更新和安全补丁快速构建新容器。所有这些最终都会加快产品交付速度并提高物联网安全性。
归根结底,在你的嵌入式开发工作流程中实施 DevOps 可以快速有效地更新你的 IoT 设备。DevOps、容器和自动化将使物联网车队更加安全,同时不断为你的客户提供新的服务和功能。