构建嵌入式Linux系统的几种工具

本专栏计划对几种常见的构建嵌入式Linux系统工具进行逐一介绍。文章会在嵌入式Linux那些事儿专栏发布,会同步到微信公众号:嵌入式那些事儿 ,该专栏的文章可能更新不会太快,但能保证专栏内的每一篇都是精雕细琢,可能如果大家喜欢请关注。

探索Yocto、Buildroot、OpenWRT和经过修改的桌面发行版,选择适合您的项目的选项。
在这里插入图片描述
越来越多的的设备开始使用Linux系统,比Linus Torvalds在他的宿舍里工作的设备要多的多。Linux支持目前市场上的各种芯片架构,导致Linux可以应用到各种大小的设备上。从庞大的IBM大型机到不超过其连接端口大的微型设备,大型企业数据中心,Internet基础结构设备和个人开发系统。它还为消费类电子产品,移动电话和许多物联网设备提供了动力。
在为桌面和企业级设备构建Linux软件时,开发人员通常在其构建计算机上使用桌面发行版(如Ubuntu),以使其环境尽可能接近要部署该软件的环境。VirtualBox和Docker等工具可以使开发,测试和生产环境之间保持一致。

什么是嵌入式系统?

Wikipedia将嵌入式系统定义为:“在较大的机械或电气系统中具有专用功能的计算机系统,经常受到实时计算限制。”

简单地说,嵌入式系统就是一台大多数人都不认为是计算机的计算机。它的主要作用是充当某种设备,而不是作为通用计算平台。

嵌入式系统编程中的开发环境通常与测试和生产环境大不相同。他们可能使用不同的芯片架构、软件堆栈、甚至操作系统。嵌入式开发人员与桌面和Web开发人员的开发工作流程完全不同。通常,构建输出将包含目标设备的整个软件镜像,包括内核,设备驱动程序,库和应用程序软件(有时也包括引导加载程序)。

在本文中,我将对构建嵌入式Linux系统的四个常用工具进行介绍。我将对每种工具的使用方式进行说明,并提供足够的信息以帮助读者确定用于其设计的工具。我不会教你如何使用它们。一旦您选定了,想要深入,就需要有大量的学习(◠◡◠)。没有哪个选择是适合所有情况的,我希望提供足够的细节来指导您的选择。

1 Yocto

在这里插入图片描述
Yocto 项目定义“一个开源协作项目,提供模板,工具和方法,来帮助您创建基于Linux的定制系统,而不用关心硬件架构。”它是配方、配置值和依赖项的集合,用于创建为您量身定制的Linux镜像。

完全公开:我在嵌入式Linux中的大部分工作都集中在Yocto项目上,我非常了解对该系统的优点和缺点。

Yocto使用Openembedded作为其构建系统。从技术上讲,这是两个单独的项目;但是,实际上,用户不需要了解两者之间的区别,并且两者经常互换使用。Yocto项目构建的输出大致包括三个组成部分:

  • 目标运行时二进制文件:这些文件包括引导程序,内核,内核模块,根文件系统镜像。以及其他辅助文件。
  • 软件包:这是可安装在目标平台上的软件包的集合。您可以根据需要选择软件包格式(例如deb,rpm,ipk)。其中一些可能已预安装在目标运行时二进制文件中。可以构建软件包以安装到已部署的系统中。
  • 目标SDK:这些是代表目标平台上安装的软件的库和头文件的集合。应用程序开发人员在构建代码时会使用它们,用于链接需要的库。
    优点
    Yocto项目在行业中得到广泛使用,并得到了许多有影响力的公司的支持。此外,它还拥有庞大而充满活力的开发者社区和生态系统。开源爱好者和企业赞助商的结合有助于推动Yocto项目的发展。

获得Yocto的支持非常容易。如果您想自己动手,则有书籍和其他培训材料。如果您想聘请专业人士,有许多具有Yocto经验的工程师。许多商业组织都为您的设计提供基于Yocto的完整并可立即使用的产品或基于服务的实施和定制。

Yocto项目可以轻松地通过各层进行扩展,这些层可以独立发布以添加其他功能,定位到项目版本中不可用的目标平台或存储系统独有的自定义项。可以将层添加到您的配置中,以添加不包含在库存版本中的独特功能。例如,“ meta-browser”层包含用于Web浏览器的配方,可以轻松地为您的系统构建配方。由于它们是独立维护的,因此与标准Yocto版本相比,各层可以在不同的时间发布,而不用跟随Yocto版本。

在本文讨论的所有选项中,Yocto拥有最广泛的设备支持。由于许多半导体和电路板制造商的支持,Yocto可能会支持您选择的任何目标平台。Yocto的直接发行版仅支持少数板子(以进行适当的测试和发行周期),但是,标准的工作模式是使用各厂商提供的外部板级支持层。

最后,Yocto非常灵活且可自定义。可以将特定应用程序的定制存储在一个层中以进行封装和隔离。特征图层特有的自定义通常存储为图层本身的一部分,这允许将相同的设置同时应用于多个系统配置。Yocto还提供了定义明确的图层优先级和覆盖功能。这使您可以定义应用图层和搜索元数据的顺序。它还使您可以覆盖具有更高优先级的图层中的设置。例如,对现有配方的许多自定义将添加到您的私有层中,其顺序由优先级精确控制。

缺点
Yocto项目的最大缺点是学习曲线。学习并真正理解它需要花费大量的时间和精力。根据您的需求,这可能是对并非您的应用程序中心的技术和能力耗费巨大的精力。在这种情况下,与商业供应商之一合作可能是一个不错的选择。

对于Yocto项目构建,开发构建时间和资源相当高。需要构建的软件包数量非常大,包括工具链、内核和所有目标运行时组件。Yocto开发人员的开发工作站通常是大型系统。不建议使用小型笔记本电脑。可以使用许多提供商提供的基于云的构建服务器来缓解这种情况。此外,Yocto具有内置的缓存机制,当它确定用于构建特定程序包的参数未更改时,可以重用以前构建的组件。

建议
将Yocto项目用于您的下一个嵌入式Linux设计是一个不错的选择。在这里介绍的选项中,无论您的目标平台选用哪种,它都是最广泛应用的。广泛的行业支持,活跃的社区和广泛的平台支持使其成为工程师的不错选择。

2 Buildroot 在这里插入图片描述

Buildroot项目被定义为“一个简单、高效、易于使用的工具,通过交叉编译来构建嵌入式Linux系统。” 它与Yocto项目具有许多相同的目标,它的侧重点在于简单性和简约性。通常,Buildroot将禁用所有软件包的所有可选编译时设置(有一些值得注意的例外),从而使系统最小。由系统设计者决定是否启用适合于给定设备的设置。

Buildroot从源代码构建所有组件,但不支持目标包管理。因此,有时将其称为固件生成器,因为镜像在构建时已基本固定。应用程序可以更新目标文件系统,但是没有将新软件包安装到正在运行的系统中的机制。

Buildroot输出大致包括三个组件:

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

对简单性和最少启用的构建选项的关注意味着您可能需要进行重大定制,才能为应用程序配置Buildroot构建。此外,所有配置选项都存储在一个文件中,这意味着,如果您具有多个硬件平台,则需要针对每个平台进行每个自定义更改。

对系统配置文件的任何更改都需要完全重建所有软件包。与Yocto相比,最小的图像大小和构建时间在一定程度上缓解了这种情况,但是在调整配置时可能会导致构建时间过长。

默认情况下,中间包状态缓存未启用,并且不如Yocto实现那样彻底。这意味着,虽然第一个构建可能比等效的Yocto构建短,但后续的构建可能需要重建许多组件。

建议
对于大多数应用程序,将Buildroot用于您的下一个嵌入式Linux设计是一个不错的选择。如果您的设计针对多种硬件类型或其他差异,则由于同步多个配置的复杂性,您可能需要重新考虑,但是,对于由单个设置组成的系统,Buildroot可能会很适合您。

3 OpenWRT / LEDE

在这里插入图片描述
OpenWRT项目是为开发消费级路由器定制的固件。您当地零售商提供的许多低成本路由器都能够运行Linux系统,但可能并非开箱即用。这些路由器的制造商可能不会提供频繁的更新以应对新的威胁,即使这样做,安装更新镜像的机制也很困难且容易出错。OpenWRT项目为许多制造商放弃的设备生成更新的固件镜像,并为这些设备提供新的生命周期。

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

优点
如果您正在寻找商用设备的替代固件,则OpenWRT应该在您的选项列表中。它维护良好,可以保护您免受制造商固件无法解决的问题的困扰。您还可以添加其他功能,使您的设备更有用。
如果您的嵌入式设计是以网络为中心的,那么OpenWRT是一个不错的选择。网络应用程序是OpenWRT的主要用例,您可能会在其中找到许多可用的软件包。

缺点
OpenWRT对您的设计限制很多(与Yocto和Buildroot相比)。如果这些决定不符合您的设计目标,则可能需要进行非常多的修改。
有个难以管理的问题:已部署设备中的基于程序包的更新。从定义上讲,这会导致您与QA团队测试的软件负载不同。此外,很难保证大多数程序包管理器都可以进行原子安装,并且不正确的电源循环也可能会使您的设备处于不可预测的状态。

建议
对于业余爱好者的项目或重用商业硬件,OpenWRT是一个不错的选择。对于网络应用程序也是一个不错的选择。如果您需要通过默认设置进行大量自定义,则可以选择Buildroot或Yocto。

4 桌面发行版

在这里插入图片描述
设计嵌入式Linux系统的常用方法是从桌面发行版开始,例如Debian或Red Hat,然后删除不需要的组件,直到安装的镜像适合目标设备的内存和存储空间。这是针对Raspberry Pi平台的流行Raspbian发行版所采用的方法。

优点
主要优点是熟悉。通常,嵌入式Linux开发人员也是桌面Linux用户,并且精通他们的发行版。在目标上使用类似的环境可以使开发人员更快地入门。根据选择的发行版,可以使用标准包工具(如apt和yum)安装许多其他工具。

可以将显示器和键盘连接到目标设备,然后直接在此进行所有开发。对于刚接触嵌入式领域的开发人员来说,这可能是一个更熟悉的环境,并且无需配置和使用棘手的交叉开发设置。

大多数桌面发行版可用的软件包数量通常大于前面讨论的嵌入式特定构建器可用的软件包数量。由于更大的用户群和更广泛的用例,您可能能够找到已经构建并准备使用的应用程序所需的所有运行时软件包。

缺点
将目标平台用作主要开发环境可能会很慢。运行编译器工具是一项资源密集型操作,并且取决于要构建的代码量,可能会影响性能。

除某些例外,桌面发行版并不适用于设计资源有限的系统,因此可能难以充分修剪目标镜像。同样,桌面环境中工作流程对于大多数嵌入式设计也不理想。以这种方式获得可复制的环境非常困难。手动添加和删除软件包很容易出错。可以使用特定于发行版的工具(例如,基于Debian的系统的debootstrap)编写脚本。为了进一步提高可重复性,您可以使用配置管理工具,例如CFEngine(由我的雇主Mender.io完全公开))。但是,您仍然受发行提供商的约束,后者将更新软件包以满足他们的需求,而不是您的需求。

建议
对于打算投放市场的产品,请谨慎使用此方法。这是业余爱好者应用的理想模型;但是,对于需要支持的产品,此方法可能会很麻烦。从长远来看,虽然您可能可以快速地入门,但是后续的工作可能会花费您大量的时间和精力。

其他注意事项

本次讨论的重点是构建系统的功能,但是通常会有一些非功能性需求可能会影响您的决策。如果您已经选择了片上系统(SoC)或电路板,则您的选择可能会由供应商决定。如果您的供应商为给定系统提供了板级支持包(BSP),则使用它通常可以节省很多时间,但是请研究BSP的质量,以避免在开发周期的后期出现问题。

如果预算允许,您可能要考虑使用商业供应商作为您目标平台的操作系统。有些公司将提供经过验证并受支持的配置,这是一个不错的选择,并将使您专注于自己的核心竞争力,除非您在嵌入式Linux构建系统上具有专业知识。

或者,您可以考虑对开发人员进行商业培训。这可能比商业OS提供商便宜,并使您更加自给自足。这是快速克服所选构建系统基础知识的学习方法。
最后,您可能已经有一些开发人员具有使用一个或多个系统的经验。如果您的工程师有倾向性,那么在做出决定时应该考虑到这一点。

概要
有很多构建嵌入式Linux系统的选择,每种选择都有其优点和缺点。优先考虑设计的这一部分至关重要,因为在此过程的后期切换系统的成本非常昂贵。除了这些选择之外,还有新的系统一直在开发。希望该讨论将为您选择新系统(以及此处提到的系统)提供一些背景信息,并帮助您为下一个项目做出可靠的决定。

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/u013921164/article/details/111374136