构建嵌入式 Linux 系统的4种有效工具

导读 了解 Yocto、Buildroot、 OpenWRT,和改造过的桌面发行版以肯定哪一种方式最适合你的项目。

构建嵌入式 Linux 系统的4种有效工具构建嵌入式 Linux 系统的4种有效工具

Linux 被部署到比 Linus Torvalds 在他的宿舍里开发时所预期的更普遍的设备。使人震惊的支持了各类芯片,使得Linux 能够应用于大大小小的设备上:从 IBM 的巨型机到不如其链接的端口大的微型设备,以及各类大小的设备。它被用于大型企业数据中心、互联网基础设施设备和我的的开发系统。它还为消费类电子产品、移动电话和许多物联网设备提供了动力。html

在为桌面和企业级设备构建 Linux 软件时,开发者一般在他们的构建机器上使用桌面发行版,如 Ubuntu 以便尽量与被部署的机器类似。如 VirtualBox 和 Docker 这样的工具使得开发、测试和生产环境更好的保持了一致。linux

什么是嵌入式系统?编程

维基百科将嵌入式系统定义为:“在更大的机械或电气系统中具备专用功能的计算机系统,每每伴随着实时计算限制。”bootstrap

我以为能够很简单地说,嵌入式系统是大多数人不认为是计算机的计算机。它的主要做用是做为某种设备,而不被视为通用计算平台。浏览器

嵌入式系统编程的开发环境一般与测试和生产环境大不相同。它们可能会使用不一样的芯片架构、软件堆栈甚至操做系统。开发工做流程对于嵌入式开发人员与桌面和 Web 开发人员来讲是很是不一样的。一般,其构建后的输出将包含目标设备的整个软件映像,包括内核、设备驱动程序、库和应用程序软件(有时也包括引导加载程序)。缓存

在本文中,我将对构建嵌入式 Linux 系统的四种经常使用方式进行纵览。我将介绍一下每种产品的工做原理,并提供足够的信息来帮助读者肯定使用哪一种工具进行设计。我不会教你如何使用它们中的任何一个;一旦缩小了选择范围,就有大量深刻的在线学习资源。没有任何选择适用于全部状况,我但愿提供足够的细节来指导您的决定。服务器

Yocto网络

Yocto 项目 定义为“一个开源协做项目,提供模板、工具和方法,帮助您为嵌入式产品建立定制的基于 Linux 的系统,而无论硬件架构如何。”它是用于建立定制的 Linux 运行时映像的配方、配置值和依赖关系的集合,可根据您的特定需求进行定制。架构

彻底公开:我在嵌入式 Linux 中的大部分工做都集中在 Yocto 项目上,并且我对这个系统的认识和偏见可能很明显。工具

Yocto 使用 Openembedded 做为其构建系统。从技术上讲,这两个是独立的项目;然而,在实践中,用户不须要了解区别,项目名称常常能够互换使用。

Yocto 项目的输出大体由三部分组成:

目标运行时二进制文件:这些包括引导加载程序、内核、内核模块、根文件系统映像。以及将 Linux 部署到目标平台所需的任何其余辅助文件。
包流:这是能够安装在目标上的软件包集合。您能够根据须要选择软件包格式(例如,deb、rpm、ipk)。其中一些可能预先安装在目标运行时二进制文件中,但能够构建用于安装到已部署系统的软件包。
目标 SDK:这些是安装在目标平台上的软件的库和头文件的集合。应用程序开发人员在构建代码时使用它们,以确保它们与适当的库连接

优势

Yocto 项目在行业中获得普遍应用,并获得许多有影响力的公司的支持。此外,它还拥有一个庞大且充满活力的开发人员社区和生态系统。开源爱好者和企业赞助商的结合的方式有助于推进 Yocto 项目。

得到 Yocto 的支持有不少选择。若是您想本身动手,有书籍和其余培训材料。若是您想得到专业知识,有许多有 Yocto 经验的工程师。并且许多商业组织能够为您的设计提供基于 Yocto 的 Turnkey 产品或基于服务的实施和定制。

Yocto 项目很容易经过 层 进行扩展,层能够独立发布以添加额外的功能,或针对项目发布时尚不可用的平台,或用于保存系统特有定制功能。层能够添加到你的配置中,以添加未特别包含在市面上版本中的独特功能;例如,“meta-browser” 层包含 Web 浏览器的清单,能够轻松为您的系统进行构建。由于它们是独立维护的,因此层能够按不一样的时间发布(根据层的开发速度),而不是跟着标准的 Yocto 版本发布。

Yocto 能够说是本文讨论的任何方式中最普遍的设备支持。因为许多半导体和电路板制造商的支持,Yocto 极可能可以支持您选择的任何目标平台。主版本 Yocto 分支仅支持少数几块主板(以便达成合理的测试和发布周期),可是,标准工做模式是使用外部主板支持层。

最后,Yocto 很是灵活和可定制。您的特定应用程序的自定义能够存储在一个层进行封装和隔离,一般将要素层特有的自定义项存储为层自己的一部分,这能够将相同的设置同时应用于多个系统配置。Yocto 还提供了一个定义良好的层优先和覆盖功能。这使您能够定义层应用和搜索元数据的顺序。它还使您能够覆盖具备更高优先级的层的设置;例如,现有清单的许多自定义功能都将保留。

缺点

Yocto 项目最大的缺点是学习曲线陡峭。学习该系统并真正理解系统须要花费大量的时间和精力。 根据您的需求,这可能对您的应用程序不重要的技术和能力投入太大。 在这种状况下,与一家商业供应商合做多是一个不错的选择。

Yocto 项目的开发时间和资源至关高。 须要构建的包(包括工具链,内核和全部目标运行时组件)的数量至关很多。 Yocto 开发人员的开发工做站每每是大型系统。 不建议使用小型笔记本电脑。 这能够经过使用许多提供商提供的基于云的构建服务器来缓解。 另外,Yocto 有一个内置的缓存机制,当它肯定用于构建特定包的参数没有改变时,它容许它从新使用先前构建的组件。

建议

为您的下一个嵌入式 Linux 设计使用 Yocto 项目是一个强有力的选择。 在这里介绍的选项中,不管您的目标用例如何,它都是最普遍适用的。 普遍的行业支持,积极的社区和普遍的平台支持使其成为必须设计师的不错选择。

Buildroot

Buildroot 项目定义为“经过交叉编译生成嵌入式 Linux 系统的简单、高效且易于使用的工具。”它与 Yocto 项目具备许多相同的目标,但它注重简单性和简约性。通常来讲,Buildroot 会禁用全部软件包的全部可选编译时设置(有一些值得注意的例外),从而生成尽量小的系统。系统设计人员须要启用适用于给定设备的设置。

Buildroot 从源代码构建全部组件,但不支持按目标包管理。所以,它有时称为固件生成器,由于镜像在构建时大部分是固定的。应用程序能够更新目标文件系统,可是没有机制将新软件包安装到正在运行的系统中。

Buildroot 输出主要由三部分组成:

将 Linux 部署到目标平台所需的根文件系统映像和任何其余辅助文件
适用于目标硬件的内核,引导加载程序和内核模块
用于构建全部目标二进制文件的工具链。

优势

Buildroot 对简单性的关注意味着,通常来讲,它比 Yocto 更容易学习。核心构建系统用 Make 编写,而且足够短以便开发人员了解整个系统,同时可扩展到足以知足嵌入式 Linux 开发人员的需求。 Buildroot 核心一般只处理常见用例,但它能够经过脚本进行扩展。

Buildroot 系统使用普通的 Makefile 和 Kconfig 语言来进行配置。 Kconfig 由 Linux 内核社区开发,普遍用于开源项目,使得许多开发人员都熟悉它。

因为禁用全部可选的构建时设置的设计目标,Buildroot 一般会使用开箱即用的配置生成尽量最小的镜像。通常来讲,构建时间和构建主机资源的规模将比 Yocto 项目的规模更小。

缺点

关注简单性和最小化启用的构建方式意味着您可能须要执行大量的自定义来为应用程序配置 Buildroot 构建。此外,全部配置选项都存储在单个文件中,这意味着若是您有多个硬件平台,则须要为每一个平台进行每一个定制更改。

对系统配置文件的任何更改都须要所有从新构建全部软件包。与 Yocto 相比,这个问题经过最小的镜像大小和构建时间获得了必定的解决,但在你调整配置时可能会致使构建时间过长。

中间软件包状态缓存默认状况下未启用,而且不像 Yocto 实施那么完全。这意味着,虽然第一次构建可能比等效的 Yocto 构建短,但后续构建可能须要重建许多组件。

建议

对于大多数应用程序,使用 Buildroot 进行下一个嵌入式 Linux 设计是一个不错的选择。若是您的设计须要多种硬件类型或其余差别,但因为同步多个配置的复杂性,您可能须要从新考虑,但对于由单一设置组成的系统,Buildroot 可能适合您。

OpenWRT/LEDE

OpenWRT 项目开始为消费类路由器开发定制固件。您当地零售商提供的许多低成本路由器均可以运行 Linux 系统,但可能没法开箱即用。这些路由器的制造商可能没法提供频繁的更新来解决新的威胁,即便他们这样作,安装更新镜像的机制也很困难且容易出错。 OpenWRT 项目为许多已被其制造商放弃的设备生成更新的固件镜像,让这些设备焕发新生。

OpenWRT 项目的主要交付物是可用于大量商业设备的二进制镜像。它有网络可访问的软件包存储库,容许设备最终用户将新软件添加到他们的系统中。 OpenWRT 构建系统是一个通用构建系统,它容许开发人员建立自定义版本以知足他们本身的需求并添加新软件包,但其主要重点是目标二进制文件。

优势

若是您正在为商业设备寻找替代固件,则 OpenWRT 应位于您的选项列表中。它的维护良好,能够保护您免受制造商固件没法解决的问题。您也能够添加额外的功能,使您的设备更有用。

若是您的嵌入式设计专一于网络,则 OpenWRT 是一个不错的选择。网络应用程序是 OpenWRT 的主要用例,您可能会发现许多可用的软件包。

缺点

OpenWRT 对您的设计限制不少(与 Yocto 和 Buildroot 相比)。若是这些决定不符合您的设计目标,则可能须要进行大量的修改。

在部署的设备中容许基于软件包的更新是很难管理的。按照其定义,这会致使与您的 QA 团队测试的软件负载不一样。此外,很难保证大多数软件包管理器的原子安装,以及错误的电源循环可能会使您的设备处于不可预知的状态。

建议

OpenWRT 是爱好者项目或商用硬件再利用的不错选择。它也是网络应用程序的不错选择。若是您须要从默认设置进行大量定制,您可能更喜欢 Buildroot 或 Yocto。

桌面发行版

设计嵌入式 Linux 系统的一种常见方法是从桌面发行版开始,例如 Debian 或 Red Hat,并删除不须要的组件,直到安装的镜像符合目标设备的占用空间。这是 Raspberry Pi 平台流行的 Raspbian发行版的方法。

优势

这种方法的主要优势是熟悉。一般,嵌入式 Linux 开发人员也是桌面 Linux 用户,而且精通他们的选择发行版。在目标上使用相似的环境可能会让开发人员更快地入门。根据所选的分布,可使用 apt 和 yum 等标准封装工具安装许多其余工具。

能够将显示器和键盘链接到目标设备,并直接在那里进行全部的开发。对于不熟悉嵌入式空间的开发人员来讲,这多是一个更为熟悉的环境,无需配置和使用棘手的跨开发平台设置。

大多数桌面发行版可用的软件包数量一般大于前面讨论的嵌入式特定的构建器可用软件包数量。因为较大的用户群和更普遍的用例,您可能可以找到您的应用程序所需的全部运行时包,这些包已经构建并可供使用。

缺点

将目标平台做为您的主要开发环境可能会很慢。运行编译器工具是一项资源密集型操做,根据您构建的代码的多少,这可能会严重妨碍您的性能。

除了一些例外状况,桌面发行版的设计并不适合低资源系统,而且可能难以充分裁剪目标映像。一样,桌面环境中的预设工做流程对于大多数嵌入式设计来讲都不理想。以这种方式得到可再现的环境很困难。手动添加和删除软件包很容易出错。这可使用特定于发行版的工具进行脚本化,例如基于 Debian 系统的 debootstrap。为了进一步提升可再现性,您可使用配置管理工具,如 CFEngine(个人雇主 Mender.io 完整披露了 这一工具)。可是,您仍然受发行版提供商的支配,他们将更新软件包以知足他们的需求,而不是您的需求。

建议

对于您打算推向市场的产品,请谨慎使用此方法。这对于爱好者应用程序来讲是一个很好的模型;可是,对于须要支持的产品,这种方法极可能会遇到麻烦。虽然您可能可以得到更快的起步,但从长远来看,您可能会花费您的时间和精力。

其余考虑

这个讨论集中在构建系统的功能上,但一般有非功能性需求可能会影响您的决定。若是您已经选择了片上系统(SoC)或电路板,则您的选择极可能由供应商决定。若是您的供应商为特定系统提供板级支持包(BSP),使用它一般会节省至关多的时间,但请研究 BSP 的质量以免在开发周期后期发生问题。

若是您的预算容许,您可能须要考虑为目标操做系统使用商业供应商。有些公司会为这里讨论的许多选项提供通过验证和支持的配置,除非您拥有嵌入式 Linux 构建系统方面的专业知识,不然这是一个不错的选择,可让您专一于核心能力。

做为替代,您能够考虑为您的开发人员进行商业培训。这可能比商业操做系统供应商便宜,而且可让你更加自给自足。这是快速找到您选择的构建系统基础知识的学习曲线。

最后,您可能已经有一些开发人员拥有一个或多个系统的经验。若是你的工程师有倾向性,当你作出决定时,确定值得考虑。

总结

构建嵌入式 Linux 系统有多种选择,每种都有优势和缺点。将这部分设计放在优先位置相当重要,由于在之后的过程当中切换系统的成本很是高。除了这些选择以外,还有新的系统在开发中。但愿此次讨论可以为评估新的系统(以及这里提到的系统)提供一些背景,并帮助您为下一个项目作出坚实的决定。

原文来自:https://www.linuxprobe.com/embedded-linux-tools.html

相关文章
相关标签/搜索