构建嵌入式linux系统
Linux正在被部署到比Linus Torvalds在他的宿舍里工作的设备更多的设备中。 受支持的各种芯片架构令人震惊,并导致各种大小的设备都使用Linux。 从庞大的IBM大型机到不超过其连接端口以及它们之间所有内容的微型设备 。 它用于大型企业数据中心,Internet基础结构设备和个人开发系统。 它还为消费类电子产品,移动电话和许多物联网设备供电。
在为台式机和企业级设备构建Linux软件时,开发人员通常在其构建计算机上使用桌面发行版(例如Ubuntu) ,以使其环境尽可能接近要部署该软件的环境。 VirtualBox和Docker等工具甚至可以更好地在开发,测试和生产环境之间进行调整。
Wikipedia将嵌入式系统定义为:“在较大的机械或电气系统中具有专用功能的计算机系统,通常具有实时计算约束。”
我发现说嵌入式系统是一台大多数人都不认为是计算机的计算机很简单。 它的主要作用是充当某种设备,并且它不被视为通用计算平台。
在本文中,我将对构建嵌入式Linux系统的四个常用选项进行调查。 我将对每种工具的使用方式进行说明,并提供足够的信息以帮助读者确定用于其设计的工具。 我不会教你如何使用它们。 一旦您缩小选择范围,就会有大量的深入在线学习资源。 对于所有用例,没有选择是正确的,我希望提供足够的细节来指导您的决定。
Yocto项目被定义为“一个开源协作项目,它提供模板,工具和方法来帮助您为嵌入式产品创建基于Linux的自定义系统,而与硬件架构无关。” 它是配方,配置值和依赖项的集合,用于创建根据您的特定需求量身定制的Linux运行时映像。
完全公开:我在嵌入式Linux中的大部分工作都集中在Yocto项目上,并且我对该系统的了解和偏见很明显。
Yocto使用Openembedded作为其构建系统。 从技术上讲,这是两个单独的项目; 但是,实际上,用户不需要了解区别,并且项目名称经常互换使用。
Yocto项目构建的输出大致包括三个组成部分:
Yocto项目在行业中得到广泛使用,并得到了许多有影响力的公司的支持。 此外,它拥有庞大而充满活力的开发者社区和生态系统 。 开源爱好者和企业赞助商的结合有助于推动Yocto项目。
有很多获得Yocto支持的选项。 如果您想自己动手,则有书籍和其他培训材料。 如果您想聘请专业人士,可以使用许多具有Yocto经验的工程师。 许多商业组织为您的设计提供基于Yocto的交钥匙产品或基于服务的实施和定制。
Yocto项目可以轻松地通过各层进行扩展,这些层可以独立发布以添加附加功能,定位到项目版本中不可用的目标平台或存储系统独有的自定义项。 可以将层添加到您的配置中,以添加不包含在库存版本中的独特功能。 例如,“ meta-browser ”层包含用于Web浏览器的配方,可以轻松地为您的系统构建配方。 由于它们是独立维护的,因此与标准Yocto版本相比,各层可以采用不同的发布计划(已调整到各层的开发速度)。
在本文讨论的所有选项中,Yocto可以说是对设备的最广泛支持。 由于许多半导体和电路板制造商的支持,Yocto可能会支持您选择的任何目标平台。 Yocto的直接发行版仅支持少数板子(以进行适当的测试和发行周期),但是,标准的工作模式是使用外部板子支持层。
最后,Yocto非常灵活且可自定义。 可以将特定应用程序的定制存储在一个层中以进行封装和隔离。 特征图层特有的自定义通常存储为图层本身的一部分,这允许将相同的设置同时应用于多个系统配置。 Yocto还提供了定义明确的图层优先级和覆盖功能。 这使您可以定义应用层和搜索元数据的顺序。 它还使您可以覆盖具有更高优先级的图层中的设置。 例如,对现有配方的许多自定义将添加到您的私有层中,其顺序由优先级精确控制。
Yocto项目的最大缺点是学习曲线。 学习并真正理解它需要花费大量的时间和精力。 根据您的需求,这可能是对并非您的应用程序中心的技术和能力进行的巨大投资。 在这种情况下,与商业供应商之一合作可能是一个不错的选择。
对于Yocto项目构建,开发构建时间和资源相当高。 需要构建的程序包数量很多,包括工具链,内核和所有目标运行时组件。 Yocto开发人员的开发工作站通常是大型系统。 不建议使用紧凑型笔记本电脑。 可以使用许多提供商提供的基于云的构建服务器来缓解这种情况。 此外,Yocto具有内置的缓存机制,当它确定用于构建特定程序包的参数未更改时,可以重用以前构建的组件。
将Yocto项目用于您的下一个嵌入式Linux设计是一个不错的选择。 在这里介绍的选项中,无论您的目标用例如何,它都是最广泛适用的。 广泛的行业支持,活跃的社区和广泛的平台支持使这成为必须设计师的不错选择。
Buildroot项目被定义为“一种通过交叉编译生成嵌入式Linux系统的简单,高效且易于使用的工具”。 它与Yocto项目具有许多相同的目标,但是重点在于简单性和简约性。 通常,Buildroot将禁用所有软件包的所有可选编译时设置(有一些值得注意的例外),从而使系统最小。 由系统设计人员决定是否启用适用于给定设备的设置。
Buildroot从源代码构建所有组件,但不支持目标包管理。 因此,有时将其称为固件生成器,因为映像在构建时已基本固定。 应用程序可以更新目标文件系统,但是没有将新软件包安装到正在运行的系统中的机制。
Buildroot输出大致包括三个组件:
Buildroot专注于简单性,这通常意味着比Yocto更容易学习。 核心构建系统是用Make编写的,其简短程度足以使开发人员能够理解整个系统,同时又具有足够的可扩展性,可以满足嵌入式Linux开发人员的需求。 Buildroot核心通常只处理常见的用例,但是可以通过脚本扩展。
Buildroot系统使用常规的Makefile和Kconfig语言进行配置。 Kconfig由Linux内核社区开发,并广泛用于开放源代码项目中,使许多开发人员熟悉它。
由于禁用所有可选构建时设置的设计目标,因此,Buildroot通常使用开箱即用的配置来生成最小的映像。 通常,构建时间和构建主机资源将比Yocto项目的构建时间和构建主机资源小。
对简单性和最少启用的构建选项的关注意味着您可能需要进行重大定制才能为应用程序配置Buildroot构建。 此外,所有配置选项都存储在一个文件中,这意味着,如果您具有多个硬件平台,则需要针对每个平台进行每次自定义更改。
对系统配置文件的任何更改都需要完全重建所有软件包。 与Yocto相比,最小的图像大小和构建时间在一定程度上缓解了这种情况,但是在调整配置时可能会导致构建时间过长。
默认情况下,不启用中间包状态缓存,并且不如Yocto实现那样彻底。 这意味着,尽管第一个构建可能比等效的Yocto构建短,但后续的构建可能需要重建许多组件。
对于大多数应用程序,将Buildroot用于您的下一个嵌入式Linux设计是一个不错的选择。 如果您的设计需要多种硬件类型或其他差异,则由于同步多个配置的复杂性,您可能需要重新考虑,但是,对于由单个设置组成的系统,Buildroot可能会很适合您。
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构建系统方面具有专业知识,否则这是一个不错的选择,并将使您专注于自己的核心竞争力。
或者,您可以考虑对开发人员进行商业培训。 这可能比商业OS提供商便宜,并使您更加自给自足。 这是快速克服所选构建系统基础知识的学习方法。
最后,您可能已经有一些开发人员具有使用一个或多个系统的经验。 如果您有偏爱的工程师,那么在做出决定时当然应该考虑到这一点。
构建嵌入式Linux系统有多种选择,每种选择都有其优点和缺点。 优先考虑设计的这一部分至关重要,因为在此过程的后期切换系统非常昂贵。 除了这些选项,新系统一直在开发中。 希望该讨论将为审查新系统(以及此处提到的系统)提供一些背景信息,并帮助您为下一个项目做出可靠的决定。
翻译自: https://opensource.com/article/18/6/embedded-linux-build-tools
构建嵌入式linux系统