传统上,在选择用于部署Linux的发行版时,面临着很多麻烦。
什么是Linux发行版(Linux Distribution)?
Linux是一个操作系统:该程序是控制计算机的核心。它决定如何在争夺它的所有其他程序之间划分可用资源(CPU,内存,磁盘,网络)。操作系统虽然非常重要,但它本身并没有用。其目的是管理其他程序的计算资源。没有这些其他程序,操作系统就无法实现很多目的。
这就是发行版的来源。发行版提供了许多其他程序,这些程序与Linux一起可以组装到工作集中用于多种用途。这些程序的范围从基本的程序编写工具(例如编译器和链接器,到通信库,再到电子表格和编辑器),到介于两者之间的几乎所有内容。发行版往往具有每个计算机或解决方案实际使用的超集。它还为用户或公司可以组合成他们认为是工作集的每种软件组件类别提供了许多选择。可以粗略地比喻为一家超市,在超市中货架上有很多物品可供选择,每个用户都可以从购物车中选择对他们有意义的物品。
基于二进制的分发还是基于源的分发?
分发可以大致分为两类:基于二进制的和基于源的。
基于二进制的发行版提供了所有已经预编译并准备安装的软件组件。这些组件使用“足够好”的构建选项进行编译,这些选项对于大多数用户来说都可以正常工作。它们也确实为少数需要或想要编译自己的组件的用户提供了这些组件的资源。Debian,Fedora Core,OpenSUSE,Ubuntu和其他许多版本都体现了这种发行方式。尽管它们提供相同类型的系统,但它们都使用不同的方法(不幸的是,不兼容)来这样做。它们是服务器,台式机和笔记本电脑等通用计算机中使用的主要分发方式。
另一方面,基于源代码的发行版侧重于提供一个框架,在这个框架中,最终用户可以从源代码构建所有组件。这些发行版还提供了一些工具,可以方便地选择组件的合理起始集合,并根据需要调整每个组件的构建。这些调整可以简单到添加编译标志以使用不同版本的源或以某种方式修改源。用户将组装一个他们想要构建的菜单,然后开始构建。几分钟或几小时后,视情况而定,他们将得到一个系统软件,可以用于他们的计算机。这种发行版的例子有Gentoo、Android和Yocto。
通常,这些基于源的发行版通常对于嵌入式基于Linux的设备尤其是IoT设备是首选。 尽管它们难以设置和维护,但基于源的发行版具有独特的优势,即能够根据实际的目标硬件定制已安装的映像,以最大程度地利用资源或最大程度地减少资源浪费。 对于嵌入式设备而言,这往往是一个强大的约束。 此外,基于源代码的发行版更适合交叉构建(在该平台上,构建平台的计算机与在其上运行的计算机不同),而基于二进制的发行版则更适合于自托管构建。 您在同一台机器(或同一体系结构)上构建并运行。
鉴于当今普遍存在使用英特尔架构机器作为构建机器以及将ARM体系结构用于IoT产品的情况,跨构建支持对于IoT设备至关重要。
以容器为中心的发行版
传统的Linux方法只提供内核外部所有平台的单个统一用户空间。新模型是关于将用户空间组成一个“容器(containers)”的集合。容器化模型将用户空间的一部分转换为组件的联合集合,每个组件之间具有高度独立性。
容器化的linux发行版带来了许多好处,从允许团队更加独立地工作到使进行细粒度平台升级成为可能。缺点是它们比非容器化解决方案占用的空间更大。然而,如果说技术的发展给我们带来了什么启示的话,那就是当一项新技术的唯一缺点是它的占用空间时,其可用资源往往会扩大,从而使每一代新问题都变得越来越小。
下面将介绍一些早期的选项,以便与现有的发行版进行比较。
物联网的Linux发行版
现在,我们必须深入探讨有争议的领域。许多人拥有自己喜欢的Linux发行版,即使他们的需求发生了巨大变化(例如,从服务器设置更改为嵌入式IoT设备),他们仍然坚持使用该发行版。
我将在下面的列表中开始介绍:这是一些成熟的Linux发行版和一些后起之秀的示例。还有许多其他的存在,可能更适合一些用例。
Yocto
Yocto(https://www.yoctoproject.org/)是基于源的发行版,已在许多嵌入式和IoT设备中使用。它试图将基于二进制的发行版的好处(例如,将程序包及其依赖项明确分离)与基于源的发行版的好处结合在一起,后者使您可以在进行较小的更改时以显著的方式更改目标二进制文件。
Yocto由一系列配方(recipes)组成,每个配方都描述了如何构建系统的一个模块(例如,库,守护程序,应用程序等)。然后将这些配方收集到各层中,这些层收集一系列配方并配置应如何一起使用的各个方面,从编译标志到配方功能,再到有关它们如何显示在目标上的详细信息。每个目标构建都将由这些层中的一些层组成,每个层都在较低层中添加或删除软件包,或修改其默认行为。这允许多方调整他们自己的二进制映像以影响最终软件。 因此,如果基础层使用保守的一组编译器标志(通常这样做),则芯片供应商可以添加对其特定芯片模型有利的编译器标志,而主板供应商可以删除其主板可能不支持的芯片功能。
对于您的物联网产品,这实际上意味着您使用已经支持Yocto的主板来构建解决方案的努力将是添加或修改配方,以提供基本功能的增值。您还需要具有一个构建和配置管理基础结构设置,该设置允许您为目标创建映像,尽管在当今的容器世界中,这并不难做。
关于Yocto的更多信息,请从这里(https://www.yoctoproject.org/docs/2.5/overview-manual/overview-manual.html)开始。同样值得一提的是,在你考虑的物联网解决方案中,Yocto在任何开发板上的支持程度如何。
Debian
Debian(https://www.debian.org/)是一种古老的开源二进制发行版。它既是自身的发行版,也是其他知名衍生版本的基准,其中最著名的是Ubuntu(https://www.ubuntu.com/)。
Debian拥有大量为ARM(IoT的首选体系结构)预先构建的软件包,但考虑到Debian在英特尔生态系统中的优势,这些软件包对ARM二进制文件的支持和维护水平往往远低于英特尔的同类产品。因此,诸如“10000多个构建的包”这样的指标并没有那么有意义。您需要了解对您很重要的包以及它们的支持程度。
在自托管设置(例如Debian)中使用的许多发行版的一个缺点是,开发人员不理解或不记得包的安装可能不会在最终运行包的计算机上完成,因此他们不能依赖目标可用的任何功能。考虑到这种麻烦对于docker环境来说也是一个头疼的问题,发行版在清理这些依赖关系方面花费了大量精力,所以这是一个比以前更小的问题。
为少量软件包设置构建环境的工作相当琐碎,但是为系统构建所有软件包的基础架构可能会变得很重要。
由于这些原因,IoT的Debian是一个不错的选择,在这种情况下,您只需添加或创建一些软件包即可完成您的平台。
EdgeX Foundry
从严格意义上讲,EdgeX Foundry并不完全是一个发行版,因为它对发行版的BSP组件没有任何意见。BSP是包含Linux内核本身,设备驱动程序和用于启用硬件平台的库的部分。它从一个更高的级别开始,需要一个以docker支持为基础的可运行Linux系统。从那里开始,它提供了各种各样的容器,这些容器为IoT设备(尤其是边缘设备)提供了丰富的中间件和垂直集(在docker看来,容器是一个独立的模块,通常提供垂直功能,例如数据库或几乎不依赖主机操作系统、库等的网络服务)。
29-1.jpg](https://ucc.alicdn.com/pic/developer-ecology/96bfe1d338f14cde93d91e4d05ab739a.jpg)
EdgeX Foundry背后的概念为大型IoT设备(尤其是边缘设备)指明了前进的方向,但是要定义更受约束的版本以提供一组良好的基准服务仍有待完成。在这方面已经取得了一些进展,一些服务已从JVM迁移到基于golang的实现,但是在不久的将来,对于基于低端和中端Linux的IoT来说,其覆盖范围仍然遥不可及。
Foundries.io Microplatform
Foundries.io使用基于Yocto的方法创建了一个Linux平台,以创建板支撑层,然后在其之上分层一组容器化的微服务。与EdgeX Foundry方法相比,它们的容器集更小,更适中,而且占用可见更小。
虽然可以通过订阅完全访问Foundries.io产品并进行自动更新和管理,但底层平台是开源的,并且是可用的。
小结
基于Linux的IoT正在从传统的嵌入式模型开始迁移,在传统的嵌入式模型中,将完整的垂直解决方案从单个团队/worldwiew/toolchain/model创建到更灵活的模型,其中固件,电路板,中间件和应用程序组件的分离程度更高。 但是,这种迁移并非没有代价,并且对CPU,内存和磁盘的要求也更高。 为了为您的下一个物联网项目选择Linux基准,您需要考虑您可以负担的占用空间和产品寿命。体积更小,更换速度更快的产品最好与Yocto等当今久经考验的真正解决方案保持一致。能够提供更多资源并需要将新功能部署到已部署产品中的产品应考虑使用更主流的Linux发行版和以容器为中心的新解决方案作为前进的道路。