当前位置: 首页 > 科技观察

用于构建嵌入式Linux系统的4个工具

时间:2023-03-19 22:59:16 科技观察

了解Yocto、Buildroot、OpenWRT和改进后的桌面发行版,以确定最适合您的项目的发行版。Linux被部署到的设备种类比LinusTorvalds在他的宿舍里开发时所预料的要广泛得多。支持种类繁多的芯片,使Linux可用于大大小小的设备:从IBM的大型机到不超过它们所连接端口的微型设备,以及各种尺寸的设备。它用于大型企业数据中心、互联网基础设施和个人开发系统。它还为消费电子产品、手机和许多物联网设备提供动力。在为桌面和企业级设备构建Linux软件时,开发人员通常在他们的构建机器上使用Ubuntu等桌面发行版,以尽可能与部署的机器相似。VirtualBox和Docker等工具使开发、测试和生产环境更加一致。什么是嵌入式系统?维基百科将嵌入式系统定义为:“在更大的机械或电气系统中具有专门功能的计算机系统,通常具有实时计算限制。”我认为很容易说嵌入式系统是大多数人不认为计算机是计算机的东西。它的主要作用是作为一种设备,不被视为通用计算平台。嵌入式系统编程的开发环境通常与测试和生产环境大不相同。他们可能使用不同的芯片架构、软件堆栈甚至操作系统。嵌入式开发人员的开发工作流程与桌面和Web开发人员有很大不同。通常,其构建的输出将包含目标设备的整个软件映像,包括内核、设备驱动程序、库和应用程序软件(有时还有引导加载程序)。在本文中,我将概述构建嵌入式Linux系统的四种常用方法。我将描述每种产品的工作原理并提供足够的信息来帮助读者决定使用哪种工具进行设计。我不会教你如何使用它们中的任何一个;一旦您缩小了选择范围,就会有大量深入的在线学习资源。没有任何选择适合所有情况,我希望提供足够的细节来指导您的决定。YoctoYocto项目被定义为“一个开源协作项目,它提供模板、工具和方法来帮助您为嵌入式产品创建自定义的基于Linux的系统,而不管硬件架构如何。”它用于创建自定义Linux运行时映像配方、配置值和依赖项的集合,可根据您的特定需求进行自定义。全面披露:我在嵌入式Linux方面的大部分工作都集中在Yocto项目上,我对该系统的了解和偏见可能是显而易见的。Yocto使用Openembedded作为其构建系统。从技术上讲,这两个是独立的项目;然而,在实践中,用户不需要知道区别,项目名称经常互换使用。Yocto项目的输出大致由三部分组成:目标运行时二进制文件:包括引导加载程序、内核、内核模块、根文件系统映像。以及将Linux部署到目标平台所需的任何其他辅助文件。包流:这是可以安装在目标上的包的集合。您可以根据需要选择包格式(例如deb、rpm、ipk)。其中一些可能预安装在目标运行时二进制文件中,但可以构建为安装到已部署系统的包。目标SDK:这些是安装在目标平台上的软件的库和头文件的集合。应用程序开发人员在构建代码时使用它们以确保它们与适当的库链接。优点Yocto项目在业界被广泛使用,并得到许多有影响力的公司的支持。此外,它还有一个庞大而充满活力的开发者社区和生态系统。开源爱好者和企业赞助商的联合方法有助于推进Yocto项目。获得Yocto支持的选项有很多。如果您想自己动手,可以使用书籍和其他培训材料。如果您想获得专业知识,有许多具有Yocto经验的工程师。许多商业组织可以提供基于Yocto的交钥匙产品或基于服务的设计实施和定制。Yocto项目很容易通过层进行扩展,这些层可以独立发布以添加额外的功能,或者用于项目发布时不可用的平台,或者保留系统特定的自定义功能。可以将层添加到您的配置中,以添加未专门包含在商用版本中的独特功能;例如,“元浏览器”层包含一个网络浏览器的清单,可以很容易地为您的系统构建。因为它们是独立维护的,所以层可以在不同的时间发布(取决于它们的开发速度),而不是遵循标准的Yocto版本。Yocto可以说是本文讨论的所有方法中最广泛的设备支持。得益于许多半导体和电路板制造商的支持,Yocto很可能能够支持您选择的任何目标平台。Yocto主分支仅支持少数板卡(以允许合理的测试和发布周期),但是,标准工作模式是使用外部板卡支持层。***,Yocto非常灵活和可定制。您的特定应用程序的自定义可以存储在一个层中以进行封装和隔离,通常功能层特定的自定义存储为层本身的一部分,它可以同时将相同的设置应用于多个系统配置。Yocto还提供了定义明确的层优先级和覆盖功能。这允许您定义图层应用和搜索元数据的顺序。它还允许您覆盖具有更高优先级的层的设置;例如,保留了现有清单的许多定制。缺点YoctoProject的最大缺点是学习曲线陡峭。学习这个系统并真正理解它需要花费大量的时间和精力。根据您的需要,这可能是对对您的应用程序不重要的技术和功能的过多投资。在这种情况下,与商业供应商合作可能是一个不错的选择。YoctoProject的开发时间和资源是相当高的。需要构建的包(包括工具链、内核和所有目标运行时组件)的数量相当多。Yocto开发人员的开发工作站往往是大型系统。不推荐用于小型笔记本电脑。这可以通过使用许多提供商提供的基于云的构建服务器来缓解。此外,Yocto有一个内置的缓存机制,允许它在确定用于构建特定包的参数没有改变时重用以前构建的组件。推荐在您的下一个嵌入式Linux设计中使用YoctoProject是一个强有力的选择。在此处提供的选项中,无论您的目标用例如何,它都是最广泛适用的。广泛的行业支持、活跃的社区和广泛的平台支持使其成为必备设计师的不错选择。BuildrootBuildroot项目被定义为“一个简单、高效且易于使用的工具,用于交叉编译以生成嵌入式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/LEDEOpenWRT项目开始为消费类路由器开发定制固件。您当地零售商的许多低成本路由器都可以运行Linux,但它们可能无法开箱即用。这些路由器的制造商可能不会提供频繁的更新来应对新的威胁,即使他们这样做,安装更新映像的机制也很困难且容易出错。OpenWRT项目为许多已被制造商废弃的设备生成更新的固件映像,赋予它们新的生命。OpenWRT项目的主要交付成果是可用于大量商业设备的二进制映像。它具有可通过Web访问的软件包存储库,允许设备最终用户将新软件添加到他们的系统中。OpenWRT构建系统是一个通用构建系统,允许开发人员创建自定义构建以满足他们自己的需要并添加新包,但它的主要重点是目标二进制文件。优点如果您正在为商业设备寻找替代固件,OpenWRT应该在您的选项列表中。它得到了很好的维护,可以保护您免受制造商固件无法修复的问题。您还可以添加额外的功能,使您的设备更有用。如果你的嵌入式设计侧重于网络,OpenWRT是一个不错的选择。Web应用程序是OpenWRT的主要用例,您可能会发现许多可用的软件包。缺点OpenWRT对您的设计有很多限制(与Yocto和Buildroot相比)。如果这些决定不符合您的设计目标,则可能需要进行大量修改。允许在部署的设备中进行基于包的更新很难管理。根据定义,这会导致与QA团队测试不同的软件负载。此外,很难保证大多数包管理器的原子安装,错误的电源循环会使您的设备处于不可预测的状态。建议OpenWRT是爱好者项目或商业硬件再利用的不错选择。它也是网络应用程序的不错选择。如果您需要对默认设置进行大量自定义,您可能更喜欢Buildroot或Yocto。桌面发行版设计嵌入式Linux系统的常用方法是从桌面发行版(如Debian或RedHat)开始,然后删除不需要的组件,直到安装的映像适合目标设备的占用空间。这是RaspberryPi平台流行的Raspbian发行版的方法。优点这种方法的主要优点是熟悉。通常,嵌入式Linux开发人员也是桌面Linux用户,并且精通他们选择的发行版。在目标上使用类似的环境可能会让开发人员更快上手。根据选择的发行版,可以使用标准打包工具(如apt和yum)安装许多其他工具。您可以将显示器和键盘连接到目标设备,并直接在那里进行所有开发。对于刚接触嵌入式领域的开发人员来说,这可能是一个更熟悉的环境,无需复杂的跨开发平台设置即可配置和使用。大多数桌面发行版可用的软件包数量通常大于前面讨论的特定于嵌入式的构建器可用的软件包数量。由于更大的用户群和更广泛的用例,您可能能够找到您的应用程序所需的所有运行时包,这些包已经构建并可以使用。缺点使用目标平台作为您的主要开发环境可能会很慢。运行编译器工具是一项资源密集型操作,根据您构建的代码量,这可能会严重影响您的性能。除了一些例外,桌面发行版不是为低资源系统设计的,并且可能难以充分裁剪目标图像。同样,桌面环境中的预设工作流程对于大多数嵌入式设计来说并不理想。以这种方式获得可重现的环境是困难的。手动添加和删除包很容易出错。这可以使用特定于发行版的工具编写脚本,例如基于Debian的系统上的debootstrap。为了进一步提高可重复性,您可以使用配置管理工具,例如CFEngine(我的雇主Mender.io已完全披露)。但是,您仍然受发行商的摆布,他们会更新软件包以满足他们的需求,而不是您的需求。建议您对计划投放市场的产品谨慎使用此方法。这是爱好者应用程序的一个很好的模型;但是,对于需要支持的产品,这种方法很可能会遇到麻烦。虽然您可以更快地开始,但从长远来看,这可能会花费您的时间和精力。其他注意事项本次讨论的重点是构建系统的功能,但通常还有一些非功能性需求可能会影响您的决定。如果您已经选择了片上系统(SoC)或电路板,您的选择很可能由供应商决定。如果您的供应商为特定系统提供板级支持包(BSP),使用它通常会为您节省大量时间,但要研究BSP的质量以避免在开发周期后期出现问题。如果您的预算允许,您可能需要考虑为您的目标操作系统使用商业供应商。有些公司为这里讨论的许多选项提供经过验证和支持的配置,除非您具有构建嵌入式Linux系统的专业知识,否则这是一个不错的选择,可以让您专注于您的核心竞争力。或者,您可以考虑为您的开发人员提供商业培训。这可能比商业操作系统供应商便宜,并且可以让您更加自给自足。快速找到所选构建系统的基础知识是一个学习曲线。***,您可能已经有一些使用一个或多个系统的开发人员经验。如果您的工程师愿意,那么在您做出决定时绝对值得考虑。总结构建嵌入式Linux系统有多种选择,各有优缺点。确定这部分设计的优先级至关重要,因为在此过程的后期切换系统的成本可能非常高。除了这些选项之外,还有正在开发中的新系统。希望本次讨论将为评估新系统(以及此处提到的系统)提供一些背景信息,并帮助您为下一个项目做出可靠的决策。